返回

文章详情

停止使用 JWT

Hacker News2026年6月16日 16:49

TLDR: JWT 不应该用于保持用户登录。它们并不是为此目的而设计的,安全性不足,还有更好的工具专为此设计:常规的 cookie 会话。如果你有时间观看相关的演示,我强烈推荐这个演讲: https://www.youtube.com/watch?v=pYeekwv3vC4 (注意,视频中其他主题如 CSRF 保护大多被略过。你应该从其他来源学习其他主题。另外,请注意视频结束时提到的 JWT 的 "有效" 用例也可以轻松通过其他更好、更安全的工具处理。具体来说,即 PASETO。)相关主题:不要使用 localStorage(或 sessionStorage)存储身份验证凭据,包括 JWT 令牌:https://www.rdegges.com/2018/please-stop-using-local-storage/ 避免使用 JWT 的原因可以归结为几点:JWT 规范专门设计用于非常短暂的令牌(约 5 分钟或更少)。会话需要比这更长的生命周期。“无状态”的身份验证在安全方面根本不可行。你必须有一定的状态来安全地处理令牌,如果必须有数据存储,最好的办法是存储所有的数据。本文及其链接的后续内容描述了具体问题:http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/ (是的,人们在这样做,是的,他们的应用存在缺陷,你不应该重复这个错误。)仅存储简单会话令牌的 JWT 效率低且灵活性不如常规会话 cookie,且并未给你带来任何优势。JWT 规范本身不被安全专家信任。这应该排除它们在任何与安全和身份验证相关的事宜上的使用。原始规范特别允许创建虚假令牌,并可能包含其他错误。本文深入探讨了 JWT(家族)规范的问题。 反驳 但谷歌使用 JWT!谷歌并没有在浏览器中为用户会话使用 JWT。它们使用常规的 cookie 会话。JWT 仅用作单点登录传输,以便你在一个服务器或主机上的登录会话可以转移到另一个服务器或主机上的会话。这是在 JWT 的合理用例范围内,谷歌拥有创建和维护更安全的 JWT 实现的资源(安全专家)。他们的 JWT 实际上与其他任何人的并不相同。但无状态更好!没有庞大的资源,你无法安全地实现真正的无状态身份验证,请参见上述 cryto.net 链接。此外,无状态是一种谎言。 我不知道如何设置会话!你并不会经常看到解释会话的文章,因为该技术并不是特别新。你也不应该需要第三方信息来进行设置。会话实施的文档应该能单独引导你完成设置过程。几乎任何 Web 服务器框架都将包含会话的实现,通常如果未默认启用,则启用起来也很简单。Express 和其他 Node.js 框架在这方面有点例外,主要是因为它们高度模块化且单一目的。对于 Express,你只需使用 express-session 中间件和与存储匹配的存储连接器(我推荐 connect-session-knex,与 Postgres、MySQL 或可能的 SQLite 一起使用)。 短期令牌 如果你确实需要短期的签名令牌,有一个名为 PASETO 的更好规范,旨在安全。确保你没有将其用于会话。 如何工作会话 我推荐查看 joepie91 的这个 gist,以了解更多关于会话的工作原理。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡