文章摘要
这篇文章建议停止使用JWT(JSON Web Tokens),指出JWT存在安全风险且不如传统会话令牌实用,认为大多数情况下使用简单的会话令牌是更好的选择。
文章总结
停止使用JWT进行用户会话管理
核心观点
JWT(JSON Web Tokens)不应该用于保持用户登录状态,主要原因包括: - JWT规范设计仅适用于极短期的令牌(5分钟或更短),而用户会话需要更长的生命周期 - 真正的"无状态"认证在安全上不可行,必须维护某些状态来安全处理令牌 - JWT规范本身存在安全缺陷,不被安全专家信任
推荐替代方案
常规Cookie会话是更好的选择: - 专门为会话管理设计 - 更安全可靠 - 几乎所有Web服务器框架都内置支持
常见反驳与回应
"但Google使用JWT!"
Google仅将JWT用于单点登录传输,用户浏览器会话仍使用常规Cookie。"无状态更好!"
真正安全的无状态认证需要大量资源,且"无状态是个谎言"。"不知道如何设置会话!"
大多数Web框架都有现成的会话实现,如Express可使用express-session中间件。
短期令牌替代方案
如需短期签名令牌,推荐使用PASETO规范,但同样不应用于会话管理。
技术细节
- JWT规范存在设计缺陷,可能允许伪造令牌
- 存储在localStorage中的JWT令牌也不安全
- 会话可以跨服务器共享(通过共享数据库)
- 不同主机间的服务可使用一次性令牌进行认证转移
历史背景
JWT的流行源于: 1. 工程师对新技术过度热情 2. 大量误解性博客文章的传播 3. 编程培训班将JWT纳入课程,进一步传播误解
结论
Cookie是经过时间验证的技术,在安全性方面,历史悠久且未被攻破的技术通常比新出现、未经充分验证的技术更可靠。对于大多数Web应用,根本不需要也不应该使用JWT。
特别提示:如需短期签名令牌,应考虑使用PASETO而非JWT。
评论总结
根据评论内容,总结主要观点如下:
反对使用JWT的观点(主要针对浏览器会话): - 近期FIFA被黑事件提醒应停止使用JWT(评论1) - JWT无法单独撤销,需额外复杂基础设施(评论6) - "individual stateless JWT tokens cannot be invalidated...you cannot 'kill' a session without building complex infrastructure" - 会话cookie是更简单安全的方案(评论18) - "I couldn't understand why session cookies weren't the better, simpler solution"
支持使用JWT的观点: - 适用于服务间通信,非浏览器会话场景(评论2) - "Plenty of good uses for JWTs for service-to-service communication" - 可通过短生命周期+刷新机制解决安全问题(评论4) - "Nothing is stopping you from limiting the JWT lifetime and having a refresh model" - 撤销列表方案可行,且存储成本低于会话列表(评论14) - "you only need to maintain a revocation list for tokens not expired yet...the storage cost of that statefulness is higher"(指会话方案)
中立/技术性讨论: - 安全取决于实现而非标准本身(评论3、15) - "The JWT specification itself is not trusted by security experts...This feels like it needs more evidence"(评论3) - "They are secure if they fit your risk profile, a blanket statement like this is just disinformation"(评论15) - 建议使用PASETO等替代方案,但生态支持不足(评论11) - "PASETO is great but there's not enough ecosystem support"
总结:争议核心在于JWT是否适合浏览器会话管理。反对者强调无法撤销的缺陷,支持者提出短生命周期+刷新/撤销列表的解决方案。多数评论认可JWT在服务间通信中的价值,但对其在浏览器会话中的安全性存在分歧。