JSON Web Token (JWT)
字数 956 2025-11-16 02:47:29

JSON Web Token (JWT)

1. 基础概念
JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全传输信息。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),最终组合成一个字符串,形式为 xxxxx.yyyyy.zzzzz

2. 结构解析

  • 头部:声明令牌类型(如JWT)和签名算法(如HMAC SHA256)。示例:
    { "alg": "HS256", "typ": "JWT" }
    
    该部分会经过Base64Url编码形成第一段。
  • 载荷:包含需要传递的声明(数据),例如用户ID、过期时间等。分为三类声明:
    • 注册声明(标准字段,如 exp 过期时间)
    • 公共声明(自定义字段,需避免冲突)
    • 私有声明(双方协定的数据)
      示例:
    { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
    
    同样经过Base64Url编码后形成第二段。
  • 签名:将编码后的头部和载荷用指定算法(如HMAC-SHA256)加密,确保数据未被篡改。公式为:
    HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
    

3. 工作流程

  1. 生成JWT:服务器验证用户身份后,使用密钥生成JWT并返回给客户端。
  2. 客户端存储:客户端(如浏览器)将JWT保存在本地(通常为LocalStorage或Cookie)。
  3. 发送JWT:客户端在后续请求的Authorization头中携带JWT(格式:Bearer <token>)。
  4. 验证JWT:服务器验证签名有效性并解析载荷数据,无需查询数据库即可确认用户身份。

4. 安全特性与风险

  • 无状态性:服务端无需存储会话信息,但令牌一旦签发,在过期前无法主动撤销。
  • 防篡改:签名确保数据完整性,但载荷内容默认不加密(仅Base64编码),敏感信息需自行加密。
  • 常见风险
    • 令牌泄露导致被盗用(需配合HTTPS传输)
    • CSRF攻击(若存储于Cookie需设置SameSite属性)
    • XSS攻击(避免LocalStorage存储时暴露给恶意脚本)

5. 适用场景

  • 分布式系统的单点登录(SSO)
  • API身份验证(如RESTful接口)
  • 服务间信息传递(需确保密钥安全)

6. 扩展对比

  • 与Session-Cookie对比:JWT减少服务端存储开销,但令牌体积更大。
  • 与OAuth 2.0关系:JWT常用作OAuth 2.0的访问令牌(Access Token)格式。
JSON Web Token (JWT) 1. 基础概念 JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全传输信息。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),最终组合成一个字符串,形式为 xxxxx.yyyyy.zzzzz 。 2. 结构解析 头部 :声明令牌类型(如JWT)和签名算法(如HMAC SHA256)。示例: 该部分会经过Base64Url编码形成第一段。 载荷 :包含需要传递的声明(数据),例如用户ID、过期时间等。分为三类声明: 注册声明(标准字段,如 exp 过期时间) 公共声明(自定义字段,需避免冲突) 私有声明(双方协定的数据) 示例: 同样经过Base64Url编码后形成第二段。 签名 :将编码后的头部和载荷用指定算法(如HMAC-SHA256)加密,确保数据未被篡改。公式为: 3. 工作流程 生成JWT :服务器验证用户身份后,使用密钥生成JWT并返回给客户端。 客户端存储 :客户端(如浏览器)将JWT保存在本地(通常为LocalStorage或Cookie)。 发送JWT :客户端在后续请求的 Authorization 头中携带JWT(格式: Bearer <token> )。 验证JWT :服务器验证签名有效性并解析载荷数据,无需查询数据库即可确认用户身份。 4. 安全特性与风险 无状态性 :服务端无需存储会话信息,但令牌一旦签发,在过期前无法主动撤销。 防篡改 :签名确保数据完整性,但载荷内容 默认不加密 (仅Base64编码),敏感信息需自行加密。 常见风险 : 令牌泄露导致被盗用(需配合HTTPS传输) CSRF攻击(若存储于Cookie需设置SameSite属性) XSS攻击(避免LocalStorage存储时暴露给恶意脚本) 5. 适用场景 分布式系统的单点登录(SSO) API身份验证(如RESTful接口) 服务间信息传递(需确保密钥安全) 6. 扩展对比 与Session-Cookie对比:JWT减少服务端存储开销,但令牌体积更大。 与OAuth 2.0关系:JWT常用作OAuth 2.0的访问令牌(Access Token)格式。