Base64 Files
JWT · RFC 7519 · Base64URL

JWT Base64URL 解码器

在浏览器中直接将 JWT 的 Header 和 Payload 从 Base64URL 格式解码。查看算法、过期时间、签发时间及所有声明——无需服务器,无需上传。

本工具仅解码 JWT 的 Header 和 Payload,不验证签名。 解码不等于验证——任何人都能读取 JWT 的内容。签名用于证明真实性,必须在服务端进行验证。

在上方粘贴 JWT token 以解码 Header 和 Payload。

JWT 各部分的编码方式

JWT 由三个部分组成,以点号分隔。每个部分独立进行 Base64URL 编码:

Header

JSON 对象,指定 token 类型和签名算法。始终存在。

{ "alg": "HS256", "typ": "JWT" }
Payload

JSON 对象,包含声明——token 代表谁、何时签发、何时过期以及自定义数据。

{ "sub": "user_123", "exp": 1899110400 }
Signature

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主题stringtoken 所代表的实体——通常为用户 ID。
aud受众string | string[]token 的目标接收方——API 或服务标识符。
exp过期时间number (Unix)token 的有效期截止时间。exp 已过的 token 应被拒绝。
nbf生效时间number (Unix)在此时间之前 token 无效。较少使用。
iat签发时间number (Unix)token 的签发时间。可用于检测过时的 token。
jtiJWT IDstring此 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 片段。

Base64URL Encoder →