JWT 解码器 · 在线解码工具
免费 JWT 解码器,在线即时解码 JWT 令牌。查看头部、载荷、签名以及过期时间、算法和声明详情。100% 浏览器本地运行——令牌绝不离开你的设备。无需注册、无跟踪。
什么是 JWT?
JSON Web Token,简称 JWT(读作「jot」),是一种紧凑、URL 安全的令牌格式,用于在双方之间传递声明。它由 RFC 7519 定义,是 OAuth 2.0 访问令牌、OpenID Connect ID Token、现代认证服务商(Auth0、Okta、Clerk、Supabase、Firebase)的 API 密钥以及微服务架构中服务间令牌的主流格式。
「JSON Web Token(JWT)是一种紧凑的声明表示格式,适用于 HTTP Authorization 头和 URI 查询参数等空间受限的环境。」——RFC 7519 第 1 节
JWT 由三段用点分隔的 Base64URL 编码 JSON 对象组成:header.payload.signature。头部描述令牌的签名方式(alg 声明——如 HS256 或 RS256,以及 typ 声明,通常为「JWT」)。载荷承载各种声明:注册声明如 iss、sub、aud、exp、iat,以及签发者所需的自定义声明(role、scope、email、租户 ID 等)。签名是在头部和载荷上使用签发者的密钥或私钥计算出的加密凭证,接收方可借此检测篡改。
关键之处在于,JWT 是编码而非加密。任何持有令牌的人都能读取其载荷——解码只是 Base64URL 和 JSON 解析。安全保证来自签名:攻击者可以读取 JWT,但在没有签名密钥的情况下无法产生另一个能通过签名验证的 JWT。这也是为什么 JWT 可以安全地通过网络传输,但不应在其中放入秘密。
JWT 解码器会准确展示令牌的内容——算法、声明、过期时间——而不触碰签名。它是回答「这个令牌过期了吗?」「这个用户是什么角色?」「是哪个签发者签发的?」或「这是一个应当拒绝的 alg:none 令牌吗?」的最快方式。本工具的所有解码都在浏览器本地运行,因此粘贴线上生产令牌也是安全的。
JWT 相关工作常与其他开发工具配合使用。调试格式异常的令牌时,你可能需要解码一个 Base64URL 段;从代理抓取 Authorization 头后可能需要对其进行 URL 解码;或者需要手动将 exp 声明转换为人类日期。如需深入了解生产环境中 JWT 的签名、验证和轮换流程,请阅读我们的 Base64 基础指南——Base64URL 是每个 JWT 的基石。
// Decode a JWT in the browser — header & payload only
function decodeJwt(token) {
const [h, p, s] = token.split('.');
const pad = (seg) => seg + '==='.slice((seg.length + 3) % 4);
const decode = (seg) => JSON.parse(
atob(pad(seg).replace(/-/g, '+').replace(/_/g, '/'))
);
return { header: decode(h), payload: decode(p), signature: s };
}
const { header, payload } = decodeJwt(token);
console.log(header); // → { alg: 'HS256', typ: 'JWT' }
console.log(payload); // → { sub: 'user_123', exp: 1999999999, ... }
// Expiration check
const expired = payload.exp * 1000 < Date.now(); 核心功能
即时解码 JWT
粘贴即可实时看到 JWT 的头部、载荷和签名解码结果。没有解码按钮,也没有任何服务器往返。
过期检测
自动读取 exp 声明,在令牌过期时显示红色标签,并以你的本地时区展示准确的过期日期。
算法无关
可解码所有 JWS 算法——HS256/384/512、RS256/384/512、PS256/384/512、ES256/384/512、EdDSA 以及 alg:none。
100% 本地运行
解码通过浏览器原生的 atob 和 JSON.parse 在本地完成。你的令牌绝不会被上传——可以安全处理生产凭证。
声明感知展示
突出显示 RFC 7519 的注册声明(iat、exp、nbf、iss、aud、sub、jti),让你一眼识别认证问题。
一键复制
一键复制头部 JSON、载荷 JSON 或原始签名到剪贴板——非常适合编写 Bug 报告和测试用例。
示例
HS256 令牌(有效)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsIm5hbWUiOiJBbGljZSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTcxNTAwMDAwMCwiZXhwIjoxOTk5OTk5OTk5fQ.4NhxPjwoZxPNuxG-2C5ugGxaUsUJ0QyskAz7Ymz5Sg0
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "user_123",
"name": "Alice",
"role": "admin",
"iat": 1715000000,
"exp": 1999999999
} 使用 HMAC-SHA256 签名的令牌,包含主题、角色和未来的过期时间——最常见的会话认证 JWT 结构。
RS256 令牌(已过期)
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtleS0yMDI1LTAxIn0.eyJpc3MiOiJodHRwczovL2F1dGguZXhhbXBsZS5jb20iLCJhdWQiOiJhcGkuZXhhbXBsZS5jb20iLCJzdWIiOiI5MDA4NzE2NSIsImlhdCI6MTYwMDAwMDAwMCwiZXhwIjoxNjAwMDAzNjAwLCJzY29wZSI6InJlYWQ6dXNlciB3cml0ZTpwb3N0In0.signature_placeholder
{
"alg": "RS256",
"typ": "JWT",
"kid": "key-2025-01"
}
{
"iss": "https://auth.example.com",
"aud": "api.example.com",
"sub": "90087165",
"iat": 1600000000,
"exp": 1600003600,
"scope": "read:user write:post"
} RSA 签名的 OAuth 风格访问令牌——注意头部的 kid(密钥 ID)以及 exp 声明显示令牌已经过期。
OIDC ID Token
eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJzdWIiOiIxMTA1MDIyNTExNTU4OTkwNzY2Mzk1IiwiYXpwIjoiY2xpZW50LWlkIiwiYXVkIjoiY2xpZW50LWlkIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpYXQiOjE3MTUwMDAwMDAsImV4cCI6MTk5OTk5OTk5OSwibm9uY2UiOiJhYmMxMjMifQ.signature
{
"alg": "ES256",
"typ": "JWT"
}
{
"iss": "https://accounts.google.com",
"sub": "110502251155899076639",
"azp": "client-id",
"aud": "client-id",
"email": "alice@example.com",
"email_verified": true,
"iat": 1715000000,
"exp": 1999999999,
"nonce": "abc123"
} 使用 ECDSA 签名的 OpenID Connect ID Token,包含邮箱声明和用于防重放的 nonce。
alg:none 令牌(未签名)
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiJkZWJ1Zy11c2VyIiwiaWF0IjoxNzE1MDAwMDAwfQ.
{
"alg": "none",
"typ": "JWT"
}
{
"sub": "debug-user",
"iat": 1715000000
} alg:none 的未签名令牌。在生产环境接受此类令牌是经典的 JWT 安全漏洞——服务端必须始终拒绝 alg:none。
使用方法
- 1
粘贴你的 JWT 开始解码
将完整的 JWT(包括三段由点分隔的内容)粘贴到输入框。解码器会在浏览器中即时解码,无需点击按钮。
- 2
查看解码后的头部、载荷与状态
在解码后的头部读取算法和令牌类型,在载荷查看所有声明,在顶部查看过期时间与签发时间。已过期的令牌会以红色标记。
- 3
复制解码结果
使用每个面板的复制按钮即可复制解码后的头部 JSON、载荷 JSON 或原始签名。你的令牌没有发送到任何地方——解码完全在浏览器本地完成。
Common Errors
接受 alg:none
未签名的 JWT 任何人都能伪造。生产环境中绝不允许 alg:none——始终向 verify 调用显式传入算法列表。
jwt.verify(token, secret) // library default may allow 'none'
jwt.verify(token, secret, { algorithms: ['RS256'] }) 缺少 exp 声明
没有 exp 的 JWT 永远有效。一旦泄露,就没有自然的吊销节点。请始终根据令牌类型设置合适的过期时间。
{ "sub": "user_123", "role": "admin" } // no exp { "sub": "user_123", "role": "admin", "exp": 1715003600 } 在载荷中存放秘密
JWT 载荷不是加密的——任何持有令牌的人都能读取。切勿在 JWT 载荷中存放密码、API 密钥或未脱敏的 PII。
{ "sub": "user_123", "password": "hunter2" } { "sub": "user_123", "role": "admin" } // payload stays minimal 常见使用场景
- 解码 Authorization Bearer 令牌
- 解码 Authorization: Bearer 头中的 JWT 令牌,确认后端收到的声明、受众和过期时间是否正确。
- 解码 OAuth 2.0 与 OIDC 令牌
- 在对接过程中解码授权服务器(Auth0、Okta、Google、Keycloak)返回的访问令牌和 ID Token。
- 过期会话诊断
- 一秒内确认被拒绝的令牌是过期、受众错误,还是因时钟偏差导致。
- 密钥轮换检查
- 读取头部的 kid(密钥 ID),验证 JWKS 轮换是否按预期签发令牌。
- 安全审查
- 在代码审查和渗透测试中识别使用 alg:none、缺少 exp 或在载荷中泄露 PII 的令牌。
- 微服务令牌检查
- 解码服务网格内服务间的令牌,查看下游调用被授予的作用域和主体。
技术细节
- 符合 RFC 7519 标准
- 处理符合 RFC 7519(JWT)、RFC 7515(JWS)和 RFC 7518(JWA)的 JWS 令牌——所有注册算法都可解码。
- Base64URL 解码
- 使用 RFC 4648 定义的 URL 安全 Base64 字母表(使用 - 和 _ 替代 + 和 /),并对填充宽容解析。
- 浏览器原生、零依赖
- 基于浏览器的 atob、TextDecoder 和 JSON.parse 构建——无外部库、无网络请求、无任何埋点。
最佳实践
- 未验证就不可信
- 解码器只展示声明,并不证明其真实性。在信任任何声明之前,务必在服务端用签发者的密钥验证签名。
- 生产环境拒绝 alg:none
- 为 JWT 库配置明确的算法白名单。绝不接受 alg:none,并对密钥轮换时出现的 alg 不匹配保持警惕。
- 保持载荷精简
- 在 JWT 中放置标识符和短期声明;体积较大的数据应藏在不透明会话 ID 之后。臃肿的令牌会在每次请求上浪费带宽。
常见问题
如何在线解码 JWT 令牌?
header.payload.signature)——粘贴到上方解码器即可。解码在浏览器中即时完成:头部和载荷会被 Base64URL 解码为可读 JSON,签名则以原始字符串形式展示。顶部状态栏会显示签名算法、签发时间和过期时间,一眼就能识别过期令牌。如果想手动解码 JWT,只需把令牌按点拆分,对前两段做 Base64URL 解码,再按 JSON 解析——任何持有令牌的人都能读取其声明,因为载荷是编码而非加密的。本解码器可以安全处理生产令牌,因为任何内容都不会离开你的设备:没有网络请求、没有日志、没有跟踪。 什么是 JWT(JSON Web Token)?
使用这个 JWT 解码器时我的令牌安全吗?
JWT 解码器是如何工作的?
这个工具能验证 JWT 签名吗?
iat、exp、nbf、iss、aud、sub 和 jti 是什么?
我的 JWT 已经过期——为什么解码器还能解出内容?
JWT、JWS 和 JWE 有什么区别?
为什么 alg:none 很危险?
alg:none 的 JWT 没有签名——任何人都能伪造,声称自己是任意用户。早期的 JWT 库默认接受 alg:none,导致了一类众所周知的认证绕过漏洞:攻击者去掉签名,将 alg 设置为 none,伪造出管理员令牌。如今所有成熟的 JWT 库都会拒绝 alg:none,除非显式允许,你也绝不应为已认证请求接受它。本解码器仍会显示 alg:none 的令牌,因为调试时查看这类令牌是合理的——但在生产环境收到的任何此类令牌都应视为敌对。 这个 JWT 解码器支持哪些算法?
JWT 应该存在 localStorage 还是 Cookie 中?
如何在 Node.js、Python 或 Go 中解码 JWT?
jsonwebtoken.decode(token) 用于只读解码,jsonwebtoken.verify(token, key) 用于验证。Python:PyJWT.decode(token, options={'verify_signature': False}) 用于读取,传入密钥则进行验证。Go:jwt.ParseUnverified(token, claims) 用于只读,jwt.Parse(token, keyFunc) 用于验证。在任何语言中,生产代码都不应使用 options={'verify_signature': False} 进行验证——这是本 Web 工具为调试目的有意采用的做法,只有在查看而非认证时才是安全的。 JWT 的最大长度是多少?
我粘贴了令牌却提示「Invalid JWT format」——哪里出了问题?
header.payload.signature。常见原因:(1)你只复制了载荷段,(2)中间被粘贴进了空白或换行,(3)令牌在传输中被截断(终端换行常导致此问题),(4)令牌实际是 JWE,其格式为 header.encryptedKey.iv.ciphertext.tag(五段),或(5)令牌经过 URL 编码,你需要先对其进行 URL 解码。检查 API 返回的原始值——大多数编辑器在悬停时会显示不可见字符。 没有密钥能解码 JWT 吗?
我的 JWT 在 Postman 里能用,后端却拒绝——如何调试?
HS256 令牌在仅配置为 RS256 的库上会失败。(4)kid——如果使用密钥轮换,头部中的密钥 ID 是否存在于你的 JWKS 中?(5)signature——你使用的密钥/公钥是否正确?本解码器会在头部和载荷视图中展示 (1)、(2)、(3) 和 (4),以便你迅速排除这些原因。 相关工具
查看所有工具 →在线 MD5 哈希生成器与文件校验工具
安全工具
在线生成 MD5、SHA-256、SHA-1、SHA-512 哈希值 — 完全免费,浏览器本地运算,无需注册。支持文本和文件哈希、校验和验证、哈希值对比,一键复制,数据绝不离开你的设备。
随机密码生成器 — 自定义长度、强度与安全性
安全工具
免费在线随机密码生成器,一键生成高强度安全密码。支持自定义长度、字符类型,批量生成多个密码。所有密码仅在浏览器本地生成,不上传不存储。
UUID 生成器与解析器 — v1, v4, v5, v7 批量生成
安全工具
免费 UUID 生成器,支持 v1/v4/v5/v7 全版本即时生成。解析验证任意 UUID,批量生成最多 50 个。无需注册,100% 浏览器本地运行。
进制转换器 — 二进制、十六进制、十进制、八进制互转
转换工具
在线免费进制转换工具,支持二进制、八进制、十进制、十六进制及 2-36 任意进制互转。无需注册,数据不离开浏览器,即时获取结果。
Base64 解码与编码工具
编码和格式化
免费在线 Base64 解码编码工具。实时转换,支持中文和 Emoji,100% 浏览器端运行,数据不离开设备,无需注册。
在线压缩 JPEG、PNG、WebP 图片 — 免费批量处理
转换工具
免费在线压缩 JPEG、PNG、WebP 图片,体积缩小高达 80%。浏览器本地处理、图片不上传服务器。支持批量压缩 20 张、质量调节、前后对比预览。无需注册。