Base64 Files
JWT · URL 安全 · RFC 4648 §5

Base64URL 编码器和解码器

为 JWT、URL 和 Web 安全数据编解码 Base64URL 字符串。在文本、标准 Base64 和 URL 安全 Base64URL 之间互相转换——输出不含 +、/ 或 = 字符。

在上方输入要编码的文本后查看结果

什么是 Base64URL?

Base64URL 定义于 RFC 4648 第 5 节。它使用与标准 Base64 相同的 64 字符编码,但替换了两个字符,使输出无需百分号编码即可安全用于 URL 和文件名。

填充符(=)是可选的——大多数 Base64URL 实现(包括 JWT)完全省略填充符,因为正确的填充长度总是可以从字符串长度推算出来。

标准 Base64Base64URL原因
+-+ 在查询字符串中表示空格
/_/ 在 URL 中是路径分隔符
= (填充)省略= 在查询字符串中是键值分隔符

JavaScript — Base64 与 Base64URL 互转

// Text → Base64URL
function textToBase64Url(text) {
  const bytes = new TextEncoder().encode(text)
  let binary = ''
  bytes.forEach(b => binary += String.fromCharCode(b))
  return btoa(binary)
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
    .replace(/=/g, '')
}

// Base64URL → Text
function base64UrlToText(b64url) {
  const b64 = b64url
    .replace(/-/g, '+')
    .replace(/_/g, '/')
  const pad = b64.length % 4
  const padded = pad ? b64 + '='.repeat(4 - pad) : b64
  const binary = atob(padded)
  const bytes = Uint8Array.from(binary, c => c.charCodeAt(0))
  return new TextDecoder().decode(bytes)
}

// Base64 → Base64URL
const toB64Url = b64 =>
  b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '')

JWT 为何使用 Base64URL

JWT(JSON Web Token)通常在三个地方传输:Authorization HTTP 请求头、URL 查询参数或 Cookie。在这三种场景中,标准 Base64 字符都会引发问题:

  • +在查询字符串中被解析为空格
  • /在 URL 中被视为路径段分隔符
  • =在查询字符串中用作键值分隔符

Base64URL 规避了以上三个问题。JWT token——即使在标准 Base64 形式下含有 + 或 / 的——都可以安全地放在 URL 或请求头的任意位置,无需任何额外编码。

JWT 结构

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
          ↑ header(Base64URL)
.eyJzdWIiOiIxMjM0NTY3ODkwIn0
          ↑ payload(Base64URL JSON)
.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
          ↑ signature(Base64URL)

在 JavaScript 中解码载荷

const token = 'eyJ...SflK...'
const [, payload] = token.split('.')

// Add padding back, then decode
const b64 = payload.replace(/-/g,'+').replace(/_/g,'/')
const pad = b64.length % 4
const padded = pad ? b64 + '='.repeat(4 - pad) : b64

const json = JSON.parse(atob(padded))
// → { sub: '1234567890', ... }

切勿在服务端验证签名之前信任解码后的 JWT 载荷。 解码是公开操作——任何人都能读取载荷。签名才是证明 token 由可信服务器签发的凭证。

Base64URL 的使用场景

JWT token

JSON Web Token 对所有三个段(header、payload、signature)均使用 Base64URL。定义于 RFC 7519。

OAuth 2.0 PKCE

PKCE 流程中的 code_verifier 和 code_challenge 均使用 Base64URL 编码。challenge 是 verifier 的 SHA-256 哈希值经 Base64URL 编码后的结果。

URL 安全的 state 参数

OAuth state、CSRF token 和不透明标识符通常经 Base64URL 编码,以便在重定向 URL 中传递而无需额外转义。

Web Crypto API

SubtleCrypto API 返回 ArrayBuffer。Base64URL 是将密钥和签名序列化用于存储或传输的标准方式。

WebAuthn / Passkeys

Web Authentication API 使用 Base64URL 对凭据 ID、认证器数据和认证对象进行编码。

文件 ID 和 token

许多 API 生成随机字节 token(如 session token、上传 ID),并以 Base64URL 字符串返回,以便安全用于 URL。

常见问题

什么是 Base64URL?

Base64URL 是标准 Base64 的变体,可安全用于 URL 和文件名。它将 + 替换为 -,/ 替换为 _,并去掉 = 填充符。字符集与 Base64 相同,只是将在 URL 中具有特殊含义的三个字符(+、/、=)替换或去除。

为什么 JWT 使用 Base64URL?

JWT(JSON Web Token)通过 HTTP 请求头、URL 参数和 Cookie 传输——在这些场景中,标准 Base64 的 + 和 / 字符会被误解析或需要百分号编码。Base64URL 改用 - 和 _ 来避免这个问题。JWT 还去掉了填充符(=)以尽量压缩 token 长度。

可以在 JWT 中使用标准 Base64 吗?

不可以。JWT 规范要求使用 RFC 4648 §5 定义的 Base64URL 编码。期望 JWT 的实现会拒绝使用标准 Base64 编码的 token。这个区别很重要:任何包含 + 或 / 的 token 段都会破坏 URL 解析。

Base64URL 是无损的吗?

是的。Base64 和 Base64URL 之间的转换是完全可逆的。将 + 替换为 - 和 / 替换为 _ 是一一对应的——不会丢失任何信息。去除填充符也是可逆的,因为正确的填充长度总是可以从字符串长度推算出来。

Base64URL 和 URL 编码有什么区别?

它们解决的是不同的问题。Base64URL 使用 64 个字符将二进制数据转换为 URL 安全的文本表示。URL 编码(百分号编码)转义 URL 中不安全的单个字符——例如空格变为 %20。在 URL 参数中携带二进制数据时用 Base64URL,在查询字符串中转义用户输入文本时用 URL 编码。

如何解码 JWT 载荷?

JWT 由三个点分隔的部分组成:header.payload.signature。每个部分都是 Base64URL 编码的。要读取载荷,取第二段并按 Base64URL 解码——它是一个 JSON 对象。注意:解码载荷并不验证签名。务必在服务端验证签名后才能信任 JWT 中的数据。

正在处理 JWT token?

使用 JWT 解码器查看任意 JWT token 的 header 和 payload——自动完成 Base64URL 解码和 JSON 格式化。

JWT 解码器 →