为什么在JSON Web Token中要使用base64 URL编码?

14

情境:

我正在阅读此链接(https://medium.com/vandium-software/5-easy-steps-to-understanding-json-web-tokens-jwt-1164c0adfcec)中有关 JSON Web Tokens 的内容。它概述了如何创建 JSON Web Token,您需要创建一个标头和负载,然后使用以下伪代码创建签名:

data = base64urlEncode( header ) + “.” + base64urlEncode( payload )
hashedData = hash( data, secret )
signature = base64urlEncode( hashedData )

我的问题:

为什么伪代码在创建datasignature时使用base64urlEncode

我目前了解的范围:

Base64允许您使用64个文本字符集中的文本字符来表示二进制数据。这通常用于当您有一组数据要通过某些可能会误解一些字符但不会误解Base64字符的渠道进行传递时,您使用Base64对其进行编码,以便数据不会被误解。另一方面,Base64 URL编码类似于Base64编码,只是使用了一组不包括URL中具有特殊含义的字符的Base64字符子集,因此,如果您在URL中使用Base64 URL编码字符串,则其含义不会被误解。

假设我对此的理解是正确的,我想要了解为什么在上述伪代码中计算datasignature时使用base64urlEncode()。 JSON Web Token的签名将在URL中使用吗?如果是这样,为什么要对data进行base64urlEncode然后再进行哈希处理。为什么不只对签名进行编码?哈希函数是否需要其data参数进行Base64 URL编码?


3
Base64url被编码是因为这是标准规范所指定的。 - President James K. Polk
1
HTTP协议中没有使用特殊字符,因此在Web上下文中使用时无需进行额外的编码,是安全的。 - Spomky-Labs
1
它不使用base64字符集的子集。相反,它将“+”和“/”替换为“-”和“_”。如果它只使用了子集,则为base62编码。 - Jim Mischel
我正在使用JWT实现密码重置链接。这意味着在URL中传递JWT令牌。它已经被URL编码,这使得它更加方便。我怀疑这就是为什么选择URL编码的原因。 - Rei Miyasaka
@Jim Mischel为什么要替换这两个字符? - Cornelius
1
@Cornelius 因为字符“+”和“/”在URL和文件名中具有特殊含义。请参阅https://en.wikipedia.org/wiki/Base64#Variants_summary_table。 - Jim Mischel
1个回答

2
当使用OAuth Implicit Grant时,JWT可以作为URL片段的一部分进行传输。
这只是一个例子,但我想通常认为JWT可能会通过URL传递,因此对它们进行base64urlEncode编码是有意义的。
甚至IETF JWT标准摘要的第一行都说: JSON Web Token(JWT)是一种紧凑且安全的URL表示方法,用于在两个方之间传输声明。 (请注意,不再建议使用OAuth Implicit Grant。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接