为什么要使用带有 JSON Web 令牌的 base64 URL 编码?

gke*_*ley 7 hash base64 jwt base64url

场景:

我正在此链接 ( https://medium.com/vandium-software/5-easy-steps-to-understanding-json-web-tokens-jwt-1164c0adfcec )阅读有关 JSON 网络令牌的信息。它概述了如何创建 JSON Web 令牌、创建标头和负载,然后使用以下伪代码创建签名:

data = base64urlEncode( header ) + “.” + base64urlEncode( payload )
hashedData = hash( data, secret )
signature = base64urlEncode( hashedData )
Run Code Online (Sandbox Code Playgroud)

我的问题:

为什么base64urlEncode在创建data和时使用伪代码signature

我目前了解的范围:

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

假设我的理解是正确的,我试图理解为什么base64urlEncode()在计算datasignature上面的伪代码中使用。JSON 网络令牌的签名是否会在 URL 中的某处使用?如果是这样,为什么data base64urlEncoded 在散列之前也是如此。为什么不只对签名进行编码?散列函数是否需要将其data参数进行 Base64 URL 编码?

Ott*_*tto 2

当使用OAuth 隐式授予时,JWT 可能作为 URL 片段的一部分进行传输。

这只是一个例子,但我想一般来说,JWT 可能是通过 URL 传递的,所以base64urlEncodeing 它们是有意义的。

IETF JWT 标准摘要的第一行甚至说: JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties.

(请注意,不再建议使用 OAuth 隐式授予。)