正在加载,请稍候…

JWT 详解:如何读取和验证 JSON Web Token

解码并检查任何 JWT 令牌。了解标头、载荷、签名、过期时间和常见安全错误。

JWT 详解:如何读取和验证 JSON Web Token

什么是 JWT?

JSON Web Token (JWT) 是一种紧凑且自包含的方式,用于在各方之间以签名 JSON 对象的形式传输信息。由于经过数字签名,这些信息可以被验证和信任。JWT 可以使用密钥(HMAC)或公钥/私钥对(RSA、ECDSA)进行签名。

JWT 广泛用于现代 Web 应用和 API 中的身份验证(确认用户身份)和授权(确定用户权限)。

JWT 详解:如何读取和验证 JSON Web Token 插图

三部分结构

JWT 由三个 Base64URL 编码的部分组成,用点分隔:

xxxxx.yyyyy.zzzzz
header.payload.signature

第一部分:标头 (Header)

{
  "alg": "HS256",
  "typ": "JWT"
}

标头声明令牌类型和签名算法。常见算法:

  • HS256 — 使用 SHA-256 的 HMAC(对称——签名和验证使用相同密钥)
  • RS256 — 使用 SHA-256 的 RSA(非对称——私钥签名,公钥验证)
  • ES256 — 使用 P-256 的 ECDSA(非对称——密钥比 RSA 小)

第二部分:载荷 (Payload / Claims)

{
  "sub": "user_12345",
  "email": "user@example.com",
  "role": "admin",
  "iat": 1716000000,
  "exp": 1716086400
}

声明是关于实体(用户)和附加元数据的陈述。

注册声明 (Registered Claims, RFC 7519):

声明 名称 描述
iss Issuer 令牌签发者(例如 "https://auth.example.com")
sub Subject 令牌主题,通常是用户 ID
aud Audience 令牌的目标受众
exp Expiration 令牌过期时的 Unix 时间戳
iat Issued At 令牌签发时的 Unix 时间戳
jti JWT ID 唯一令牌标识符(用于撤销)

自定义声明: 你可以添加任何需要的声明(roleemailplan 等)。保持载荷小巧——它会在每个请求中传输。

第三部分:签名 (Signature)

HMACSHA256(
  base64url(header) + "." + base64url(payload),
  secret_key
)

签名确保令牌未被篡改。对于 HMAC 签名的令牌,只有拥有密钥的方才能创建有效签名。对于 RSA 签名的令牌,任何拥有公钥的人都可以验证签名,但只有私钥持有者才能创建签名。

JWT 详解:如何读取和验证 JSON Web Token 插图

JWT 身份验证工作原理

  1. 用户使用凭据登录。
  2. 服务器验证凭据,创建包含用户声明的 JWT,使用密钥签名。
  3. 服务器将 JWT 返回给客户端。
  4. 客户端存储 JWT(通常在内存或 localStorage 中),并在后续请求的 Authorization 标头中包含它:Authorization: Bearer <token>
  5. 服务器接收请求,验证 JWT 签名,检查 exp,读取声明。
  6. 服务器根据声明处理请求。

服务器无需维护会话状态——JWT 本身携带所有必要信息。

安全陷阱及如何避免

1. 算法混淆攻击

某些 JWT 库接受 "alg: none"(无签名),允许攻击者伪造令牌。始终在服务器端指定并验证预期的算法。

2. 未经验证就信任载荷

载荷是 Base64 编码的——并非加密。任何人都可以解码。在验证签名之前,切勿信任载荷数据。

JWT 详解:如何读取和验证 JSON Web Token 插图

3. 弱密钥

过短或可预测的 HMAC 密钥可能被破解。对于 HS256 密钥,至少使用 256 位的随机数据。

4. 未检查过期时间

始终验证 exp 声明。即使签名有效,过期的令牌也应被拒绝。

5. 在载荷中存储敏感数据

由于载荷未加密,切勿在 JWT 声明中存储密码、信用卡号或其他机密信息。

6. 无令牌撤销机制

JWT 是无状态的——一旦签发,在 exp 之前一直有效。要在过期前撤销令牌,可以维护一个黑名单(按 jti)或使用短生命周期令牌(15 分钟)配合刷新令牌。

JWT 与会话令牌对比

JWT 服务器会话
存储位置 客户端 服务器(数据库/Redis)
可扩展性 优秀(无状态) 需要共享状态
撤销 困难 容易
载荷可见性 公开(Base64) 私有
最佳适用场景 API、微服务 单体 Web 应用

使用此工具读取 JWT

将任何 JWT 粘贴到解析器中,即可立即查看:

  • 解码后的标头和载荷,格式化为 JSON
  • 过期状态(已过期/有效/剩余时间)
  • 签名算法
  • 所有声明及可读的时间戳

所有处理均在浏览器中完成——你的令牌永远不会发送到任何服务器。

→ 尝试 JWT 解析器