编码 | 解码 | 压缩

> base64url | jwt | URL 安全 <

// Base64url - 用于 URL 和文件名的安全 Base64 变体,支持无填充

[URL-SAFE]

URL 兼容

不使用特殊 URL 字符——安全用于查询参数和路径。

[JWT]

JWT 标准

在 JSON Web Token 和 OAuth 2.0 规范中广泛使用。

[NO-PADDING]

可选填充

可以省略填充字符 (=),让 URL 更简洁。

>> 技术信息

Base64url 的工作原理:

Base64url 是 Base64 的一个变体,将“+”替换为“-”、将“/”替换为“_”,因此可安全用于 URL 和文件名。填充字符“=”通常会被省略,因为它可能在 URL 中造成问题。

对比示例:

Base64: SGVsbG8+Pw== Base64url: SGVsbG8-Pw

为什么使用 Base64url:

  • >JWT 令牌
  • >OAuth 2.0 流程
  • >URL 查询参数
  • >文件名编码
  • >Web API 签名

>> 常见问题

什么是 Base64url?

Base64url 是一种适用于 URL 和文件名的安全 Base64 编码变体。它将“+”替换为“-”、将“/”替换为“_”,并可以选择移除填充“=”字符,以避免 URL 编码问题。

为什么不能在 URL 中直接使用普通 Base64?

普通 Base64 使用“+”“/”“=”等在 URL 中具有特殊含义的字符。“+”可能被解释为空格,“/”是路径分隔符,“=”用于参数赋值,会导致解析错误。

Base64url 一般用于哪里?

Base64url 广泛用于 JWT(JSON Web Token)、OAuth 2.0 授权码、SAML 断言,以及任何需要在 URL 或 HTTP 头中传递二进制数据的 API。

Base64url 是否必须使用填充?

不必须。许多实现会省略填充,因为可以根据长度计算出来。JWT 规范特别要求不使用填充,以获得更简洁的 URL。

URL 安全 Base64 和标准 Base64 有什么区别?

两种变体都定义在 RFC 4648 中:
标准 Base64(§4)使用 A-Za-z0-9+/,以 = 填充;+/ 在 URL 和文件名中有特殊含义。
URL 安全 Base64(§5,也叫 base64url)把 + 改为 -/ 改为 _,通常省略 =。两者编码的数据完全相同,只是字母表不同。

如何把标准 Base64 转换为 Base64url?

一行替换即可:b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')。反向转换时,额外补回 = 让长度变成 4 的倍数即可。大多数语言都已内置这两种变体的支持,直接调用对应 API 即可。

各语言如何进行 Base64url 编解码?

Node.jsBuffer.from(str).toString('base64url') / Buffer.from(s, 'base64url').toString()(Node 16+ 原生)
Pythonbase64.urlsafe_b64encode / base64.urlsafe_b64decode
JavaBase64.getUrlEncoder().withoutPadding().encodeToString(bytes)
Gobase64.RawURLEncoding.EncodeToString(b)(Raw 表示无填充)
PHPrtrim(strtr(base64_encode($s), '+/', '-_'), '=')

Base64url 与 JWT 的关系?

JWT 由三段以英文句点分隔的 Base64url 字符串组成:<header>.<payload>.<signature>。每一段都是 无填充 的 Base64url——RFC 7515(JWS)明确要求省略 =。因此 JWT 可以直接放进 URL 查询参数、Authorization 头或 Cookie 里,不需要再做任何转义。

应该选 Base64url 还是标准 Base64?

根据字符串的存放位置来选:
URL、文件名、HTTP 头、Cookie:用 Base64url,无需额外转义
JSON/XML 消息体、邮件、数据库:两者皆可,标准 Base64 是传统默认
JWT、OAuth 2.0、WebAuthn、WebPush、JWE、JWK:规范强制 无填充的 Base64url
拿不准时,Base64url 是更安全的现代选择。

其他语言