JWT 的核心原理

一、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 工作流程

image.png
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 安全最佳实践

  1. 传输安全
    强制使用HTTPS:防止Token被中间人窃取
    存储方式:
    推荐:使用HttpOnly + Secure属性的Cookie
    避免:LocalStorage(易受XSS攻击)
  2. Token设计
    设置合理的过期时间(如exp: 15分钟)
    必要时加入jti(JWT ID)用于唯一标识
    敏感操作要求二次验证(如支付、修改密码)
  3. 密钥管理
    使用强加密算法(至少HS256,推荐RS256)
    定期轮换密钥(需兼容旧Token时使用密钥版本控制)
    密钥存储:使用KMS(密钥管理系统)或HSM(硬件安全模块)
  4. 防御措施
    防范重放攻击:加入时间戳iat并验证时效性
    限制使用场景:通过aud声明限制Token的受众
    黑名单机制:针对已注销但未过期的Token

六、JWT 与 Session 的对比

image.png

七、适用场景

前后端分离架构: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天),存储于数据库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容