JWT认证授权契约接口设计与契约测试 - 第1节

1.1 什么是 JWT

JWT(JSON Web Token)是一种基于 JSON 格式的开放标准(RFC 7519),用于在各方之间以紧凑、自包含的方式安全地传输信息。JWT 通常被用于身份认证和信息交换场景,其核心特点是:令牌本身即包含所有必要的用户信息,服务端无需维护会话状态。

核心特性:
  • 紧凑(Compact):体积小,可通过 URL、POST 参数或 HTTP Header 快速传输。
  • 自包含(Self-contained):载荷中直接携带用户身份、权限、过期时间等声明,减少数据库查询。
  • 防篡改(Tamper-proof):通过签名(HMAC 或 RSA/ECDSA)保证内容在传输过程中未被修改。

JWT 的结构

一个 JWT 由三部分组成,以点号(.)分隔:

Header.Payload.Signature
部分 说明 示例(Base64 解码后)
Header 令牌类型与签名算法 {"alg":"HS256","typ":"JWT"}
Payload 声明(Claims),包含用户数据与元数据 {"sub":"1234567890","name":"张三","iat":1516239022}
Signature 对前两部分签名,防止篡改 由 Header 指定算法生成
注意:Payload 仅经过 Base64 编码,并非加密。敏感信息(如密码)不应直接放入 JWT,必须配合 HTTPS 传输。
JWT 结构分解 Header 算法 & 类型 {"alg":"HS256","typ":"JWT"} Payload 声明(Claims) 用户身份、权限、过期时间 Signature 防篡改签名 HMAC / RSA / ECDSA 最终格式:Header.Payload.Signature(如:xxxxx.yyyyy.zzzzz)

1.2 JWT 与 Session/Cookie 的区别

传统的 Session-Cookie 认证与 JWT 认证在状态管理、扩展性、跨域支持等方面存在本质差异。下表从多个维度进行对比:

对比维度 Session / Cookie JWT
状态存储 服务端存储 Session,客户端存 Cookie(Session ID) 无状态,令牌自包含用户信息
扩展性 需要共享 Session(如 Redis)或粘性会话 天然支持水平扩展,任何服务节点均可验证
跨域支持 受同源策略限制,跨域需额外配置(CORS + Credentials) 通过 HTTP Header 传递,跨域友好
安全性 依赖 Cookie 的 HttpOnly/Secure 属性,防 XSS 较好 防篡改性强,但需防范 XSS 导致令牌泄露
性能 每次请求需查询 Session 存储 服务端只需验证签名,无需查库
移动端适配 Cookie 在原生 App 中处理不便 原生 App 可轻松存储和发送 Token
选型建议:传统 Web 应用(服务端渲染)可继续使用 Session-Cookie;API 服务、微服务架构、移动端后端、单页应用(SPA)优先选择 JWT。
Session-Cookie 与 JWT 认证流程对比 Session-Cookie 模式 客户端 服务端 Session 存储 登录请求 返回 Set-Cookie (Session ID) 后续请求携带 Cookie 服务端查询 Session JWT 模式 客户端 服务端 登录请求 生成 JWT(签名) 返回 JWT Token 后续请求携带 JWT(Authorization Header) 服务端验证签名,无需查库 关键差异:JWT 无状态,服务端不保存会话;Session 模式依赖服务端存储

1.3 JWT 的典型应用场景

JWT 在以下场景中具有显著优势,已成为现代 API 认证的主流方案:

  • 单点登录(SSO):JWT 自包含用户身份,多个系统共享同一令牌即可实现跨系统认证,无需重复登录。
  • 移动端 API 认证:原生 App 无 Cookie 概念,JWT 可通过 HTTP Header 轻松传递,适配 iOS/Android。
  • 微服务间通信:服务 A 调用服务 B 时,携带 JWT 传递调用者身份与权限,无需中心化认证服务。
  • 无状态 RESTful API:服务端不保存会话,JWT 签名验证即可完成认证,便于水平扩展。
  • 信息交换:JWT 可携带结构化数据(如用户角色、部门),接收方验证签名后直接使用。
实战建议:JWT 适合短期令牌(如 15 分钟),配合 Refresh Token 实现安全续期。避免在 JWT 中存储敏感数据,始终使用 HTTPS 传输。