JWT 与令牌设计

以紧凑的 JSON 结构承载声明并附带签名;服务端无状态校验友好,但撤销困难,需要短有效期加刷新令牌、密钥轮换与时钟偏差容忍策略配合。

JWT 是什么

JWT 以紧凑的 JSON 结构承载声明并附带签名,服务端可以无状态校验而无需查库,适合跨服务传递身份与授权信息。代价是撤销困难:令牌一旦签发,在有效期内始终有效,因此设计重点是短有效期配合刷新令牌,并做好密钥轮换。

常见攻击面

算法混淆攻击利用服务端信任令牌头部自报的算法,攻击者把算法改成无签名或换成对称算法来绕过验证,因此服务端必须固定算法白名单。另一个常见误解是认为 payload 被加密了:它只做了编码,任何人都能解码读取,不能放敏感信息。

基本信息

结构头部、载荷与签名三段,声明含主体、过期、受众与作用域
校验算法白名单、签名、受众、过期与生效时间
撤销短有效期加刷新令牌;必要时引入吊销列表
密钥支持轮换,验证时应同时接受新旧公钥

服务端校验清单

服务端校验清单
1. 算法白名单(拒绝空算法与算法混淆)
2. 验签:使用签发方公钥或共享密钥
3. 时间:过期、生效与签发时间,外加时钟偏差容忍
4. 受众:受众与签发方匹配当前服务
5. 授权:作用域与角色校验通过后再放行
# 顺序固定,任何一步失败立即拒绝

典型使用场景

  • 无状态接口鉴权:服务不查库即可完成校验
  • 移动端登录凭据:短有效期减少泄露影响
  • 服务间身份传递:内网调用携带签名令牌
  • 短期一次性令牌:用于下载、回调与密码重置链接
  • 边缘校验:在网关或 CDN 侧提前拒绝无效请求

有效期与刷新怎么定

访问令牌的有效期通常取分钟级,把泄露窗口压到可接受范围;刷新令牌有效期较长,需要绑定客户端并支持单次使用与失效轮换,一旦发现被重复使用就吊销整条链路。长有效期令牌虽然省去刷新逻辑,却让泄露后的止损窗口从几分钟扩大到数天,代价通常不划算。

禁用无签名算法并防范算法混淆攻击;密钥与签发者信息要集中管理,避免各服务各自解析令牌头部自报的算法。

易错点

  • 把敏感信息放进载荷,令牌内容可被任意解码读取
  • 仅靠长期有效令牌,泄露后无法在有效期内及时止损
  • 信任令牌头部自报的算法,遭遇算法混淆攻击
  • 多服务各自缓存公钥且无刷新机制,密钥轮换后校验大面积失败

数据来源与参考

  • RFC 7519:JWT
  • RFC 8725:JWT Best Current Practices
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌