什么是 JWT 以及它是如何工作的?
8 min read
JWT, Security, Authentication
JSON Web Token 简介
JSON Web Token (JWT) 是一个开放标准 (RFC 7519),已成为现代 Web 应用程序中安全信息交换的事实标准。在 2025 年,JWT 继续成为在分布式系统、微服务架构和云原生应用程序中实施身份验证和授权的关键技术。这份综合指南将探讨您需要了解的关于 JWT 的一切,从基本概念到高级实施策略。
深入理解 JWT 结构
JWT 是由三部分组成的字符串,用点 (.) 分隔,每部分在令牌功能中都有独特的作用。这种优雅的结构使 JWT 既可人类阅读又可机器解析,促进了其在不同平台和编程语言中的广泛采用。
三个核心组成部分
- 头部 (JOSE Header):第一部分包含有关令牌的元数据,包括令牌类型(通常为 "JWT")和所使用的签名算法(如 HS256、RS256 或 ES256)。此信息告诉接收方如何验证令牌的签名。
- 载荷 (Payload):第二部分包含声明,这些是关于实体(通常是用户)的陈述和附加元数据。声明可以是注册的(预定义的)、公共的(自定义但应避免冲突)或私有的(各方之间约定的自定义声明)。
- 签名 (Signature):最后一部分确保令牌在传输过程中未被篡改。它通过编码头部和载荷,然后使用密钥或私钥对其进行签名来创建,具体取决于头部中指定的算法。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWT 身份验证的详细工作流程
JWT 身份验证流程代表了一种无状态的用户身份验证方法,彻底改变了现代应用程序处理用户会话的方式。以下是完整身份验证生命周期的详细分解:
- 用户身份验证:用户向身份验证服务器提供凭据(用户名和密码、OAuth 或其他身份验证方法)。
- 凭据验证:服务器根据其用户数据库或身份提供者验证凭据。
- 令牌生成:身份验证成功后,服务器创建一个 JWT,在载荷中包含相关用户信息和权限,使用密钥或私钥对其进行签名,并设置适当的过期时间。
- 令牌传输:服务器将 JWT 发送回客户端,通常在响应正文中或作为 cookie。
- 客户端存储:客户端安全地存储 JWT(在内存、localStorage、sessionStorage 或作为 HTTP-only cookie,具体取决于安全要求)。
- 认证请求:对于后续请求,客户端使用 Bearer 模式在 Authorization 头中包含 JWT:"Authorization: Bearer <token>"。
- 令牌验证:服务器验证 JWT 签名,检查过期时间,并从载荷中提取用户信息,而无需查询数据库。
- 请求处理:如果有效,服务器使用从令牌中提取的用户上下文处理请求。
详细的 JWT 实例解析
让我们通过一个实际的 JWT 示例来了解各个组件是如何协同工作的:
// 头部(base64url 编码)
{
"alg": "HS256", // HMAC SHA256 算法
"typ": "JWT", // 令牌类型
"kid": "key-id-1" // 密钥 ID(可选)
}
// 载荷(base64url 编码)
{
// 注册声明
"iss": "https://jwt.app", // 发行者
"sub": "1234567890", // 主题(用户 ID)
"aud": "https://api.jwt.app", // 受众
"exp": 1735689600, // 过期时间
"nbf": 1735603200, // 生效时间
"iat": 1735603200, // 签发时间
"jti": "unique-token-id", // JWT ID
// 自定义声明
"name": "John Doe",
"email": "john@example.com",
"roles": ["user", "admin"],
"permissions": ["read", "write", "delete"]
}
// 签名生成
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
JWT 的常见应用场景
JWT 在现代 Web 开发的各种场景中都有广泛应用:
- 单点登录 (SSO):JWT 实现跨多个域和应用程序的无缝身份验证,允许用户登录一次即可访问多个服务。
- 微服务通信:在微服务架构中,JWT 促进了安全的服务间通信,无需集中式会话存储。
- 移动应用身份验证:JWT 非常适合传统会话管理不切实际的移动应用。
- API 身份验证:RESTful API 使用 JWT 进行无状态身份验证,提高了可扩展性和性能。
- 信息交换:除了身份验证之外,JWT 还可以在各方之间安全地传输信息,签名确保数据完整性。
- 联邦身份:JWT 支持由外部身份提供者处理身份验证的身份联邦场景。
JWT 的优势和好处
JWT 的广泛采用是由其相对于传统基于会话的身份验证所提供的众多优势驱动的:
- 无状态架构:服务器不需要存储会话信息,提高了可扩展性并减少了内存使用。
- 跨域支持:JWT 在不同域之间无缝工作,使其成为分布式系统的理想选择。
- 移动友好:非常适合 cookie 支持可能有限或有问题的移动应用程序。
- 去中心化验证:任何拥有公钥或密钥的服务都可以独立验证令牌。
- 性能优势:消除了会话验证的数据库查找,减少了延迟。
- 语言无关:几乎每种编程语言都有支持 JWT 的库。
- 自包含:所有必要的信息都包含在令牌本身中。
重要注意事项
虽然 JWT 提供了许多好处,但了解其局限性和正确用法至关重要:
- 令牌大小:JWT 可能会因为包含许多声明而变得很大,可能超过头部大小限制。
- 撤销挑战:一旦签发,JWT 在过期之前一直有效,除非实施额外的撤销机制。
- 安全敏感性:被盗用的令牌可以在过期前一直使用,因此短过期时间至关重要。
- 存储问题:将 JWT 存储在 localStorage 中会使其容易受到 XSS 攻击,而 cookie 需要 CSRF 保护。
总结
JSON Web Token 彻底改变了现代 Web 应用程序中的身份验证和授权。它们的无状态特性、跨域能力和自包含结构使其成为许多场景的绝佳选择。然而,成功的 JWT 实施需要了解其优势和局限性,并遵循安全最佳实践。随着我们在 2025 年的发展,JWT 继续通过新标准和改进而发展,保持其作为 Web 安全基础技术的地位。