1. JWT 基础概念

JWT(JSON Web Token)是一种基于 JSON 的开放标准(RFC 7519),用于在各方之间以紧凑、自包含的方式安全传输信息。在异步任务与微服务架构中,JWT 常作为身份认证与权限校验的核心凭证。

1.1 什么是 JWT

JWT 本质上是一个经过数字签名的 JSON 对象,由三部分拼接而成。它可以在用户与服务器之间、或服务与服务之间传递声明(Claims),且签名保证了数据在传输过程中未被篡改。

核心特性:
  • 自包含:令牌本身携带用户身份、权限、过期时间等信息,无需查询数据库。
  • 紧凑:体积小,适合 URL、HTTP Header 或 Cookie 传输。
  • 防篡改:通过 HMAC 或 RSA/ECDSA 签名保证完整性。

1.2 JWT 的结构

一个 JWT 由 Header、Payload、Signature 三部分组成,以点号 . 分隔,格式为:xxxxx.yyyyy.zzzzz。

部分 说明 示例(Base64 解码后)
Header 令牌类型与签名算法 {"alg":"HS256","typ":"JWT"}
Payload 声明(Claims),包含用户数据与元信息 {"sub":"123","name":"张三","iat":1718000000}
Signature 对前两部分签名,防止篡改 HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
注意:Payload 中的信息是 Base64Url 编码,并非加密。敏感数据(如密码)不应放入 JWT 的 Payload 中。

1.3 JWT 结构示意图

JWT 结构分解 完整 JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.abc123signature Header 算法 + 类型 Payload 声明(Claims) Signature 防篡改签名 三部分通过 Base64Url 编码后以点号拼接 Header 和 Payload 仅编码不加密,任何人都可解码读取 Signature 使用密钥对前两部分签名,确保数据完整性

1.4 JWT 与 Session 的区别

在 Web 认证场景中,JWT 与传统的 Session 方案有本质差异。下表从多个维度进行对比:

对比维度 Session 认证 JWT 认证
存储位置 服务端内存/Redis,客户端仅存 Session ID 客户端持有完整令牌,服务端无状态
扩展性 需要共享 Session 存储(如 Redis 集群) 天然支持水平扩展,无需共享存储
跨域支持 受限于 Cookie 同源策略,配置复杂 通过 HTTP Header 传输,天然支持跨域
安全性 Session ID 泄露风险,需配合 CSRF 防护 令牌泄露风险,需配合 HTTPS 与短有效期
吊销机制 服务端直接删除 Session 即可 需维护黑名单或缩短有效期,吊销成本高
适用场景 传统 Web 应用、服务端渲染页面 RESTful API、微服务、移动端、异步任务

1.5 异步任务场景下的选择

在异步任务与权限验证场景中,JWT 相比 Session 具有明显优势:

  • 无状态传递:任务队列中的 Worker 节点无需访问共享 Session 存储,直接解析 JWT 即可获取用户身份与权限。
  • 权限自包含:可将角色、资源权限等声明编码在 JWT 中,Worker 节点独立完成校验。
  • 减少数据库查询:每次任务处理无需回查用户表或权限表,降低延迟与数据库压力。
安全提醒:在异步任务中使用 JWT 时,务必设置合理的过期时间(如 15-30 分钟),并配合刷新令牌机制。对于长时间运行的任务,应考虑使用短期令牌 + 任务级别的权限校验,避免令牌过期导致任务失败。