Json web token vs session id

0x00 前言

JWT是现代web中常见的持续认证手段,也是针对http无状态的其中一个认证的解决方案,今日特地看了写JWT和传统的session id方案作比较的文章

0x01 Json Web Token

JWT是开发的标准,主要的特点是简洁,自包含。通过数字签名确保信息的完整性,真实性

JWT的结构

主要包括三大块:header, payload and signature。

详细的信息主要参考官方说明:

https://jwt.io/introduction/

JWT的认证过程

当然登录应用成功后,应用会返回一个JWT给用户保存,用户后续的请求都会带上这个JWT作为token取得授权的资源。常见的JWT会以以下的请求头部出现:

Authorization: Bearer <token>

具体的认证过程如下:

JWT认证图

0x02 与传统session id的比较

  • 在扩展性上,JWT的扩展性比session更加好,毕竟session需要存储在服务器,如果需要做服务器迁移或者扩展,JWT的基于token认证的无状态显示出了优势。
  • 在安全性上,本人感觉JWT没有比session更加有优势,JWT使用了数字签名确保了数据的完整性和防篡改,但还是要存储在用户本地,这样和普通cookie一样会受到XSS攻击的威胁,有被盗取的风险。而却JWT对于防CSRF也是显得力不从心的,特别在攻击者诱骗授权用户点击操作的场景,还是需要CSRF token。在重放攻击(replay attack)中,JWT也是不能防止这类攻击的。
  • 在 RESTful API Services 上,JWT简直是为这个而生,无状态的最佳实现,再配合(CORS)进行跨越,这样调用API就更加方便了

0x03 JWT已知漏洞

  • NONE hashing algorithm :某些JWT库对token的验证出现了bug,详细资料参考以下链接:

https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/

参考链接:

https://ponyfoo.com/articles/json-web-tokens-vs-session-cookies

https://github.com/teesloane/Auth-Boss

https://www.owasp.org/index.php/JSON_Web_Token_(JWT)_Cheat_Sheet_for_Java#Issues