如何解码并检查 JWT 令牌
JSON Web Token(JWT)是现代 Web 应用中管理认证最常见的方式。当认证出问题时 · 用户莫名其妙被登出、权限错误,或 API 返回 401 · 解码 JWT 通常是调试的第一步。
JWT 包含什么
JWT 有三部分,用点号分隔:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
Header(头部)· 包含算法(HS256、RS256 等)和令牌类型。
{"alg": "HS256", "typ": "JWT"}
Payload(载荷)· 包含关于用户和令牌的 claims(声明)。
{"sub": "1234567890", "name": "Alice", "exp": 1700000000}
Signature(签名)· 确保令牌未被篡改的加密指纹。没有签名密钥无法读取。
常见的 JWT claims
| Claim | 全名 | 内容 |
|---|---|---|
sub |
Subject | 用户 ID 或标识符 |
exp |
Expiration | 令牌过期的 Unix 时间戳 |
iat |
Issued At | 令牌创建时的 Unix 时间戳 |
iss |
Issuer | 创建令牌的主体(您的认证服务器) |
aud |
Audience | 令牌的预期接收方 |
nbf |
Not Before | 此时间之前令牌无效 |
jti |
JWT ID | 唯一的令牌标识符 |
如何解码 JWT
- 粘贴您的令牌· 将完整的 JWT(header.payload.signature 格式)输入到解码器中。
- 查看解码的各段· 工具以格式化 JSON 显示 header(算法)、payload(claims)和 signature。
- 核对 claims· 检查过期日期、签发者、主题和任何自定义 claims。
用 JWT 调试
令牌已过期?检查 exp claim。将 Unix 时间戳转换为可读日期。如果在过去,说明令牌已过期,需要刷新。
权限错误?在 payload 中查找角色或作用域的 claims。实现各异,但常见如 "role": "admin" 或 "scope": "read write"。
用户身份有问题?sub claim 标识用户。确认它匹配预期的 ID。
令牌被拒绝?检查 aud(audience)claim。如果 API 期望特定 audience 而令牌带有不同的 audience,它将被拒绝。
重要的安全注意事项
- JWT 未加密· 任何人都能解码 payload。不要在 JWT 中放入密码、API 密钥或其他机密。
- 始终在服务器端验证签名· 解码器显示令牌声称的内容,但只有签名验证才能证明它未被篡改。
- 检查过期· 过期令牌应始终被拒绝。如果您的应用接受过期令牌,这是安全漏洞。
常见问题
可以用解码器验证 JWT 签名吗?
不能。签名验证需要签名密钥或公钥,它们存在您的服务器上。解码器显示令牌中的内容,但加密验证必须在您的后端进行。生产环境中绝不要信任未经验证的 JWT。
将 JWT 粘贴到在线工具安全吗?
当工具在浏览器中运行时是安全的。浏览器内的解码器本地处理令牌 · 不会向服务器发送任何内容。避免使用会用您的令牌发出网络请求的工具。
exp claim 是什么?
exp(expiration)claim 是一个 Unix 时间戳,指示令牌何时过期。超过此时间后,令牌应被拒绝。始终检查此 claim 来调试认证问题。
JWT 可以加密吗?
标准 JWT(JWS)是签名而非加密的 · 任何人都能解码 payload。JWE(JSON Web Encryption)令牌是加密的,但不太常见。绝不要将敏感数据(密码、机密)放入标准 JWT payload 中。