开发者生态
evening
停止使用 JWT
2026-06-16
1 阅读
dzonga
停止使用 JWT! 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(系列)规范的问题。反驳 但是 Google 使用 JWT! Google 不会在浏览器中使用 JWT 进行用户会话。他们使用常规的 cookie 会话。 JWT 纯粹用作单点登录传输,以便您在一台服务器或主机上的登录会话可以转移到另一台服务器或主机上的会话。这属于 JWT 的合理用例,并且 Google 拥有资源(安全专家)来创建和维护更安全的 JWT 实现。他们的 JWT 实际上与其他人的不同。但无国籍更好!如果没有大量资源,您就无法安全地进行真正的无状态身份验证,请参阅上面的 crypto.net 链接。另外,无状态是一个谎言。我不知道如何设置会话!您不会经常看到解释会话的文章,因为该技术并不是特别新。您也不应该需要第三方信息来进行设置。会话实现的文档应该引导您自行完成设置过程。几乎所有 Web 服务器框架都会包含会话的实现,并且如果默认情况下未启用它,通常很容易启用它。 Express 和其他 Node.js 框架在某种程度上是这条规则的例外,主要是因为它们是高度模块化且单一用途的。对于 Express,您只需使用 express-session 中间件和适用于您的商店的商店连接器(我推荐 connect-session-knex ,与 Postgres、MySQL 或可能的 SQLite 一起使用)。短期令牌 如果您确实需要一个短期的、签名的令牌来进行某些操作,有一个更好的规范,称为 PASETO,它的设计是安全的。只要确保您没有将它们用于会话即可。会话如何工作 我建议您查看 joepie91 的要点以了解会话如何工作的更多信息。