现在很多人使用 JWT 用作 session 管理,这是个糟糕的做法,下面阐述原因,有不同意见的同学欢迎讨论。
首先说明一下,JWT 有两种:
-
无状态的 JWT,token 中包含 session 数据。
-
有状态的 JWT,token 中仅有 session ID,session 数据还是存储在服务端。
本文讨论的是 “无状态的 JWT”,就是把用户的 session 数据放到 token 中。
JWT 不适合做为 session 机制,这么做是有危险的。
很多人喜欢比较 “cookies vs. JWT”,这种比较是无意义的,就像比较苹果和桔子,cookies 是一个存储机制,而 JWT 是加密签名的 token,他们不是对立的,可以一起使用,或者独立使用。
正确的比较是“sessions vs. JWT” 和 “cookies vs. Local Storage”。
JWT 宣称的优点
人们通常会说 JWT 有如下的好处:
- 易于水平扩展
- 简单易用
- 加密,更安全
- 内置过期功能
- 可以防护 CSRF 攻击
- 在用户阻止了cookies后还可以工作
对于这些所谓的好处我们会一一剖析。
(1)易于水平扩展
把 sess