JWTJSON Web Token)是一种紧凑的声明格式,用 Base64URL 编码 JSON 头部和载荷,并通常用 数字签名 保护其来源和完整性。

核心问题

分布式系统常需要把“谁、何时、对谁、有什么声明”放进一个可传递、可验证、无需每次查数据库的凭据里。JWT 提供了标准字段结构和编码方式,常用于 ID Token、访问令牌和临时凭据。

核心机制

常见签名型 JWT 由三段组成:

base64url(header).base64url(payload).base64url(signature)
部分作用
header声明 token 类型、签名算法、密钥 ID,例如 algkid
payload声明集合,例如 subissaudexp
signature对前两段字节做签名或 MAC 的结果

签名输入不是 JSON 对象本身,而是前两段编码后的字节串:

signing_input = base64url(header) + "." + base64url(payload)
signature = Sign(key, signing_input)

因此改变空格、字段、算法或任一字符都会导致签名不匹配。Base64URL 只是编码,不是加密;任何拿到 token 的人都能读到未加密载荷。

工程用途

  • OIDC ID Token 表达用户身份。
  • API access token 表达调用方、scope 和有效期。
  • 微服务之间传递短期、可验签的调用上下文。
  • 离线授权或临时凭据中携带有限声明。

边界与常见坑

  • JWT 不自动保密:敏感数据不要放进未加密 JWT。
  • 不能信任 alg 的任意输入:服务端必须配置允许算法,防止 none 或算法混淆。
  • 必须检查业务声明:验签成功后还要检查 issaudexp、权限和撤销状态。
  • 密钥轮换要处理 kid:未知 kid、缓存过期和 JWKS 更新都要有明确策略。
  • 长有效期风险高:一旦泄露,JWT 在过期前可能被重放,除非另有撤销机制。

相关术语