⚡ News

拒绝盲从:为什么 JWT 是一个坑,你的应用可能并不需要它

拒绝盲从:为什么 JWT 是一个坑,你的应用可能并不需要它

我已经厌倦了假装 JWT 没问题。它根本不是什么万能药,而是一种盲目崇拜(Cargo Cult)。它试图解决一个你的应用几乎不存在的问题,却制造了四五个你绝对会遇到的新麻烦。整整一代后端开发者被洗脑了,仅仅因为 2014 年的某篇博客将“无状态”描述为一种美德,而非一种权衡。无论是作者亲自处理过的 Laravel 项目还是各种安全审计,JWT 系统普遍存在撤销逻辑失效、无用的刷新令牌机制,以及客户端盲目信任 Payload 却不校验的问题。

如果你正在构建 Web 应用、移动端应用或第一方 API,JWT 是错误的默认选择。在 Postgres 数据库中存一行数据并配合 Bearer Token 验证,不仅更快、更简单,而且严格意义上更安全。JWT 由三个 base64url 段组成:Header(头部)、JSON Payload(负载)和 Signature(签名)。签名通常是 HMAC 或 RSA/ECDSA。其核心卖点在于:服务器签名,客户端携带,后续请求仅需验证签名而无需查库。这就是所谓的“无状态身份验证”,也是它唯一的价值主张。一旦剥离这个属性,JWT 就只是一个穿了戏服的不透明 Token。

然而,问题的核心在于:你根本无法在过期前废弃(Invalidate)一个 JWT。除非你在服务器端维护一个撤销列表(JTI 列表)并每次请求都去查库,但这恰恰就是 JWT 想要帮你省去的数据库查询。至此,你只是以更烂的方式重新发明了 Session。开发者通常面临两种糟糕的选择:要么不废弃,导致被盗令牌在有效期内(甚至长达数年)持续有效;要么维护撤销列表,在承担 JWT 复杂性的同时,依然要支付 Session 的查询成本。除此之外,没有第三种选择,而刷新令牌(Refresh Tokens)的出现本质上就是对这种设计失败的坦白。

↗ 阅读原文