1. JWT 基础概念

1.1 什么是 JWT

JWT(JSON Web Token) 是一种基于 JSON 格式的开放标准(RFC 7519),用于在各方之间以安全、紧凑的方式传递声明信息。JWT 通常用于身份认证和信息交换场景,其核心特点是自包含——令牌本身携带了用户身份、权限范围和元数据,服务端无需查询数据库即可完成验证。

核心定义:JWT 是一个经过数字签名的 JSON 对象,可以在网络应用环境间安全传输,常用于无状态认证场景。

1.2 JWT 的组成结构

一个完整的 JWT 由三个部分组成,以英文句号 . 分隔:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
组成部分 名称 说明 示例内容
第一部分 Header(头部) 声明令牌类型和签名算法 {"alg":"HS256","typ":"JWT"}
第二部分 Payload(载荷) 存放实际数据(声明),如用户 ID、角色、过期时间 {"sub":"123","name":"John","iat":1516239022}
第三部分 Signature(签名) 对前两部分进行签名,防止数据篡改 HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

Header(头部)

Header 通常包含两个字段:令牌类型(typ)和签名算法(alg)。常见算法包括 HMAC(HS256)、RSA(RS256)和 ECDSA(ES256)。

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload(载荷)

Payload 是 JWT 的核心数据部分,包含三类声明:

  • 注册声明(Registered Claims):预定义的标准字段,如 iss(签发者)、sub(主题)、exp(过期时间)、iat(签发时间)。
  • 公共声明(Public Claims):由使用方自定义,需在 IANA JSON Web Token Registry 注册或使用命名空间避免冲突。
  • 私有声明(Private Claims):通信双方约定的自定义字段,如 role、tenant_id。
{
  "sub": "user_abc123",
  "name": "张三",
  "role": "admin",
  "tenant_id": "t_001",
  "iat": 1700000000,
  "exp": 1700086400
}

Signature(签名)

签名由以下公式生成:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

服务端使用相同的密钥对 Header 和 Payload 重新计算签名,并与令牌携带的签名比对。若不一致,说明数据已被篡改。

注意:Payload 仅经过 Base64Url 编码,并未加密。敏感信息(如密码、信用卡号)不应直接放入 JWT 中,除非使用 JWE(JSON Web Encryption)进行加密。

1.3 JWT 与 Session 的区别

JWT 和 Session 是两种主流的认证机制,它们在存储位置、扩展性和安全性方面存在显著差异:

对比维度 Session 认证 JWT 认证
存储位置 服务端内存/数据库/Redis 客户端(浏览器/移动端)
状态特性 有状态(服务端保存会话) 无状态(令牌自包含信息)
扩展性 需共享 Session 存储(如 Redis 集群) 天然支持水平扩展,无需共享存储
跨域支持 需配置 CORS 或代理 原生支持跨域(基于 Token 头)
吊销机制 直接删除 Session 即可 需维护黑名单或缩短过期时间
性能开销 每次请求查询存储 仅需验证签名,无需查询
典型场景 传统单体应用、服务端渲染 微服务、移动端、单页应用(SPA)
选型建议:JWT 并非 Session 的完全替代品。对于需要即时吊销用户权限的场景(如管理员封禁账号),Session 机制更直接;对于分布式系统和无状态 API,JWT 更具优势。

1.4 JWT 认证流程示意图

下图展示了 JWT 在典型 Web 应用中的认证与鉴权链路:

JWT 认证流程 JWT 认证与鉴权链路 客户端 浏览器 / 移动端 认证服务 登录 / 签发 JWT 业务服务 验证 JWT / 处理请求 ① 登录请求 ② 返回 JWT ③ 携带 JWT 请求资源 验证签名 检查过期时间 返回响应数据 ④ 响应数据 关键特性 • 无状态认证 • 自包含令牌

1.5 无状态认证的优势与局限

JWT 的核心价值:无状态架构使服务端无需维护会话信息,每个请求都携带完整的认证数据,极大简化了分布式系统的认证复杂度。
  • 优势:
    • 服务端无需 Session 存储,降低内存和数据库压力
    • 天然支持跨域和移动端认证
    • 微服务架构下无需共享 Session 存储
    • 令牌结构标准化,易于解析和调试
  • 局限:
    • 令牌一旦签发,在过期前无法主动吊销(需额外黑名单机制)
    • Payload 仅编码未加密,敏感信息需额外保护
    • 令牌体积较大,增加每次请求的网络开销
    • 签名验证存在计算开销(尤其非对称算法)
实战建议:在 SaaS 系统中,建议将 JWT 过期时间设置为 15-30 分钟,配合 Refresh Token 实现长期登录。对于需要即时权限变更的场景,可引入 Token 版本号或黑名单机制。