知识卡片

JWT用签名取代服务端状态解决分布式认证问题及其代价

普通读书笔记卡

内容

[[Cookie-Session服务端状态管理面临集群水平扩展的CAP三选一]]的根源是状态 存在服务端;JWT反其道而行,把状态搬到客户端——令牌本身就是携带信息的 JSON,分头/负载/签名三段,用密钥对头和负载做哈希摘要(如HMAC SHA256) 产出签名,只要签名验证通过就能确信负载内容没被篡改,服务端因此不需要 保留任何一点状态就能验证请求者的身份和权限,天然具备任意加入或移除服务 节点的水平扩缩能力。但JWT不是Cookie-Session的全面升级,而是针对”认证 授权、顺带携带少量非敏感信息”这个窄场景的替代品,代价相当明显:令牌 一旦签发很难主动失效(要实现”只能单设备登录”这类需求,必须额外维护一份 黑名单,这又让服务退化成有状态服务);比Cookie-Session更容易受重放攻击 (因为服务端不再握有主动的状态控制权,真要防重放建议在信道层面即启用 HTTPS解决,而不是在令牌逻辑上加补丁);能携带的数据量有限(受Header 长度限制,Tomcat上限8KB、Nginx默认4KB);客户端存储位置本身也有泄漏 风险。这些代价印证了作者反复强调的一点:状态存哪里从来不是纯技术偏好, 而是针对具体场景的取舍,”完全无状态”也不总是好事——比如做在线用户实时 统计这类需求,纯JWT方案根本无从下手。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第5章"架构安全性" 5.3.2节"JWT"(源文件:_epub-src对应OEBPS/Text/chapter65.xhtml) - 结论依据:原文说明JWT用签名保障负载不可篡改、服务端无须保留状态即可 水平扩缩,同时列举令牌难以主动失效、更易受重放攻击、携带数据量有限、 客户端存储风险、无状态不总是好等具体缺陷,直接支撑本卡片结论。 - 原始内容:JWT令牌是多方系统中一种优秀的凭证载体,它不需要任何一个 服务节点保留任何一点状态信息……令牌难以主动失效……相对更容易遭受重放 攻击……只能携带相当有限的数据……无状态也不总是好的。