JSON Web Token (JWT) 详细解释 #
JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。它特别适用于授权和信息交换场景。
1. JWT 的基本结构 #
JWT 由三部分组成,用点号(.)分隔:
Header.Payload.Signature
1.1 Header (头部) #
头部通常由两部分组成:
- 令牌类型 (typ):通常是 “JWT”
- 签名算法 (alg):如 HMAC SHA256 或 RSA
示例:
{
"alg": "HS256",
"typ": "JWT"
}
1.2 Payload (负载/声明) #
包含所谓的"声明"(claims),是关于实体(通常是用户)和其他数据的声明。有三种类型的声明:
-
注册声明(Registered claims):预定义的声明,如:
iss
(issuer):签发者exp
(expiration time):过期时间sub
(subject):主题aud
(audience):受众
-
公开声明(Public claims):可以自定义,但应该避免与已注册声明冲突
-
私有声明(Private claims):自定义声明,用于在同意使用它们的各方之间共享信息
示例:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"iat": 1516239022
}
1.3 Signature (签名) #
签名用于验证消息在传输过程中没有被更改,对于使用私钥签名的令牌,它还可以验证 JWT 的发送者是否是它所说的那个人。
创建签名需要:
- 编码后的头部
- 编码后的负载
- 一个密钥
- 头部中指定的算法
例如使用 HMAC SHA256 算法:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
2. JWT 的工作流程 #
- 用户登录:用户提供凭证(用户名/密码)
- 验证凭证:服务器验证凭证
- 生成JWT:验证成功后,服务器生成JWT并返回给客户端
- 存储JWT:客户端(通常是浏览器)存储JWT(通常在localStorage或cookie中)
- 后续请求:客户端在后续请求的Authorization头中发送JWT
- 验证JWT:服务器验证JWT并处理请求
3. JWT 的优点 #
- 无状态:服务器不需要存储会话信息
- 跨域友好:适合单页应用(SPA)和跨域API调用
- 可扩展性:可以包含自定义声明
- 安全性:使用签名确保数据完整性
- 标准化:基于开放标准,多种语言支持
4. JWT 的安全考虑 #
- 敏感信息:JWT可以被解码,不应存储敏感信息
- 过期时间:应设置合理的过期时间(exp声明)
- HTTPS:应始终通过HTTPS传输
- 存储安全:客户端存储要防止XSS攻击
- 密钥保护:签名密钥必须妥善保护
5. JWT 的使用场景 #
- 认证:最常见的用途,用户登录后获取JWT
- 信息交换:安全地在各方之间传输信息
- 一次性验证:如密码重置链接
6. JWT 示例 #
一个完整的JWT示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
解码后:
- Header:
{
"alg": "HS256",
"typ": "JWT"
}
- Payload:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
JWT是现代Web应用和API中广泛使用的认证和授权机制,理解其工作原理对于开发安全应用至关重要。