为啥需要客户端验证 JWT?

Posted

技术标签:

【中文标题】为啥需要客户端验证 JWT?【英文标题】:Why should JWTs need to be verified by the client?为什么需要客户端验证 JWT? 【发布时间】:2018-11-28 15:11:08 【问题描述】:

所以我的理解是,JWT 是由服务器使用私钥签名的,并且通过将公钥解密签名与服务器和客户端两者/任何一个的标头 + 有效负载进行比较来验证其合法性:

令牌由一方的私钥签名(通常是 服务器的),以便双方(另一方已经存在,由一些 合适且值得信赖的手段,拥有相应的 公钥)能够验证令牌是否合法。1

我只是想知道客户端需要什么来验证 JWT 的真实性?我知道 SSL 使用相同的机制,在这种情况下,客户端验证对我来说很有意义,因为证书包含客户端用来加密初始握手的公钥。但我很难理解公共可验证性在 JWT 的情况下有什么好处。如果 JWT 是非法的,它无论如何都会在服务器上失败,并且客户端除了将它附加到请求上之外并没有做任何特别的事情。

仅仅在服务器上使用一些私有盐进行散列不能满足它的目的吗?服务器通过使用相同的盐对有效负载进行散列并与签名进行比较来进行验证。这种情况下,只有服务端可以验证,那又怎样?

【问题讨论】:

【参考方案1】:

所以我的理解是,JWT 是由服务器使用私钥签名的,并且通过将公钥解密签名与服务器和客户端两者/任何一个的标头 + 有效负载进行比较来验证其合法性:

Thiis 不完整。可以使用密钥对的私钥(例如 RSA)或使用对称密钥(例如 HMAC)对 JWT 进行签名。在这种情况下,相同的密钥用于签名和验证令牌

我只是想知道客户端需要什么来验证JWT的真实性?

当使用非对称密钥对对令牌进行签名时,客户端会验证令牌。使用对称密钥,只有发行方知道,客户端无法验证

在这里查看我的答案:When to use RS256 for JWT?

我了解 SSL 使用相同的机制,在这种情况下,客户端验证对我来说很有意义,因为证书包含客户端用于加密初始握手的公钥

握手中使用的一些数据由服务器使用其私钥进行数字签名(未加密),并由客户端验证

如果 JWT 是非法的,它无论如何都会在服务器上失败,并且客户端除了将它附加到请求上之外没有做任何特别的事情。

否,如果验证服务器与发证服务器不同(再看一次上面的链接)。

假设令牌已由第三方(例如 goggle 或 facebook)作为 oauth2 身份验证过程的结果颁发。它可以包含已连接用户的详细信息,并且已使用重定向提供给您的服务器,因此您不能信任呼叫方。您必须验证令牌是否已由预期方颁发。

【讨论】:

以上是关于为啥需要客户端验证 JWT?的主要内容,如果未能解决你的问题,请参考以下文章

JSON Web 令牌 (JWT) - 验证客户端

Angular 和 JWT - 客户端如何验证令牌?

使用 jwt 在微服务中进行身份验证

将 JWT 用于匿名和经过身份验证的用户

如何将 JWT 从客户端传递到我的 API 以进行正确身份验证?

JWT:多客户端身份验证服务器,停止在不同客户端之间使用 jwt?