JSON Web Token(JWT)是现代Web开发中广泛使用的开放标准(RFC 7519),用于安全地在各方之间传输声明信息。以下是其核心原理的深度解析:
一、结构解剖(三部分通过.连接)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. // Header
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ. // Payload
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c // Signature
-
Header(头部)
- 算法声明:指定签名算法(如HS256、RS512)
- Token类型:固定为JWT
{ "alg": "HS256", "typ": "JWT" } -
Payload(载荷)
- 注册声明(预定义字段):
iss(签发者)exp(过期时间戳)sub(主题)
- 公共声明(自定义字段):
{ "userId": "5f4dcc3b5aa765d61d8327deb882cf99", "roles": ["admin", "editor"] } - 私有声明(双方约定字段)
- 注册声明(预定义字段):
-
Signature(签名)
- 生成公式:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret-key ) - 验证原理:服务端重新计算签名并与传输的签名比对
- 生成公式:
二、工作流程(OAuth 2.0示例)
- 客户端提交凭证 → 认证服务
- 服务端验证通过后生成JWT → 返回给客户端
- 客户端存储JWT(localStorage/Cookie)
- 后续请求携带JWT(Authorization头)
- 服务端解密验证 → 授权访问资源
三、核心优势
- 无状态认证:服务端无需保存会话状态
- 跨域支持:适用于微服务架构
- 信息自包含:减少数据库查询次数
- 标准化格式:多语言兼容(Java/Python/Node.js等)
四、安全机制
- 防篡改:签名保证内容完整性
- 时效控制:通过
exp字段设置有效期 - 算法验证:强制校验头部声明的算法
- 密钥保护:HS256需要保密密钥,RS256使用公私钥体系
五、典型应用场景
- 单点登录(SSO)系统
- RESTful API身份验证
- 移动应用授权
- 服务间安全通信
六、安全实践建议
- 必须使用HTTPS传输
- 敏感数据不要存Payload(Payload仅Base64编码)
- 设置合理的过期时间(建议≤1小时)
- 使用强加密算法(推荐RS256)
- 实现Token黑名单机制(用于即时吊销)
七、与Session对比
| 特性 | JWT | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务端 |
| 扩展性 | 适合分布式系统 | 需要共享存储 |
| 安全性 | 依赖签名算法 | 依赖Cookie安全 |
| 性能开销 | 每次请求需要验证签名 | 需要查询会话存储 |
| 失效控制 | 依赖过期时间 | 可即时销毁 |