JWT(JSON Web Token)结构化知识体系详解
基于 RFC 7519 标准,系统讲解 JWT(JSON Web Token)的知识体系。涵盖基础定义、三段式结构、签名原理、算法分类及优劣势分析。重点阐述生产环境安全规范,包括 HTTPS 传输、非对称加密选择、令牌存储策略及黑名单机制。提供双令牌无感刷新、分布式架构落地等工程化最佳实践,并对比 Session-Cookie 与 OAuth2.0 关系,帮助开发者构建安全可靠的认证方案。

基于 RFC 7519 标准,系统讲解 JWT(JSON Web Token)的知识体系。涵盖基础定义、三段式结构、签名原理、算法分类及优劣势分析。重点阐述生产环境安全规范,包括 HTTPS 传输、非对称加密选择、令牌存储策略及黑名单机制。提供双令牌无感刷新、分布式架构落地等工程化最佳实践,并对比 Session-Cookie 与 OAuth2.0 关系,帮助开发者构建安全可靠的认证方案。

本文基于 RFC 7519 国际标准,从基础认知、核心结构、原理流程、算法体系、特性优劣、安全合规、工程实战、避坑指南、横向对比、进阶场景 10 个维度,构建 JWT 完整的结构化知识体系,覆盖从入门到生产落地的全链路内容。
JWT(JSON Web Token)是 RFC 7519 定义的开放行业标准,用于在网络环境中以紧凑、自包含、可验证的方式,在多方之间安全传输 JSON 格式的声明信息。
解决传统 Session-Cookie 认证机制的核心痛点:
| 核心适用场景 | 不适用场景 |
|---|---|
| 前后端分离架构的身份认证 | 需要频繁撤销令牌、强制全平台登出的场景 |
| 微服务/分布式系统的跨服务认证 | 超大量用户、权限实时动态变更的核心系统 |
| 跨域/跨机构的授权与信息交换 | 需要存储大量敏感信息的场景 |
| 移动端 APP/小程序/IoT 设备认证 | 需要精准统计在线用户、会话管理的场景 |
标准 JWT(JWS)采用三段式.分隔结构,格式为:[Header].[Payload].[Signature],每一段均采用 Base64URL 编码(URL 安全的 Base64,替换 +//、去除 = 填充,非普通 Base64)。
JSON 对象,描述 JWT 的元数据,Base64URL 编码后为第一段字符串,核心作用是声明令牌类型与签名算法。
| 字段 | 必选 | 含义与规范 |
|---|---|---|
| alg | 是 | 签名/加密算法,如 HS256、RS256、ES256,none 表示无签名(生产环境绝对禁用) |
| typ | 否 | 令牌类型,固定值 JWT |
| kid | 否 | 密钥 ID,多密钥场景下用于快速匹配验签密钥 |
| cty | 否 | 内容类型,嵌套 JWT 时固定为 JWT |
示例:
{"alg":"RS256","typ":"JWT","kid":"key-202603"}
JSON 对象,存放核心声明(Claims)与业务数据,Base64URL 编码后为第二段字符串。
⚠️ 关键警告:Base64URL 是编码而非加密,Payload 内容任何人拿到令牌均可解码,绝对禁止存放密码、身份证、手机号等敏感信息。
Payload 的 Claims 分为三类:
注册声明(RFC 预定义,推荐必用)
| 字段 | 全称 | 核心含义 |
|---|---|---|
| iss | issuer | 令牌签发人 |
| sub | subject | 令牌主题,通常为用户唯一 ID |
| aud | audience | 令牌受众,接收方标识 |
| exp | expiration time | 过期时间,Unix 时间戳,验签必须强制校验 |
| nbf | not before | 生效时间,该时间前令牌无效 |
| iat | issued at | 签发时间,Unix 时间戳 |
| jti | JWT ID | 令牌唯一标识,用于防重放、黑名单管理 |
示例:
{"sub":"user_123456","iss":"auth-center","aud":"business-system","iat":1710000000,"exp":1710009000,"jti":"token_abc123def456","role":"admin","tenant_id":"tenant_789"}
JWT 的核心安全屏障,防止 Header 和 Payload 被篡改,为第三段字符串。
签名算法 ( Base64URL(Header) + "." + Base64URL(Payload) , 密钥/私钥 )Authorization 字段,标准格式:Authorization: Bearer <JWT 令牌>401 Unauthorized/403 Forbidden日常使用的 JWT 默认是 JWS,JWE 用于高安全敏感场景,核心对比如下:
| 特性 | JWS(JSON Web Signature) | JWE(JSON Web Encryption) |
|---|---|---|
| 核心目标 | 防内容篡改、身份可验证 | 防篡改 + 内容加密,保障数据机密性 |
| 结构 | 三段式(Header.Payload.Signature) | 五段式(受保护头。加密密钥.IV.密文。认证标签) |
| 内容可见性 | Payload Base64 编码,明文可见 | Payload 对称加密,仅持有私钥方可解密 |
| 性能 | 高,仅签名/验签计算 | 低,需加解密 + 验签双重计算 |
| 适用场景 | 非敏感信息传递、通用身份认证 | 敏感信息传输、高安全级别的跨机构调用 |
| 普及度 | 极高,行业默认方案 | 较低,仅高安全场景使用 |
分为对称加密、非对称加密两大类,生产环境优先选择非对称算法。
none 无签名算法,生产环境绝对禁用,攻击者可任意伪造令牌。
| 风险类型 | 风险详情 | 强制防护方案 |
|---|---|---|
| 令牌篡改攻击 | 攻击者修改 Payload 权限/用户 ID,伪造身份 | 1. 强制校验签名,禁用 none 算法;2. 验签时强制指定算法,禁止信任 Header 中的 alg 字段,防止算法替换攻击;3. 生产环境优先使用非对称算法 |
| 令牌窃取攻击 | XSS 攻击窃取客户端令牌、中间人攻击窃取传输中的令牌 | 1. 强制 HTTPS 传输,禁止 HTTP 明文;2. 客户端优先使用 HttpOnly+Secure+SameSite Cookie 存储,禁止 localStorage 存储;3. 缩短访问令牌有效期;4. 实现 IP/User-Agent 绑定,异常环境直接拒绝 |
| 不可撤销风险 | 用户登出/权限变更后,原令牌依然有效 | 1. 短有效期 + 双令牌刷新机制;2. 基于 Redis 的分布式黑名单系统,按 jti 作废令牌;3. 令牌版本号机制,用户状态变更时升级版本号,验签时校验;4. 定期密钥轮转 |
| 重放攻击 | 攻击者窃取令牌后重复发起请求 | 1. 强制校验 exp/nbf,缩短有效期;2. 用 jti 记录已使用令牌,防重放;3. 重要接口增加时间戳 +nonce 随机数校验 |
| 敏感信息泄露 | Payload 存放敏感信息被解码泄露 | 1. Payload 仅存放必要的非敏感信息;2. 绝对禁止存放密码、身份证等敏感数据;3. 必须传输敏感信息时使用 JWE 加密方案 |
| 密钥管理风险 | 密钥硬编码、弱密钥、泄露 | 1. 密钥通过 KMS/配置中心管理,禁止硬编码;2. 对称密钥长度≥256 位,RSA 密钥≥2048 位(优先 4096 位);3. 不同环境密钥完全隔离,定期轮转 |
| 越权攻击 | 攻击者利用伪造的权限字段越权访问 | 1. 核心接口/高敏感操作必须二次校验权限,不单独信任 JWT;2. 高风险操作(转账、改密、管理员操作)必须二次身份校验 |
✅ 强制 HTTPS 传输,全链路加密
✅ 优先使用 RS256/ES256 非对称算法,避免 HS256 对称算法
✅ 强制校验签名、exp、nbf、iss、aud 核心字段
✅ 绝对禁用 none 算法,禁用弱加密算法
✅ 访问令牌有效期控制在 30 分钟内,敏感场景≤15 分钟
✅ 客户端令牌存储优先 HttpOnly+Secure+SameSite Cookie
✅ 实现分布式黑名单机制,支持令牌主动作废
✅ 密钥通过专业 KMS 管理,定期轮转,环境隔离
✅ 高敏感操作二次身份校验,不单独依赖 JWT
✅ 验签时强制指定算法,防范算法替换攻击
| 编程语言 | 主流实现库 |
|---|---|
| Java | JJWT、Auth0 java-jwt、Spring Security OAuth2 原生集成 |
| Python | PyJWT、python-jose |
| Node.js | jsonwebtoken、jose |
| Go | golang-jwt/jwt |
| PHP | firebase/php-jwt |
| C# | System.IdentityModel.Tokens.Jwt |
解决「短有效期安全要求」与「用户免频繁登录体验」的核心矛盾,是生产环境的标准方案。
| 对比维度 | JWT | Session-Cookie |
|---|---|---|
| 状态存储 | 客户端存储,服务端无状态 | 服务端存储 Session,客户端仅存 SessionID |
| 分布式适配 | 天然支持,无额外开发 | 需要 Session 共享,复杂度高 |
| 跨域支持 | 原生支持,无限制 | 受同源策略限制,跨域配置复杂 |
| 多端适配 | 全端完美支持 | 移动端/IoT 适配性差 |
| 核心安全风险 | XSS 窃取、不可撤销、篡改 | CSRF、Session 劫持、固定会话 |
| 服务端压力 | 低,仅验签,无需查库 | 高,每次请求需查询 Session 存储 |
| 网络开销 | 较高,令牌体积大 | 低,仅 SessionID |
| 权限实时性 | 差,需等待令牌过期 | 好,服务端可实时修改 |
| 强制登出 | 需额外黑名单机制 | 原生支持,直接删除 Session 即可 |
| 方案等级 | 实现方式 | 适用场景 |
|---|---|---|
| 轻量级 | 短 Access Token 有效期+Refresh Token 黑名单,用户登出仅作废 Refresh Token,Access Token 自然过期 | 中小规模系统、非核心业务、低安全要求场景 |
| 中量级 | Redis 分布式黑名单,将需作废的令牌 jti 存入黑名单,过期时间与令牌 exp 一致,验签时先查黑名单 | 中大型系统、核心业务、高安全要求场景 |
| 重量级 | 令牌版本号机制,用户表维护 token_version,签发时存入 Payload,用户状态变更时升级版本号,验签时校验与数据库是否一致 | 超大规模系统、金融/政务等高安全等级场景 |
| 紧急方案 | 密钥轮转,立即更换签名密钥,旧密钥签发的所有令牌全部失效 | 密钥泄露、大规模安全事件等紧急场景 |
tenant_id 租户 ID 字段,网关验签后透传给下游服务,实现多租户数据隔离内网/离线环境下,客户端可本地完成 JWT 签名校验,无需联网与服务端交互,完美适配 IoT 设备、离线工业系统、内网应用等场景。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online