JWT解码工具
解码并检查JSON Web Token
JWT令牌
什么是 JWT(JSON Web Token)?
JSON Web Token(JWT)是一种紧凑、URL 安全的令牌格式,由 RFC 7519 定义。它将一组声明(claims)编码为 JSON 对象,然后对其进行签名——并可选择加密——以便接收方能够验证数据未被篡改。JWT 是 REST API、单点登录系统和微服务授权中无状态认证的事实标准。
JWT 结构:Header · Payload · Signature
每个 JWT 由三个以点分隔的 base64url 编码段组成。Header 和 Payload 是普通 JSON——任何人都可以读取——而 Signature 是一个加密值,只有使用正确的密钥才能验证。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkFsaWNlIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzE3MjAwMDAwLCJleHAiOjE3MTcyMDM2MDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "user123",
"name": "Alice",
"role": "admin",
"iat": 1717200000,
"exp": 1717203600
}为什么要使用 JWT 解码器?
原始 JWT 看起来像随机文本。此工具可立即将 Header 和 Payload 渲染为格式化的 JSON,让您无需编写任何代码即可检查声明、核查过期时间并审查算法选择。
JWT 标准声明参考
RFC 7519 定义了七个已注册的声明名称。这些并非强制要求,但强烈建议使用以确保互操作性。您可以在 Payload 中添加任意自定义声明。
| 声明 | 说明 | 类型 |
|---|---|---|
| iss | 签发者 — 标识令牌的签发方——例如您的认证服务器 URL 或应用名称。 | string |
| sub | 主题 — 标识 JWT 所描述的主体——通常是用户 ID 或服务账号。 | string |
| aud | 受众 — 标识预期接收者。接收方必须验证此值与其自身标识符匹配。 | string | string[] |
| exp | 过期时间 — Unix 时间戳,超过此时间后令牌不得被接受。务必设置此值以限制令牌被盗后的损害。 | number |
| nbf | 生效时间 — Unix 时间戳,在此时间之前令牌不得被接受。适用于安排未来生效的令牌。 | number |
| iat | 签发时间 — 令牌签发时的 Unix 时间戳。用于计算令牌的使用时长。 | number |
| jti | JWT ID — 令牌的唯一标识符。通过在服务端存储和检查已使用的 JTI 值来实现令牌吊销。 | string |
JWT 签名算法
Header 声明 alg 标明签名所用的算法。选择会影响安全性、性能,以及第三方服务能否在不持有私钥的情况下验证令牌。
| 算法 | 算法族 | 密钥类型 | 备注 |
|---|---|---|---|
| HS256 | HMAC | Symmetric | 最常用。共享密钥——任何持有密钥的人都可以签名和验证。 |
| HS384 | HMAC | Symmetric | 更强的 HMAC 变体;有一定性能开销。 |
| HS512 | HMAC | Symmetric | 最强的 HMAC 变体。 |
| RS256 | RSA | Asymmetric | 最广泛使用的非对称算法(Google、Auth0、Okta)。公钥可在不持有私钥的情况下进行验证。 |
| RS384 | RSA | Asymmetric | 安全性更高的 RS 变体。 |
| RS512 | RSA | Asymmetric | 最强的 RS 变体。 |
| ES256 | ECDSA | Asymmetric | 椭圆曲线——签名比 RSA 更短,在移动端和 IoT 设备上广受欢迎。 |
| PS256 | RSA-PSS | Asymmetric | RSA-PSS:比基于 PKCS1v1.5 的 RS256 更现代、更安全。 |
| none | — | — | 无签名——极度危险。生产环境中绝不接受 alg: none 的令牌。 |
安全注意事项
解码 JWT 本身始终是安全的。但在未进行正确签名验证的情况下信任 JWT 则不安全。在应用中使用令牌时,请牢记以下规则。
- –在开发者工具或此工具中解码和检查 JWT
- –使用 exp、iat 和 nbf 了解令牌的有效期
- –记录 Payload 声明用于调试(省略敏感个人信息)
- –读取 alg header 以了解令牌的签名方式
- –在未于服务端验证签名的情况下信任 Payload 中的声明
- –接受 alg: none 的令牌——这意味着完全没有签名
- –在高安全要求的应用中将访问令牌存储在 localStorage(应优先使用 httpOnly cookie)
- –为携带敏感权限的令牌将 exp 设置得过于靠后
常见使用场景
在代码中解码 JWT
Header 和 Payload 使用 base64url 编码——只需反向解码即可。Base64url 将 + 替换为 -,将 / 替换为 _,并省略 = 填充。只有 Signature 需要密钥。
function decodeJWT(token) {
const [, payload] = token.split('.')
const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
return JSON.parse(json)
}const [, payload] = token.split('.')
const decoded = JSON.parse(
Buffer.from(payload, 'base64url').toString()
)import base64, json
def decode_jwt(token):
payload = token.split('.')[1]
padding = '=' * (-len(payload) % 4)
return json.loads(base64.urlsafe_b64decode(payload + padding))TOKEN="eyJhbGc..." echo $TOKEN | cut -d. -f2 | base64 -d 2>/dev/null | jq .