JWT Base64URL 解码器
在浏览器中直接将 JWT 的 Header 和 Payload 从 Base64URL 格式解码。查看算法、过期时间、签发时间及所有声明——无需服务器,无需上传。
本工具仅解码 JWT 的 Header 和 Payload,不验证签名。 解码不等于验证——任何人都能读取 JWT 的内容。签名用于证明真实性,必须在服务端进行验证。
在上方粘贴 JWT token 以解码 Header 和 Payload。
JWT 各部分的编码方式
JWT 由三个部分组成,以点号分隔。每个部分独立进行 Base64URL 编码:
JSON 对象,指定 token 类型和签名算法。始终存在。
{ "alg": "HS256", "typ": "JWT" }JSON 对象,包含声明——token 代表谁、何时签发、何时过期以及自定义数据。
{ "sub": "user_123", "exp": 1899110400 }Header 和 Payload 的加密哈希值。验证需要密钥(HMAC)或公钥(RSA/EC)。
SflKxwRJSMeKKF2QT4fw…在 JavaScript 中解码 JWT
function decodeJwt(token) {
const [headerB64, payloadB64] = token.split('.')
function decode(b64url) {
// Convert Base64URL → standard Base64
const b64 = b64url
.replace(/-/g, '+')
.replace(/_/g, '/')
const pad = b64.length % 4
const padded = pad ? b64 + '='.repeat(4 - pad) : b64
// Decode to UTF-8 text
const binary = atob(padded)
const bytes = Uint8Array.from(binary, c => c.charCodeAt(0))
return JSON.parse(new TextDecoder().decode(bytes))
}
return {
header: decode(headerB64),
payload: decode(payloadB64),
// Signature verification requires a key
// — do that on the server, not here
}
}
const { header, payload } = decodeJwt(token)
console.log(header.alg) // "HS256"
console.log(payload.sub) // "user_123"
console.log(new Date(payload.exp * 1000))标准 JWT 声明
| 声明 | 名称 | 类型 | 说明 |
|---|---|---|---|
| iss | 签发方 | string | 签发该 token 的实体——通常为认证服务器 URL。 |
| sub | 主题 | string | token 所代表的实体——通常为用户 ID。 |
| aud | 受众 | string | string[] | token 的目标接收方——API 或服务标识符。 |
| exp | 过期时间 | number (Unix) | token 的有效期截止时间。exp 已过的 token 应被拒绝。 |
| nbf | 生效时间 | number (Unix) | 在此时间之前 token 无效。较少使用。 |
| iat | 签发时间 | number (Unix) | token 的签发时间。可用于检测过时的 token。 |
| jti | JWT ID | string | 此 token 的唯一标识符,用于防止重放攻击。 |
以上七个声明均为可选。自定义声明(如 name、email 和 roles)可自由添加。
本工具会验证 JWT 签名吗?
不会。 本工具仅解码并展示 Header 和 Payload,不验证签名。
验证 JWT 签名需要密钥(适用于 HS256 等 HMAC 算法)或公钥(适用于 RS256、ES256 等 RSA/EC 算法)。验证必须在服务端完成——在浏览器中暴露密钥会使验证失去意义。
任何人都能解码 JWT——它只是 Base64URL 编码,并非加密。签名才是使声明可信的关键。未经验证的 JWT 只能告诉你某人声称是真实的内容,并不代表事实。
在服务端验证 JWT(Node.js)
import jwt from 'jsonwebtoken'
// HS256 — verify with shared secret
try {
const payload = jwt.verify(token, process.env.JWT_SECRET)
// payload is trusted only if verify() didn't throw
console.log(payload.sub)
} catch (err) {
// TokenExpiredError, JsonWebTokenError, etc.
console.error('Invalid token:', err.message)
}
// RS256 — verify with public key
const publicKey = fs.readFileSync('public.pem')
const payload = jwt.verify(token, publicKey, {
algorithms: ['RS256'],
})常见问题
本工具会验证 JWT 签名吗?
不会。本工具仅解码并展示 Header 和 Payload。验证 JWT 签名需要密钥(HMAC)或公钥(RSA/EC)。签名验证必须在服务端完成——绝不能在浏览器中进行,否则密钥将面临泄露风险。
将 JWT 粘贴到本工具中安全吗?
本工具完全在浏览器中运行,您的 token 不会发送到任何服务器。即便如此,请像对待密码一样对待 JWT:避免将来自敏感系统的真实生产 token 粘贴到任何在线工具中,包括本工具。如需处理敏感 token,请使用 jwt.io 官方库或您的服务端运行时在本地解码。
为什么 JWT Payload 中的 iat 和 exp 显示为原始数字?
iat(签发时间)、exp(过期时间)和 nbf(生效时间)字段均为 Unix 时间戳——自 1970 年 1 月 1 日 UTC 起经过的秒数。本工具会自动将其转换为人类可读的日期。原始 JSON 保留原始数字格式。
解码器中的"已过期"是什么意思?
exp 字段是一个 Unix 时间戳,表示 token 的有效期截止时间。如果 exp 已过,则 token 已失效,正确实现的服务器将拒绝该 token。过期检查基于您的本地设备时间进行。
标准 JWT 声明有哪些?
JWT 规范(RFC 7519)定义了七个注册声明:iss(签发方)、sub(主题)、aud(受众)、exp(过期时间)、nbf(生效时间)、iat(签发时间)和 jti(JWT ID)。所有声明均为可选。应用通常还会添加自定义声明,如 name、email、roles 和 scope。
JWT 和 Base64URL 字符串有什么区别?
JWT 是一种结构化格式:三段 Base64URL 编码内容通过点号连接。第一段是 JSON Header,第二段是 JSON Payload,第三段是加密签名。而普通的 Base64URL 字符串没有固定结构——它只是将任意数据编码以保证 URL 安全。
需要对 Base64URL 字符串进行编码或解码?
Base64URL 编码器支持文本 → Base64URL、Base64URL → 文本的转换,以及标准 Base64 与 Base64URL 的互转——适合处理单个 JWT 片段。