JWT认证授权契约领域建模与架构设计 - 第1节
1.1 JWT 定义与本质
JSON Web Token(JWT) 是一种基于 JSON 格式的开放标准(RFC 7519),用于在各方之间以紧凑、自包含的方式安全传输声明信息。JWT 的核心价值在于:将用户身份与授权信息编码为一个独立的令牌,服务端无需维护会话状态即可完成认证与授权。
关键特性:JWT 是“自包含”的——令牌本身携带了所有必要的用户信息与元数据,服务端只需验证令牌签名即可信任其内容,无需查询数据库或会话存储。
JWT 的结构组成
一个完整的 JWT 由三个 Base64URL 编码的部分组成,以点号(.)分隔:
# JWT 格式示例
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
| 部分 | 名称 | 内容说明 |
|---|---|---|
| Header | 头部 | 令牌类型(typ)与签名算法(alg),如 HS256、RS256 |
| Payload | 载荷 | 声明(Claims):用户身份、权限、过期时间等业务数据 |
| Signature | 签名 | 对 Header 和 Payload 的防篡改校验值 |
注意:Payload 仅经过 Base64URL 编码,并未加密。任何持有令牌的人都可以解码读取其中的内容。切勿在 Payload 中存放密码、密钥等敏感信息。
1.2 JWT 与传统 Session 认证的区别
传统 Session 认证采用“服务端存储会话”模式,而 JWT 采用“客户端持有令牌”模式。两者在架构、扩展性、安全性方面存在本质差异。
| 对比维度 | 传统 Session 认证 | JWT 认证 |
|---|---|---|
| 状态存储 | 服务端内存/Redis 存储 Session | 客户端存储令牌,服务端无状态 |
| 扩展性 | 需要共享 Session 存储(如 Redis 集群) | 天然支持水平扩展,无需共享存储 |
| 跨域支持 | 受限于 Cookie 同源策略 | 通过 Authorization 头,天然支持跨域 |
| 性能开销 | 每次请求需查询 Session 存储 | 仅需验证签名,无需查询外部存储 |
| 令牌失效 | 服务端可立即删除 Session | 需配合黑名单或短有效期实现 |
| 数据体积 | Session ID 很小(通常 32 字节) | JWT 体积较大(通常 500 字节以上) |
架构决策提示:如果系统需要服务端主动撤销用户权限(如强制下线、权限变更),传统 Session 更易实现;如果系统追求无状态、高扩展、跨域微服务架构,JWT 是更优选择。
1.3 JWT 的典型应用场景
JWT 因其无状态、跨域友好、自包含的特性,在以下场景中得到广泛应用:
- 单点登录(SSO):JWT 作为统一的身份令牌,在多个子系统间传递,用户只需登录一次即可访问所有信任的应用。
- 前后端分离架构:前端 SPA 或移动端通过 Authorization 头携带 JWT 访问后端 API,后端无需维护 Session,天然支持跨域。
- 微服务网关认证:API 网关验证 JWT 后将用户身份信息透传给下游服务,下游服务无需重复认证。
- 移动端认证:移动端不依赖 Cookie,JWT 可安全存储在本地存储或 Keychain 中,适合无状态 API 调用。
- 第三方 API 授权:JWT 可作为 Bearer Token 授权第三方应用访问受保护的 API 资源。
场景选择原则:当系统需要无状态、跨域、高扩展性时,优先考虑 JWT;当系统需要服务端主动撤销令牌、精细会话管理时,需结合短有效期 + 刷新令牌机制或回退到 Session 方案。
JWT 在微服务架构中的典型流程
- 用户向认证服务提交凭证(用户名/密码)。
- 认证服务验证成功后,生成 JWT 并返回给客户端。
- 客户端将 JWT 存储在本地(localStorage / 移动端安全存储)。
- 客户端每次请求 API 时,在 HTTP 头中携带
Authorization: Bearer <JWT>。 - API 网关或微服务验证 JWT 签名,提取用户身份与权限信息。
- 服务根据 JWT 中的声明执行授权决策,返回资源或拒绝请求。
# 典型 JWT 请求示例
GET /api/v1/user/profile HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
最佳实践:JWT 应设置合理的过期时间(通常 15 分钟~1 小时),并配合刷新令牌(Refresh Token)实现长期会话管理,避免令牌泄露带来的安全风险。