在浏览器上验证 JWT

Gau*_*mar 2 authentication jwt

我一直在阅读有关JWT的内容,我知道它由三个部分组成,即headerpayloadsignature

我将哈希算法保留在标头中,将基本信息保留在有效负载中,例如。有效负载中的名称、年龄、角色、到期日等,然后将这两者都进行 Base64 编码,然后使用标头中指定的算法进行哈希处理以获得 JWT

  1. 我有一个可以使用username和登录的前端password
  2. 登录请求发送到服务器,服务器对其进行身份验证并返回 JWT。假设使用的算法是 HS256,它是一种对称密钥算法。
  3. 因此服务器将使用secret key生成 JWT 的方法。
  4. 作为登录请求响应的一部分,浏览器将具有 JWT。
  5. 现在这个 JWT 可能会在途中被篡改,所以在使用它之前,我应该验证 JWT 的真实性。
  6. 为了验证,我需要密钥。

问题:

  1. secret key我如何在前端得到这个?
  2. 有效负载可以保留有关用户的任何信息(不是任何敏感信息,例如密码)。既然 JWT 可能在途中被篡改,那么在前端不验证 JWT 的情况下使用有效负载信息不是很危险吗?

jps*_*jps 5

接收 JWT 的服务器是验证令牌的服务器。如果有人修改了令牌,验证将失败并且访问将被拒绝,因为(希望)服务器外部没有人知道该秘密,因此无法创建有效的令牌。如果客户知道这个秘密,尤其是。在浏览器/js 环境和对称哈希算法中,这是一个很大的安全风险,有人可以窃取秘密并创建具有有效签名的新令牌。

  • 这就是应该使用 HTTPS 的原因之一。如果您仍然觉得需要验证客户端上的令牌,请使用非对称算法。然后你可以使用公钥进行验证,但只有服务器可以使用私钥创建有效的令牌。 (2认同)