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