为何JWT令牌采用Base64编码而非UTF-8?JSON为何无法表示八位字节序列?
JWT采用Base64编码而非UTF-8的原因
JWT的核心组成(头部、负载、签名)里,签名是加密算法生成的二进制数据,这类数据可能包含无法被UTF-8编码识别的字节序列。如果直接用UTF-8处理这些二进制内容,要么会出现乱码,要么会导致数据损坏——因为UTF-8是针对Unicode字符的编码方案,只能处理符合规则的字符字节,没法兼容任意二进制数据。
而Base64(JWT实际用的是Base64url变体)能把任意二进制数据转换成ASCII范围内的文本字符,完全适配HTTP这类基于文本的传输协议,确保令牌在传输过程中不会被篡改或解析错误,同时也能被各种系统正确解码还原原始数据。
为何JSON无法直接表示任意八位字节序列
JSON的规范只支持字符串、数字、布尔值、数组、对象和null这几种数据类型,没有专门的二进制数据类型。而且JSON的字符串要求必须是合法的Unicode字符,并用UTF-8编码存储——这意味着如果字节序列里包含不符合UTF-8规则的内容(比如孤立的高字节、不完整的多字节序列),JSON解析器根本无法正确解析这些内容,甚至会直接抛出错误。
所以如果要在JSON里传输二进制数据,只能先把它转换成Base64这类文本编码的字符串,让它符合JSON字符串的要求,才能被正确处理和传输。
内容的提问来源于stack exchange,提问作者Loki
相关产品推荐
相关产品推荐

