如何解码 Base64 字符串(以及 JWT Payload)

Base64 是可逆编码,并非加密。一步解码 Base64,正确处理 Unicode,并读取使用 Base64url 的 JWT 段。

Base64 到底是什么

Base64 把二进制数据映射到 64 个可打印的 ASCII 字符。它完全可逆且不需要密钥,因此是编码而非加密 —— 千万不要用它来「隐藏」机密。

编码与解码

在浏览器里用 btoa 编码、atob 解码。对非 ASCII 文本,要经过一次 UTF-8 往返,这样 é、ü、你这样的字符才不会变成乱码字节。

读取 JWT

JWT 是用点号连接的三段 Base64url 字符串:header、payload、signature。前两段解码后可以读出 claim;signature 是二进制内容,不是用来给人看的。

Base64 与 Base64url 的区别

标准 Base64 使用 + 与 /,并用 = 做填充;URL 安全的 Base64url 把它们换成 - 和 _,并去掉填充,使得这个值可以安全地放进 URL 与 JWT。

解码不等于验证

解码 JWT 只是读出 claim,并不能证明它真实可信。任何人都能伪造一个 payload 写着 "role":"admin" 的 token;只有用签发方的密钥校验过签名,才说明 token 真实有效。永远不要基于未经验证的 token 做出信任决定。

常见的 JWT claim 及含义

iss 是签发者,sub 是主体(用户 id),aud 是预期受众,exp 是过期时间(Unix 秒),iat 是签发时间,nbf 是「不早于」时间,jti 是唯一 id。自定义 claim 会与它们并列。务必在服务端而不是仅在客户端检查 exp 与 aud。

填充与 URL 安全变体

Base64url 经常没有 = 填充。要在代码中解码,先用 = 把长度补到 4 的倍数,再把 - 换成 +、_ 换成 /,最后跑一遍普通 Base64 解码器。浏览器的 atob 不能直接接受 Base64url —— 必须先转换。