跳到主要内容
API 测试2026-07-145 分钟阅读

在线 JWT 生成器/解码器:JSON Web Token 工具

什么是 JWT

JWT(JSON Web Token)是一种紧凑的、URL 安全的令牌格式,用于在各方之间安全地传输信息。它由三部分组成:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0In0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
|________ Header ________| |________ Payload ________| |________ Signature ________|

三部分结构

部分内容说明
Header算法和类型{"alg":"HS256","typ":"JWT"}
Payload载荷数据用户信息、过期时间等
Signature签名验证令牌完整性

为什么需要 JWT

  1. 无状态认证:服务器无需存储会话信息
  2. 跨域支持:天然支持 CORS 和跨域请求
  3. 微服务间通信:服务间安全传递用户身份
  4. API 访问控制:保护 API 端点的安全
  5. 单点登录(SSO):多个系统共享认证状态
  6. 移动端认证:适合前后端分离架构

JWT vs Session

特性JWTSession
存储位置客户端(Cookie/Header)服务器端
扩展性✅ 天然分布式❌ 需要共享存储
无状态✅ 服务器无需存储❌ 服务器维护状态
注销困难⚠️ 无法立即失效✅ 服务器删除即可
数据泄露⚠️ Payload 仅 Base64 编码✅ 数据在服务器端

如何使用站内 JWT 生成器

使用 ToolVault 工具匣 的 JWT 生成器:

  1. 选择签名算法:HS256 / HS384 / HS512(浏览器 Web Crypto 本地 HMAC)
  2. 点选 Claims 模板(Access / Refresh / 服务间),或手写 Payload JSON
  3. 用 exp 快捷按钮(5 分钟~24 小时,或「已过期」)和「nbf = 现在」写入时间声明
  4. 填入测试用 HMAC 密钥 → 生成紧凑 JWS
  5. 复制到 Authorization: Bearer,或点链接用 JWT 解码器 核对 Header / Payload / 时间线

补充:雪花 ID 等超过 JavaScript 安全整数范围的字段按数字原文保留,签发后再解码不会被静默舍入。非对称算法(RS256/ES256)需要私钥,应在服务端签发;解码器仍可用来查看这类令牌的明文 claims。

代码中的 JWT 使用

Node.js(生成和验证)

const jwt = require('jsonwebtoken');

// 生成 JWT
const token = jwt.sign(
  { sub: '12345', name: '张三', role: 'admin' },
  'your-secret-key',
  { expiresIn: '24h' }
);

// 验证 JWT
const decoded = jwt.verify(token, 'your-secret-key');
console.log(decoded); // { sub: '12345', name: '张三', ... }

Python

import jwt
from datetime import datetime, timedelta, timezone

# 生成 JWT
payload = {
    'sub': '12345',
    'name': '张三',
    'exp': datetime.now(timezone.utc) + timedelta(hours=24)
}
token = jwt.encode(payload, 'your-secret-key', algorithm='HS256')

# 验证 JWT
decoded = jwt.decode(token, 'your-secret-key', algorithms=['HS256'])
print(decoded)

JWT 签发时的安全做法

  1. 使用强密钥:HS256 至少 256 位熵;人敲的短口令不够
  2. 设置短过期时间:Access Token 常见 15 分钟量级
  3. 使用 Refresh Token:长生命周期刷新,短生命周期访问
  4. 不要存储敏感信息:Payload 仅 Base64URL 编码,不是加密
  5. 使用 HTTPS:防止令牌在传输中被窃取
  6. 验证签名:服务端钉死算法列表,永不盲信 header 里的 alg

签名算法选择矩阵

多数团队需要的那张表:HS256(共享密钥 HMAC)适合单服务——实现简单,但任何能验证的一方也能伪造。第二个服务要验证的那一刻就该换 RS/ES256(非对称):私钥签名、公钥发布(通常 JWKS 端点),验证方永不持有签名能力。ES256 在同等安全强度下通常 token 更小、验证更快。验证器无条件拒绝 alg: none——2015 年的算法混淆攻击就诞生于此。服务端钉死算法:永不信任头部 alg 声明来决定走哪条验证路径。

站内生成器覆盖 HMAC 三档,是因为浏览器 Web Crypto 对 HMAC 行为一致;EdDSA/非对称进工具矩阵的节奏取决于浏览器碎片化收敛——见 Ed25519 为何值得关注。

exp、iat 与时钟偏移

三个时间 claim 造成的生产事故比密码学多。exp 按「当前必须早于 exp」验证,但两台机器很少对「当前」达成一致——5 秒偏移就会拒掉完全有效的 token。标准解法是 leeway(接受过期后 N 秒内的 token,30–60 秒常见),不是时钟同步圣战。生成器不写 exp 等于生成永不过期的 token——测试无所谓,生产是审计发现。测试过期流程:用生成器的「已过期」按钮签一个 token,看 401 是否按时到来。更细的时钟偏移讨论见 JWT exp/nbf 与时钟偏移。

密钥住哪里

最常见的 JWT 事故不是算法弱——是签名密钥硬编码进了公开仓库。把 HMAC 密钥当数据库密码对待:环境注入、轮换、至少 256 bit 熵。RS/ES256 的私钥进 KMS 或密钥管理器,只有公钥随产品分发。快速自查:在代码库里搜你签名用的字符串——出现在源码里就立刻轮换。本站生成器页面会短暂持有你粘贴的密钥:只适合测试密钥。

FAQ

JWT 的 Payload 是加密的吗?

不是。JWT Payload 仅经过 Base64URL 编码,任何人都可以解码查看内容。不要在 JWT 中存储密码、信用卡号等敏感信息。如果需要加密,使用 JWE(JSON Web Encryption)。

JWT 过期后怎么办?

使用 Refresh Token 机制。Access Token 过期后,用 Refresh Token 获取新的 Access Token,避免用户重新登录。生成器里的 Refresh 模板(约 7 天)与 Access 模板(约 15 分钟)可用来本地演练这条链路。

如何让 JWT 立即失效?

标准 JWT 无法立即失效(无状态设计)。解决方案:维护黑名单(将已注销的 JWT 加入黑名单),或者使用短过期时间减少风险窗口。

为什么生成器不签发 RS256?

非对称签发需要私钥,浏览器页面临时持有生产私钥的风险远高于 HMAC 测试密钥。联调非对称流程时,在服务端用测试密钥对签发,再用 JWT 解码器 查看 claims 即可。

实现注记

FAQ 里「签发后拿去解码器看 claims」不是客套:解码器支持 /tools/jwt-decoder?token=... 深链,api-tester 等工具可以直接带着 token 跳过去。深链参数仅挂载时读一次,不会和用户后续的输入形成双写竞争。


感谢阅读这篇 ToolVault 工具匣 技术文章。更多开发者工具请访问 首页。