我理解的部分: 1.编码与加密不同。 2.令牌的部分(头base64编码,有效载荷base64编码,签名哪个头+有效载荷用公钥和指定的算法加密)
但是我不明白第5部分中如何处理令牌验证。我也不明白为什么头和有效负载需要进行Base64编码。鉴于它不安全或加密......编码的部分是什么?
***** 修改 ****
我是否正确理解由于JWT包含编码标头和有效负载......应用服务器只能使用其密钥(可能是非对称加密机制中的公钥)来加密包含的有效负载和头部,如果它到达相同的包含JWT签名...那么应用服务器知道数据没有被篡改,并且用户确实通过认证服务器进行了认证。这是对的吗?
如果签名不匹配。这意味着什么?
答案 0 :(得分:5)
JWT
使用base64Url
编码(请参阅https://tools.ietf.org/html/rfc7519#section-3),这样可以避免使用URI +/,=
作为URI的保留字符(请参阅https://www.ietf.org/rfc/rfc2396.txt中的第2.2节。 )
这是有道理的,因为在某些情况下,令牌会作为参数在URL中传输。
如果使用非对称加密,则使用密钥完成加密,从而使知道公钥的任何人都无法创建新签名。
本教程中的步骤5告诉您,应用程序服务器将使用与身份验证服务器相同的密钥从头和有效负载创建哈希值,并比较它是否获得与在JWT中收到的值相同的值。请求。
不匹配签名的含义是有人更改了令牌,因此令牌被视为无效,授权将被拒绝。
从技术上讲,操纵JWT
的标头和有效负载非常容易,只需解码base64
编码的部分,更改JSON
结构中的某些值,例如。到期时间exp
,并再次编码。但是,如果不知道私钥,就无法为其创建有效的签名。
查看https://jwt.o并在调试窗口中使用示例标记来查看效果。