一、JWT 的核心原理
1. JWT 是什么?
定义:一种开放标准(RFC 7519),用于在各方之间安全传输JSON格式的声明(Claims)。
核心特征:
自包含:Token自身携带用户信息,无需查库验证
无状态:服务端无需存储会话信息
可验证:通过签名保证数据完整性
2. JWT 结构
一个JWT由三部分组成,用.分隔:
Header.Payload.Signature
(1) Header(头部)
描述Token类型和签名算法
示例:
{
"alg": "HS256", // 签名算法(HS256/RS256等)
"typ": "JWT" // Token类型
}
(2) Payload(负载)
包含用户数据和其他声明(Claims)
标准声明(建议但不强制使用):
iss(签发者)
exp(过期时间)
sub(用户标识)
aud(目标受众)
自定义声明:
{
"userId": "123",
"role": "admin"
}
(3) Signature(签名)
防止数据篡改的核心安全机制
生成方式:
HMAC_SHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secretKey
)
二、JWT 工作流程
sequenceDiagram
participant Client
participant Server
Client->>Server: 发送用户名/密码
Server-->>Client: 验证通过后生成JWT
Client->>Server: 后续请求携带JWT(Authorization头)
Server->>Server: 验证签名并解析Payload
Server-->>Client: 返回请求结果
三、JWT 的优缺点
优点:
无状态:适合微服务/分布式架构
跨域友好:轻松实现跨域认证(CORS)
信息自包含:减少数据库查询
客户端灵活性:移动端/Native应用均可使用
缺点:
Token尺寸大:可能增加网络开销
无法主动失效:需借助黑名单或短期有效期
密钥管理风险:私钥泄露会导致系统被攻破
信息暴露:Payload数据为Base64编码(非加密)
四、JWT 安全最佳实践
- 传输安全
强制使用HTTPS:防止Token被中间人窃取
存储方式:
推荐:使用HttpOnly + Secure属性的Cookie
避免:LocalStorage(易受XSS攻击) - Token设计
设置合理的过期时间(如exp: 15分钟)
必要时加入jti(JWT ID)用于唯一标识
敏感操作要求二次验证(如支付、修改密码) - 密钥管理
使用强加密算法(至少HS256,推荐RS256)
定期轮换密钥(需兼容旧Token时使用密钥版本控制)
密钥存储:使用KMS(密钥管理系统)或HSM(硬件安全模块) - 防御措施
防范重放攻击:加入时间戳iat并验证时效性
限制使用场景:通过aud声明限制Token的受众
黑名单机制:针对已注销但未过期的Token
六、JWT 与 Session 的对比
七、适用场景
前后端分离架构:SPA(React/Vue) + API服务
微服务间认证:服务间传递用户上下文
第三方API访问:结合OAuth 2.0颁发访问令牌
无状态负载均衡:无需会话亲和性(Session Stickiness)
八、常见问题与解决方案
Q1:如何实现用户主动退出登录?
方案1:维护短期Token(如15分钟有效期)
方案2:使用Token黑名单(Redis记录已注销Token)
Q2:如何防止Token被窃取后滥用?
绑定设备指纹/IP地址到Payload
关键操作要求二次验证
Q3:JWT的Payload应该存储哪些数据?
原则:仅存储必要非敏感信息
示例:用户ID、角色、权限级别
禁止:密码、密钥等敏感数据
九、高级用法
嵌套JWT:结合加密(JWE)和签名(JWS)
分片Token:将敏感数据分离存储
JWT续期:通过Refresh Token机制延长会话
Access Token:短期(如15分钟)
Refresh Token:长期(如7天),存储于数据库