JWT Token 详解:原理、结构与安全实践
最后更新:2026年5月 · 阅读时间:12分钟
什么是 JWT?
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。它通常用于身份验证和信息交换。
JWT 的核心思想:用一串编码字符串同时携带数据和签名验证,使接收方可以验证数据的完整性。
一个典型的 JWT 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IuW8oOS4iSIsImlhdCI6MTUxNjIzOTAyMn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
它由三部分组成,用 . 分隔:Header、Payload、Signature。
JWT 的结构
1. Header(头部)
Header 包含两部分信息:
alg:签名算法(如 HS256、RS256)typ:令牌类型,通常为JWT
{
"alg": "HS256",
"typ": "JWT"
}
Header 使用 Base64URL 编码后成为 JWT 的第一部分。
2. Payload(载荷)
Payload 包含声明(Claims),即要传输的数据:
{
"sub": "1234567890",
"name": "张三",
"iat": 1516239022
}
标准声明字段:
| 字段 | 含义 |
|---|---|
iss | 签发者(Issuer) |
sub | 主题(Subject) |
aud | 受众(Audience) |
exp | 过期时间(Expiration) |
nbf | 生效时间(Not Before) |
iat | 签发时间(Issued At) |
jti | JWT ID |
重要:Payload 只是 Base64 编码,不是加密。任何人都可以解码查看内容,不要在 Payload 中存放密码、密钥等敏感信息!
3. Signature(签名)
签名用于验证消息的完整性和来源:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
签名确保 JWT 没有被篡改。持有密钥的一方才能生成有效签名。
JWT 的工作流程
- 用户使用账号密码登录
- 服务器验证成功后,生成 JWT 并返回给客户端
- 客户端将 JWT 存储在本地(通常放在 localStorage 或 Cookie 中)
- 后续请求在 Authorization 头部携带 JWT:
Authorization: Bearer <token> - 服务器验证 JWT 签名和有效期,通过后处理请求
使用场景
1. 身份认证(最常见)
用户登录后获取 JWT,后续请求携带 JWT 证明身份。相比 Session,JWT 不需要服务器存储状态,天然支持分布式系统。
2. 信息交换
JWT 可以安全地在系统间传递信息,因为签名可以验证数据未被篡改。
3. 单点登录(SSO)
JWT 的无状态特性使其非常适合 SSO 场景,一次登录即可访问多个系统。
安全注意事项
不要在 Payload 中存放敏感数据
任何人都可以用 Base64 解码查看 Payload 内容。密码、密钥等敏感信息绝不能放入 JWT。
设置合理的过期时间
JWT 一旦签发就无法撤销(除非配合黑名单),因此必须设置 exp 过期时间。建议:
- Access Token:15-30 分钟
- Refresh Token:7-30 天
使用强密钥
HS256 密钥至少 256 位(32 字节),RS256 使用至少 2048 位的 RSA 密钥对。
选择合适的算法
| 算法 | 类型 | 适用场景 |
|---|---|---|
| HS256 | 对称加密 | 单一服务,简单快速 |
| RS256 | 非对称加密 | 微服务,需要多方验证 |
| ES256 | 椭圆曲线 | 需要更短令牌的场景 |
防止常见攻击
- 算法篡改攻击:始终在服务端明确指定算法,不要从 JWT Header 中取
- None 算法攻击:拒绝
alg: "none"的 JWT - 密钥泄露:密钥存放在环境变量中,不要硬编码
常见问题
JWT 和 Session 有什么区别?
| 特性 | JWT | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务端 |
| 扩展性 | 天然支持分布式 | 需要共享存储 |
| 撤销 | 困难(需黑名单) | 直接删除 |
| 大小 | 较大(KB级) | 仅 Session ID |
| 跨域 | 方便 | 需要额外处理 |
JWT 可以被撤销吗?
标准 JWT 无法直接撤销。常用方案:1)设置短过期时间 + Refresh Token;2)维护 Token 黑名单;3)在 Payload 中加入版本号,在服务端校验。
JWT 应该存在哪里?
- HttpOnly Cookie:最安全,防 XSS,但需处理 CSRF
- localStorage:方便但易受 XSS 攻击
- 内存:最安全但刷新丢失
提示:使用我们的在线 JWT 解码器可以快速查看任何 JWT 的 Header 和 Payload 内容。