> base64url | jwt | URL 安全 <
// Base64url - 用于 URL 和文件名的安全 Base64 变体,支持无填充
URL 兼容
不使用特殊 URL 字符——安全用于查询参数和路径。
JWT 标准
在 JSON Web Token 和 OAuth 2.0 规范中广泛使用。
可选填充
可以省略填充字符 (=),让 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-Z、a-z、0-9、+、/,以 = 填充;+ 和 / 在 URL 和文件名中有特殊含义。
• URL 安全 Base64(§5,也叫 base64url)把 + 改为 -、/ 改为 _,通常省略 =。两者编码的数据完全相同,只是字母表不同。
如何把标准 Base64 转换为 Base64url?
一行替换即可:b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')。反向转换时,额外补回 = 让长度变成 4 的倍数即可。大多数语言都已内置这两种变体的支持,直接调用对应 API 即可。
各语言如何进行 Base64url 编解码?
Node.js:Buffer.from(str).toString('base64url') / Buffer.from(s, 'base64url').toString()(Node 16+ 原生)
Python:base64.urlsafe_b64encode / base64.urlsafe_b64decode
Java:Base64.getUrlEncoder().withoutPadding().encodeToString(bytes)
Go:base64.RawURLEncoding.EncodeToString(b)(Raw 表示无填充)
PHP:rtrim(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 是更安全的现代选择。