在线 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
- 无状态认证:服务器无需存储会话信息
- 跨域支持:天然支持 CORS 和跨域请求
- 微服务间通信:服务间安全传递用户身份
- API 访问控制:保护 API 端点的安全
- 单点登录(SSO):多个系统共享认证状态
- 移动端认证:适合前后端分离架构
JWT vs Session
| 特性 | JWT | Session |
|---|---|---|
| 存储位置 | 客户端(Cookie/Header) | 服务器端 |
| 扩展性 | ✅ 天然分布式 | ❌ 需要共享存储 |
| 无状态 | ✅ 服务器无需存储 | ❌ 服务器维护状态 |
| 注销困难 | ⚠️ 无法立即失效 | ✅ 服务器删除即可 |
| 数据泄露 | ⚠️ Payload 仅 Base64 编码 | ✅ 数据在服务器端 |
如何使用站内 JWT 生成器
使用 ToolVault 工具匣 的 JWT 生成器:
- 选择签名算法:
HS256/HS384/HS512(浏览器 Web Crypto 本地 HMAC) - 点选 Claims 模板(Access / Refresh / 服务间),或手写 Payload JSON
- 用 exp 快捷按钮(5 分钟~24 小时,或「已过期」)和「nbf = 现在」写入时间声明
- 填入测试用 HMAC 密钥 → 生成紧凑 JWS
- 复制到
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 签发时的安全做法
- 使用强密钥:HS256 至少 256 位熵;人敲的短口令不够
- 设置短过期时间:Access Token 常见 15 分钟量级
- 使用 Refresh Token:长生命周期刷新,短生命周期访问
- 不要存储敏感信息:Payload 仅 Base64URL 编码,不是加密
- 使用 HTTPS:防止令牌在传输中被窃取
- 验证签名:服务端钉死算法列表,永不盲信 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 工具匣 技术文章。更多开发者工具请访问 首页。
相关工具
相关文章
HTTPS 证书链不完整:浏览器不信任但解码「看起来正常」
叶证书日期有效、SAN 也对,浏览器仍报不受信任?多数是缺中间证书或 fullchain 顺序错。用 openssl s_client 与本地证书解码器逐级核对 Issuer→Subject。
HTTP API 测试完全指南:从基础到高级调试技巧
掌握 HTTP API 测试的核心技巧,包括 GET/POST/PUT/DELETE 请求、请求头配置、请求体格式、认证方式和调试方法。使用在线 API 测试工具提升开发效率。
HTTP GET vs POST:什么时候用哪个?语义、安全与最佳实践
GET 和 POST 的语义差异、幂等性、缓存、URL 长度限制、安全考量、RESTful 约定、常见误用与 curl 示例。附决策表,帮你正确选择 HTTP 方法。