为什么 JWT 令牌使用 Base64 编码而不是 UTF-8

Why JWT token uses Base64 encoding but not UTF-8

提问人:Loki 提问时间:1/6/2023 最后编辑:Remy LebeauLoki 更新时间:1/10/2023 访问量:446

问:

RFC 7515 第 3 节提到:

在这两种序列化中,JWS Protected Header、JWS Payload 和 JWS Signature 都是 base64url 编码的,因为 JSON 缺乏直接表示任意八位字节序列的方法。

为什么不能使用八位字节序列表示 JSON?

JSON UTF-8 JWT 基数64

评论

2赞 deceze 1/6/2023
JSON不能表示任意八位字节,JSON不能用八位字节表示......!
0赞 Loki 1/7/2023
您能否举例说明哪个任意八位字节不是由 JSON 表示的。
0赞 Remy Lebeau 1/10/2023
@Loki 不能在 JSON 字段中放置任意八位字节。根本没有数据类型可以处理它。最接近的是每个八位字节的数字数组。否则,您必须在 String 字段中放置 base64(或其他文本编码)值。

答:

3赞 tripleee 1/6/2023 #1

根据定义,JSON 是 UTF-8,因此无法(有用地)表示不是有效 UTF-8 字符的字节序列。

例如,不能对字节 \x80 \x80 进行编码。

(你可以在双方之间建立相互协议,以获得JSON支持之外的其他语义,并像这样对它们进行编码;但是你的格式不再是严格的JSON。在这种情况下,要实际编码为 UTF-8,您必须拼写 U-0080 的 UTF-8 编码两次!然后 base64 只是一个更好的约定,因为它更紧凑,并且避免了字符和字节之间的任何混淆。\\x80\\x80

评论

0赞 Loki 1/7/2023
我没有得到 - 您无法对字节 \x80 \x80 进行编码。\x80 的 UTF-8 编码值为 。Base64 和 UTF-8 在这里有何不同?你能提供更多信息吗?\x5c\x78\x38\x30
1赞 tripleee 1/7/2023
因为这会对 Unicode 字符 U+0080 进行编码,而不是实际的字节值。同样,您可以就接收者必须了解和实现的约定达成一致,但 base64 只是一个更好的约定,因为它避免了字节和字符码位之间的任何混淆。