Base64 把每 3 个字节映射为 4 个字符,因此编码后的大小约为输入的 4/3:64 字节的 ES256 签名会变成 86 个字符,256 字节的 RS256 签名会变成 342 个字符。JWS、JWE 和 JWK 使用不带填充的 base64url(RFC 7515 §2),JSON 中 WebAuthn 的 id 和 rawId、DPoP 证明以及 SD-JWT 披露也是如此。PEM 文件和 MIME 使用带填充和换行的标准字母表。
常见错误:用标准 base64 解码器解码 base64url(遇到 - 或 _ 时报错,或不报错却得出错误结果),添加或要求 = 填充,在 PEM 和 JWK 之间转换密钥时混用两种字母表,以及比较编码后的字符串而不是解码后的字节。严格的 JOSE 解析器会拒绝紧凑序列化令牌中的填充和空白字符。
API:Node.js 中用 Buffer.from(s, "base64url") 和 buf.toString("base64url");Python 中用 base64.urlsafe_b64encode(它会保留填充,需要自己去掉);Go 中用 base64.RawURLEncoding;Java 中用 Base64.getUrlEncoder().withoutPadding()。