
快速 JWT 参考
JSON Web 令牌(JWT)是用于身份验证和信息交换的紧凑、自包含的令牌。本指南涵盖了使用 JWT 的基本参考信息。

JWT 结构一览
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
│──────────────────────────────────────│──────────────────────────────────────────────────────│──────────────────────────────────────────────────│
Header Payload Signature
每个部分都是 Base64URL 编码的,并用点分隔。
标准 JWT 声明
| 声明 | 名称 | 类型 | 描述 |
|---|---|---|---|
iss |
Issuer | 字符串 | 令牌的签发者 |
sub |
Subject | 字符串 | 令牌主题(通常是用户 ID) |
aud |
Audience | 字符串/数组 | 令牌的目标受众 |
exp |
Expiration | 数字 | 过期时间的 Unix 时间戳 |
nbf |
Not Before | 数字 | 在此时间之前无效的 Unix 时间戳 |
iat |
Issued At | 数字 | 签发时间的 Unix 时间戳 |
jti |
JWT ID | 字符串 | 唯一令牌标识符 |

常见签名算法
| 算法 | 类型 | 描述 |
|---|---|---|
| HS256 | 对称 | HMAC with SHA-256。签名和验证使用相同的密钥。简单但需要共享密钥。 |
| HS384 | 对称 | HMAC with SHA-384。比 HS256 更强。 |
| HS512 | 对称 | HMAC with SHA-512。最强的 HMAC 变体。 |
| RS256 | 非对称 | RSA with SHA-256。私钥签名,公钥验证。 |
| RS384 | 非对称 | RSA with SHA-384。 |
| RS512 | 非对称 | RSA with SHA-512。 |
| ES256 | 非对称 | ECDSA with P-256。密钥比 RSA 更小。 |
| PS256 | 非对称 | RSA-PSS with SHA-256。比 RS256 更安全。 |
| EdDSA | 非对称 | Ed25519。现代、快速、安全。 |
如何验证 JWT
// Node.js - 使用 jsonwebtoken
const jwt = require('jsonwebtoken');
// 使用对称密钥验证
try {
const decoded = jwt.verify(token, 'your-secret-key');
console.log(decoded.sub, decoded.exp);
} catch (err) {
// TokenExpiredError, JsonWebTokenError, NotBeforeError
}
// 使用公钥验证 (RS256)
const publicKey = fs.readFileSync('public.pem');
const decoded = jwt.verify(token, publicKey, { algorithms: ['RS256'] });
# Python - 使用 PyJWT
import jwt
decoded = jwt.decode(token, secret, algorithms=["HS256"])

JWT 安全检查清单
在信任任何声明之前,始终在服务器端验证签名。检查 exp 声明并拒绝过期的令牌。明确指定允许的算法以防止算法混淆攻击。切勿在载荷中存储敏感数据,因为它只是 Base64 编码,而非加密。使用较短的过期时间(访问令牌 15-60 分钟)并结合刷新令牌。如果需要,通过黑名单实现令牌撤销。使用 HTTPS 防止令牌拦截。将令牌存储在 HttpOnly cookie 或内存中,而不是 localStorage,以减少 XSS 风险。
无需验证的解码
有时您需要读取 JWT 中的声明而不进行验证(例如,在进行网络调用刷新之前检查过期时间):
// 警告:请勿用于安全决策
const parts = token.split('.');
const payload = JSON.parse(atob(parts[1]));
console.log(payload.exp); // Unix 时间戳
这仅适用于显示目的或预验证检查。
JWT 与 Session 令牌
Session 将状态存储在服务器端(数据库或 Redis 中),并仅向客户端提供一个不透明的 ID。JWT 将状态直接嵌入令牌中,使服务器无状态。这使得 JWT 非常适合微服务和分布式系统,其中每个服务都可以使用公钥独立验证令牌,而无需进行数据库调用。
其代价是 JWT 更难撤销:在过期之前无法使已签名的 JWT 失效,除非维护服务器端的黑名单(这在一定程度上抵消了无状态的好处)。
使用此工具
粘贴任何 JWT 即可立即解码并检查头部、载荷和签名。该工具显示:
- 头部中的算法和令牌类型
- 所有声明,数值型日期显示为人类可读的时间戳
- 过期状态(有效、已过期或剩余时间)
- 每个部分的原始 Base64URL 解码内容
-> 尝试 JWT 解析器