JWT 简介 #
什么是 Token? #
在了解 JWT 之前,我们需要先理解"令牌"(Token)的概念。令牌是一种凭证,用于证明持有者拥有某种权限或身份。
text
┌─────────────────────────────────────────────────────────────┐
│ Token 的本质 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 类比: │
│ │
│ ┌─────────┐ 出示令牌 ┌─────────┐ │
│ │ 用户 │ ───────────────> │ 服务 │ │
│ └─────────┘ └─────────┘ │
│ │
│ 就像: │
│ - 入场券:证明你有权进入 │
│ - 身份证:证明你是谁 │
│ - 银行卡:证明你有权操作账户 │
│ │
└─────────────────────────────────────────────────────────────┘
传统 Session 机制 #
text
┌─────────────────────────────────────────────────────────────┐
│ 传统 Session 模式 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ │
│ │ 客户端 │ │ 服务端 │ │
│ └────┬────┘ └────┬────┘ │
│ │ │ │
│ │ 1. 登录请求 │ │
│ │─────────────────────────>│ │
│ │ │ │
│ │ 2. 创建 Session │ │
│ │ 存储在内存/数据库 │ │
│ │ │ │
│ │ 3. 返回 Session ID │ │
│ │<─────────────────────────│ │
│ │ │ │
│ │ 4. 携带 Cookie 访问 │ │
│ │─────────────────────────>│ │
│ │ │ │
│ │ 5. 查询 Session 验证 │ │
│ │<─────────────────────────│ │
│ │
│ 问题: │
│ ❌ 服务端需要存储 Session │
│ ❌ 分布式系统需要 Session 共享 │
│ ❌ 跨域问题 │
│ ❌ 移动端不友好 │
│ │
└─────────────────────────────────────────────────────────────┘
什么是 JWT? #
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它是一个紧凑的、URL 安全的方式,用于表示要在双方之间传输的声明(Claims)。
核心定位 #
text
┌─────────────────────────────────────────────────────────────┐
│ JWT │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 自包含 │ │ 无状态 │ │ 可验证 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 跨语言 │ │ 紧凑格式 │ │ 安全传输 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
JWT 解决的问题 #
text
┌─────────────────────────────────────────────────────────────┐
│ JWT 解决的问题 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 传统 Session 问题: │
│ │
│ 1. 服务端存储压力 │
│ Session 存储在服务端 │
│ 用户多时内存压力大 │
│ │
│ 2. 分布式困难 │
│ 多服务器需要共享 Session │
│ 需要额外的存储系统 │
│ │
│ 3. 跨域限制 │
│ Cookie 有跨域限制 │
│ 移动端使用不便 │
│ │
│ JWT 解决方案: │
│ │
│ ✅ 无状态:服务端不需要存储 │
│ ✅ 自包含:所有信息都在 Token 中 │
│ ✅ 跨域友好:可放在 Header 或 URL 中 │
│ ✅ 多端支持:Web、移动端、IoT 都可用 │
│ │
└─────────────────────────────────────────────────────────────┘
JWT 的历史 #
发展历程 #
text
2010年 ─── JWT 概念提出
│
│ OAuth 工作组讨论
│ 简化 Token 格式
│
2011年 ─── JWT 规范起草
│
│ 定义基本结构
│ Base64URL 编码
│
2015年 ─── RFC 7519 发布
│
│ IETF 正式标准
│ JSON Web Token 标准
│
2015年 ─── 相关标准发布
│
│ JWS (JSON Web Signature)
│ JWE (JSON Web Encryption)
│ JWK (JSON Web Key)
│
至今 ─── 广泛应用
│
│ OAuth 2.0 默认 Token 格式
│ OpenID Connect 标准
│ 微服务认证标准
相关标准族 #
| 标准 | 名称 | 描述 |
|---|---|---|
| RFC 7519 | JWT | JSON Web Token |
| RFC 7515 | JWS | JSON Web Signature(签名) |
| RFC 7516 | JWE | JSON Web Encryption(加密) |
| RFC 7517 | JWK | JSON Web Key(密钥) |
| RFC 7518 | JWA | JSON Web Algorithms(算法) |
JWT 的核心特点 #
1. 紧凑(Compact) #
text
┌─────────────────────────────────────────────────────────────┐
│ JWT 紧凑性 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 体积小,可以通过多种方式传输: │
│ │
│ 1. HTTP Header │
│ Authorization: Bearer eyJhbGciOiJIUzI1NiIs... │
│ │
│ 2. URL 参数 │
│ https://api.example.com?token=eyJhbGciOiJI... │
│ │
│ 3. POST Body │
│ { "token": "eyJhbGciOiJIUzI1NiIs..." } │
│ │
│ 4. Cookie │
│ Set-Cookie: token=eyJhbGciOiJIUzI1NiIs... │
│ │
└─────────────────────────────────────────────────────────────┘
2. 自包含(Self-contained) #
text
┌─────────────────────────────────────────────────────────────┐
│ JWT 自包含性 │
├─────────────────────────────────────────────────────────────┤
│ │
│ JWT 包含所有必要信息: │
│ │
│ { │
│ "sub": "user-123", // 用户标识 │
│ "name": "John Doe", // 用户名 │
│ "role": "admin", // 角色 │
│ "exp": 1516239022, // 过期时间 │
│ "iat": 1516239022 // 签发时间 │
│ } │
│ │
│ 优势: │
│ ✅ 无需查询数据库 │
│ ✅ 减少服务端负载 │
│ ✅ 支持分布式验证 │
│ │
└─────────────────────────────────────────────────────────────┘
3. 可验证(Verifiable) #
text
┌─────────────────────────────────────────────────────────────┐
│ JWT 可验证性 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 数字签名保证: │
│ │
│ 1. 完整性 │
│ - 数据未被篡改 │
│ - 签名验证即可确认 │
│ │
│ 2. 真实性 │
│ - 确认签发者身份 │
│ - 防止伪造 │
│ │
│ 3. 不可抵赖 │
│ - 签发者无法否认 │
│ - 有据可查 │
│ │
└─────────────────────────────────────────────────────────────┘
4. 跨语言(Cross-platform) #
text
┌─────────────────────────────────────────────────────────────┐
│ JWT 跨语言支持 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 所有主流语言都有 JWT 库: │
│ │
│ JavaScript: jsonwebtoken, jose │
│ Python: PyJWT, python-jose │
│ Java: java-jwt, jjwt │
│ Go: golang-jwt, go-jose │
│ PHP: firebase/php-jwt │
│ Ruby: jwt │
│ C#: System.IdentityModel.Tokens.Jwt │
│ Rust: jsonwebtoken │
│ │
└─────────────────────────────────────────────────────────────┘
JWT 的应用场景 #
1. 身份认证(Authentication) #
text
┌─────────────────────────────────────────────────────────────┐
│ 身份认证流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ │
│ │ 客户端 │ │ 服务端 │ │
│ └────┬────┘ └────┬────┘ │
│ │ │ │
│ │ 1. 登录请求 │ │
│ │─────────────────────────>│ │
│ │ │ │
│ │ 2. 验证用户 │ │
│ │ 生成 JWT │ │
│ │ │ │
│ │ 3. 返回 JWT │ │
│ │<─────────────────────────│ │
│ │ │ │
│ │ 4. 携带 JWT 访问 │ │
│ │─────────────────────────>│ │
│ │ │ │
│ │ 5. 验证签名 │ │
│ │ 直接解析信息 │ │
│ │<─────────────────────────│ │
│ │
└─────────────────────────────────────────────────────────────┘
2. 授权(Authorization) #
text
┌─────────────────────────────────────────────────────────────┐
│ 授权流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 用户登录后获取 JWT: │
│ │
│ { │
│ "sub": "user-123", │
│ "role": "admin", │
│ "permissions": ["read", "write", "delete"], │
│ "exp": 1516239022 │
│ } │
│ │
│ 后续请求: │
│ GET /api/users │
│ Authorization: Bearer eyJhbGciOiJIUzI1NiIs... │
│ │
│ 服务端: │
│ - 验证 JWT 签名 │
│ - 解析 role 和 permissions │
│ - 判断是否有权访问 │
│ │
└─────────────────────────────────────────────────────────────┘
3. 单点登录(SSO) #
text
┌─────────────────────────────────────────────────────────────┐
│ 单点登录 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 应用A │ │ 认证中心 │ │ 应用B │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ │ 1. 访问应用A │ │ │
│ │<──────────────│ │ │
│ │ │ │ │
│ │ 2. 重定向到认证中心 │ │
│ │──────────────>│ │ │
│ │ │ │ │
│ │ 3. 登录并获取 JWT │ │
│ │<──────────────│ │ │
│ │ │ │ │
│ │ 4. 访问应用B │ │ │
│ │───────────────────────────────>│ │
│ │ │ │ │
│ │ 5. 使用同一 JWT 验证 │ │
│ │<───────────────────────────────│ │
│ │
└─────────────────────────────────────────────────────────────┘
4. 信息交换 #
text
┌─────────────────────────────────────────────────────────────┐
│ 安全信息交换 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景:服务间安全通信 │
│ │
│ 服务 A 生成 JWT: │
│ { │
│ "iss": "service-a", // 签发者 │
│ "aud": "service-b", // 接收者 │
│ "data": { │
│ "userId": "123", │
│ "action": "process" │
│ }, │
│ "exp": 1516239022 │
│ } │
│ │
│ 服务 B 验证: │
│ - 验证签名(确认来自服务 A) │
│ - 验证 aud(确认是发给自己的) │
│ - 验证 exp(确认未过期) │
│ - 处理请求 │
│ │
└─────────────────────────────────────────────────────────────┘
JWT vs Session #
对比分析 #
| 特性 | JWT | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务端 |
| 状态 | 无状态 | 有状态 |
| 扩展性 | 天然支持分布式 | 需要 Session 共享 |
| 安全性 | 签名防篡改 | 服务端存储安全 |
| 注销 | 困难(需要黑名单) | 容易 |
| 信息更新 | 需要重新签发 | 直接修改 |
| 跨域 | 友好 | 需要特殊处理 |
| 移动端 | 友好 | 不友好 |
选择建议 #
text
┌─────────────────────────────────────────────────────────────┐
│ 选择指南 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 选择 JWT 的场景: │
│ ✅ 分布式系统 / 微服务架构 │
│ ✅ 移动端应用 │
│ ✅ 单点登录(SSO) │
│ ✅ 无状态 API │
│ ✅ 跨域请求 │
│ │
│ 选择 Session 的场景: │
│ ✅ 传统单体应用 │
│ ✅ 需要即时注销 │
│ ✅ 敏感操作需要服务端验证 │
│ ✅ 信息频繁更新 │
│ │
└─────────────────────────────────────────────────────────────┘
JWT 的优势与局限 #
优势 #
text
✅ 无状态
- 服务端不需要存储
- 天然支持分布式
- 减少服务端压力
✅ 跨域友好
- 不受 Cookie 跨域限制
- 移动端友好
- 适合前后端分离
✅ 标准化
- RFC 标准
- 跨语言支持
- 丰富的库
✅ 自包含
- 信息都在 Token 中
- 减少数据库查询
- 提高性能
局限性 #
text
⚠️ 无法主动撤销
- Token 签发后无法作废
- 需要黑名单机制
- 或使用短有效期
⚠️ Token 体积
- 包含信息越多越大
- 每次请求都要传输
- 增加网络开销
⚠️ 安全考虑
- 不能存储敏感信息
- 需要安全传输(HTTPS)
- 需要安全存储
⚠️ 信息更新
- 信息变更需要重新签发
- 无法实时更新
- 需要刷新机制
学习路径 #
text
入门阶段
├── JWT 简介(本文)
├── JWT 结构详解
└── JWT 基本使用
进阶阶段
├── JWT 签名算法
├── JWT 安全最佳实践
└── JWT 高级主题
实战阶段
├── 多语言实现
├── 集成 OAuth 2.0
└── 微服务认证
下一步 #
现在你已经了解了 JWT 的基本概念,接下来学习 JWT 结构详解,深入了解 JWT 的三个组成部分!
最后更新:2026-03-28