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