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