2. JWT 基础概念

JWT(JSON Web Token)是目前 SaaS 架构中最主流的无状态鉴权协议。理解 JWT 的本质、结构及其与 Session 的差异,是掌握 SaaS 鉴权链路的第一步。

2.1 JWT 是什么

JWT 是一种基于 JSON 格式的开放标准(RFC 7519),用于在各方之间安全地传输声明(Claims)。它通常被用于身份认证和信息交换场景。JWT 的核心特点是:自包含——令牌本身携带了所有必要的用户信息和元数据,服务端无需查询数据库即可完成验证。

核心定义:JWT 是一个经过数字签名的 JSON 对象,可以在不安全的网络环境中安全传递,且服务端无需维护会话状态。

JWT 在 SaaS 鉴权链路中的典型作用:

  • 身份认证:用户登录成功后,服务端签发 JWT,客户端后续请求携带该令牌。
  • 权限声明:JWT 的 Payload 中包含角色、权限范围等信息,服务端直接解析即可完成鉴权。
  • 无状态扩展:由于不依赖服务端存储,SaaS 应用可以轻松水平扩展,无需共享 Session 存储。

2.2 JWT 的组成结构

一个完整的 JWT 由三个部分组成,以点号(.)分隔:Header.Payload.Signature。下面通过一张结构图直观展示其组成。

JWT 令牌结构分解 eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dQw4w9WgXcQ Header(头部) 算法 & 令牌类型 Payload(载荷) 声明数据(用户、权限等) Signature(签名) 防篡改验证 各部分说明: • Header:通常包含令牌类型(typ: "JWT")和签名算法(alg: "HS256" 或 "RS256")。 • Payload:包含声明(Claims),如用户ID(sub)、过期时间(exp)、角色(role)等。 • Signature:对 Header 和 Payload 进行签名,防止数据被篡改。

Header(头部)

Header 通常包含两个字段:令牌类型(typ)和签名算法(alg)。示例:

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

Payload(载荷)

Payload 是 JWT 的核心数据部分,包含声明(Claims)。声明分为三类:

声明类型 说明 示例
注册声明(Registered) 预定义的标准字段 iss(签发者)、exp(过期时间)、sub(主题)
公共声明(Public) 自定义字段,需避免冲突 role(角色)、tenant_id(租户ID)
私有声明(Private) 双方约定的自定义数据 user_permissions(权限列表)
{
  "sub": "1234567890",
  "name": "张三",
  "role": "admin",
  "tenant_id": "t-001",
  "exp": 1718000000
}

Signature(签名)

签名是对 Header 和 Payload 的完整性保护。生成过程:

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

服务端使用相同的密钥验证签名,确保令牌未被篡改。

2.3 JWT 与 Session 的区别

Session 是传统的服务端有状态鉴权方案,JWT 是无状态鉴权方案。两者在 SaaS 架构中的适用场景差异显著。

Session vs JWT 鉴权流程对比 Session 有状态鉴权 1. 用户登录 → 服务端创建 Session 2. 返回 Session ID(Cookie) 3. 每次请求查询服务端 Session 存储 JWT 无状态鉴权 1. 用户登录 → 服务端签发 JWT 2. 客户端存储 JWT(LocalStorage) 3. 每次请求携带 JWT,服务端验证签名 核心差异: • 存储位置:Session 存储在服务端内存/Redis;JWT 存储在客户端。 • 扩展性:Session 需要共享存储(如 Redis)才能水平扩展;JWT 天然支持水平扩展。 • 安全性:Session 可主动失效;JWT 签发后无法主动撤销(需配合黑名单机制)。

以下是 Session 与 JWT 在 SaaS 场景下的详细对比:

对比维度 Session 鉴权 JWT 鉴权
状态存储 服务端存储(内存/Redis) 客户端存储(LocalStorage/Cookie)
扩展性 需要共享 Session 存储,扩展复杂 无状态,服务端可任意水平扩展
跨域支持 受 Cookie 同源策略限制 通过 Authorization 头,天然支持跨域
主动失效 服务端可随时删除 Session 无法主动撤销,需额外黑名单机制
性能开销 每次请求查询存储,有 I/O 开销 仅验证签名,计算开销低
适用场景 传统单体应用、内网系统 SaaS 多租户、微服务、移动端
SaaS 架构建议:对于多租户 SaaS 应用,JWT 是更优选择。它天然支持无状态扩展,且 Payload 中可直接携带 tenant_id 和 role,服务端无需查询数据库即可完成租户隔离和权限校验。
注意:JWT 的 Payload 仅经过 Base64Url 编码,并未加密。敏感信息(如密码、信用卡号)不应直接放入 Payload。如需加密,应使用 JWE(JSON Web Encryption)标准。