JWT(JSON Web Token)
字数 1652 2025-08-11 08:36:09

JSON Web Token (JWT) 全面解析

1. JWT 概述

JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全传递声明信息。它是一种紧凑的、URL安全的表示方式,用于在双方之间传输信息。

2. JWT 结构组成

JWT 由三部分组成,用点号(.)分隔:

Header.Payload.Signature

2.1 Header (头部)

Header 是一个 JSON 对象,描述 JWT 的元数据,通常包含两个属性:

{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg:签名算法 (algorithm),默认是 HMAC SHA256 (写成 HS256)
  • typ:令牌类型 (type),固定为 "JWT"

Header 会使用 Base64URL 算法进行编码。

2.2 Payload (负载)

Payload 也是一个 JSON 对象,存放实际需要传递的数据。JWT 规定了7个官方字段(可选):

  1. iss (issuer):签发人
  2. exp (expiration time):过期时间
  3. sub (subject):主题
  4. aud (audience):受众
  5. nbf (Not Before):生效时间
  6. iat (Issued At):签发时间
  7. jti (JWT ID):编号

示例:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

重要注意事项

  • JWT 默认是不加密的,任何人都可以读取 Payload 内容
  • 不要将敏感信息放在 Payload 中
  • Payload 同样使用 Base64URL 算法编码

2.3 Signature (签名)

Signature 部分是对前两部分的签名,防止数据篡改。生成方式:

  1. 指定一个密钥 (secret),仅服务器知道
  2. 使用 Header 中指定的签名算法 (默认 HMAC SHA256)
  3. 计算公式:
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

3. Base64URL 编码

Base64URL 是 Base64 的变种,主要区别:

  • + 替换为 -
  • / 替换为 _
  • = 被省略

这些修改是为了避免 URL 中的特殊字符问题。

4. JWT 使用方式

客户端收到 JWT 后,可以存储在:

  1. Cookie 中(自动发送,但不能跨域)
  2. localStorage 中

推荐的使用方式是在 HTTP 请求头中添加 Authorization 字段:

Authorization: Bearer <token>

跨域时,也可以将 JWT 放在 POST 请求的数据体中。

5. JWT 特点

  1. 加密性

    • 默认不加密,但可以加密(生成原始 Token 后可用密钥再加密)
    • 不加密时不能存放敏感信息
  2. 用途

    • 可用于认证
    • 可用于信息交换
    • 可减少服务器查询数据库次数
  3. 缺点

    • 服务器不保存 session 状态
    • 无法在使用过程中废止某个 token
    • 无法更改 token 的权限
    • 一旦签发,在到期前始终有效(除非部署额外逻辑)
  4. 安全性

    • 一旦泄露,任何人都可获得所有权限
    • 有效期应设置较短
    • 重要权限应再次认证用户
    • 不应使用 HTTP 明码传输,应使用 HTTPS

6. 安全最佳实践

  1. 使用强加密算法(如 HS256 或 RS256)
  2. 设置合理的短有效期
  3. 使用 HTTPS 传输
  4. 不要在 Payload 中存储敏感信息
  5. 考虑实现 token 刷新机制
  6. 对于重要操作,实施二次验证

7. JWT 工作流程

  1. 用户登录,服务器验证凭证
  2. 服务器生成 JWT 并返回给客户端
  3. 客户端存储 JWT(通常在 localStorage 或 sessionStorage)
  4. 客户端在后续请求中携带 JWT(通常在 Authorization 头)
  5. 服务器验证 JWT 并处理请求
  6. 如果 JWT 过期,客户端需要重新获取新的 JWT

8. 适用场景

  1. 无状态认证
  2. 跨域认证
  3. 单点登录 (SSO)
  4. API 认证
  5. 移动应用认证

9. 不适用场景

  1. 需要即时撤销 token 权限的场景
  2. 包含大量敏感信息的传输
  3. 需要复杂会话管理的系统

通过深入理解 JWT 的结构、原理和使用方式,开发者可以更安全、高效地在各种应用场景中实现认证和信息交换机制。

JSON Web Token (JWT) 全面解析 1. JWT 概述 JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全传递声明信息。它是一种紧凑的、URL安全的表示方式,用于在双方之间传输信息。 2. JWT 结构组成 JWT 由三部分组成,用点号(.)分隔: 2.1 Header (头部) Header 是一个 JSON 对象,描述 JWT 的元数据,通常包含两个属性: alg :签名算法 (algorithm),默认是 HMAC SHA256 (写成 HS256) typ :令牌类型 (type),固定为 "JWT" Header 会使用 Base64URL 算法进行编码。 2.2 Payload (负载) Payload 也是一个 JSON 对象,存放实际需要传递的数据。JWT 规定了7个官方字段(可选): iss (issuer):签发人 exp (expiration time):过期时间 sub (subject):主题 aud (audience):受众 nbf (Not Before):生效时间 iat (Issued At):签发时间 jti (JWT ID):编号 示例: 重要注意事项 : JWT 默认是不加密的,任何人都可以读取 Payload 内容 不要将敏感信息放在 Payload 中 Payload 同样使用 Base64URL 算法编码 2.3 Signature (签名) Signature 部分是对前两部分的签名,防止数据篡改。生成方式: 指定一个密钥 (secret),仅服务器知道 使用 Header 中指定的签名算法 (默认 HMAC SHA256) 计算公式: 3. Base64URL 编码 Base64URL 是 Base64 的变种,主要区别: + 替换为 - / 替换为 _ = 被省略 这些修改是为了避免 URL 中的特殊字符问题。 4. JWT 使用方式 客户端收到 JWT 后,可以存储在: Cookie 中(自动发送,但不能跨域) localStorage 中 推荐的使用方式是在 HTTP 请求头中添加 Authorization 字段: 跨域时,也可以将 JWT 放在 POST 请求的数据体中。 5. JWT 特点 加密性 : 默认不加密,但可以加密(生成原始 Token 后可用密钥再加密) 不加密时不能存放敏感信息 用途 : 可用于认证 可用于信息交换 可减少服务器查询数据库次数 缺点 : 服务器不保存 session 状态 无法在使用过程中废止某个 token 无法更改 token 的权限 一旦签发,在到期前始终有效(除非部署额外逻辑) 安全性 : 一旦泄露,任何人都可获得所有权限 有效期应设置较短 重要权限应再次认证用户 不应使用 HTTP 明码传输,应使用 HTTPS 6. 安全最佳实践 使用强加密算法(如 HS256 或 RS256) 设置合理的短有效期 使用 HTTPS 传输 不要在 Payload 中存储敏感信息 考虑实现 token 刷新机制 对于重要操作,实施二次验证 7. JWT 工作流程 用户登录,服务器验证凭证 服务器生成 JWT 并返回给客户端 客户端存储 JWT(通常在 localStorage 或 sessionStorage) 客户端在后续请求中携带 JWT(通常在 Authorization 头) 服务器验证 JWT 并处理请求 如果 JWT 过期,客户端需要重新获取新的 JWT 8. 适用场景 无状态认证 跨域认证 单点登录 (SSO) API 认证 移动应用认证 9. 不适用场景 需要即时撤销 token 权限的场景 包含大量敏感信息的传输 需要复杂会话管理的系统 通过深入理解 JWT 的结构、原理和使用方式,开发者可以更安全、高效地在各种应用场景中实现认证和信息交换机制。