Authentication 在浏览器上验证JWT

Authentication 在浏览器上验证JWT,authentication,jwt,Authentication,Jwt,我一直在阅读,我知道它有三个部分,即,标题,有效载荷和签名 我将头中使用的哈希算法、有效负载中的基本信息(例如名称、年龄、角色、到期日等)保留在有效负载中,然后对这两者进行base64编码,然后使用 在标头中指定的用于获取JWT的算法 我有一个前端,可以使用用户名和密码登录 登录请求转到服务器,服务器对其进行身份验证并返回JWT。假设使用的算法是HS256,这是一种对称密钥算法 因此,服务器将拥有用于生成JWT的密钥 作为登录请求响应的一部分,浏览器将具有JWT 现在这个JWT在使用之前可能会被

我一直在阅读,我知道它有三个部分,即,
标题
有效载荷
签名

我将头中使用的哈希算法、有效负载中的基本信息(例如名称、年龄、角色、到期日等)保留在有效负载中,然后对这两者进行base64编码,然后使用 在标头中指定的用于获取JWT的算法

  • 我有一个前端,可以使用
    用户名
    密码
    登录
  • 登录请求转到服务器,服务器对其进行身份验证并返回JWT。假设使用的算法是HS256,这是一种对称密钥算法
  • 因此,服务器将拥有用于生成JWT的
    密钥
  • 作为登录请求响应的一部分,浏览器将具有JWT
  • 现在这个JWT在使用之前可能会被篡改,所以我应该验证JWT的真实性
  • 要验证,我需要密钥 问题:

  • 如何在前端获取此
    密钥
  • 有效负载可以保存有关用户的任何信息(而不是任何敏感信息,如密码)。由于JWT可以在途中被篡改,在未验证前端JWT的情况下使用有效负载信息是否危险

  • 接收JWT的服务器是验证令牌的服务器。如果有人修改了令牌,验证将失败,访问将被拒绝,因为(希望)服务器之外没有人知道这个秘密,因此无法创建有效的令牌。如果客户端知道这个秘密,特别是在浏览器/js环境中,并且使用符号散列算法,这是一个很大的安全风险,有人可能会窃取这个秘密并创建一个具有有效签名的新令牌。

    接收JWT的服务器是验证令牌的服务器。如果有人修改了令牌,验证将失败,访问将被拒绝,因为(希望)服务器之外没有人知道这个秘密,因此无法创建有效的令牌。如果客户端知道秘密,特别是在浏览器/js环境中以及使用符号散列算法,这是一个很大的安全风险,有人可能会窃取秘密并创建一个具有有效签名的新令牌。

    任何承载令牌都只能通过
    HTTPS
    使用。和
    TLS
    ,它保护
    HTTPS
    连接,并内置完整性检查,以防止在传输过程中进行修改

    因此,无需在客户端验证令牌

    另外,最好将JWT标记视为不透明字符串。这允许发布服务器在不破坏应用程序的情况下加密其内容

    正如其他人所指出的,客户端永远不应该拥有签名密钥,因为客户端永远不可能被信任


    现在,如果令牌是使用非对称密钥签名的,则可以下载公钥并验证令牌,而不会影响系统的安全性。有JavaScript库可以做到这一点,但您没有理由这样做。

    任何承载令牌都只能通过HTTPS使用。和
    TLS
    ,它保护
    HTTPS
    连接,并内置完整性检查,以防止在传输过程中进行修改

    因此,无需在客户端验证令牌

    另外,最好将JWT标记视为不透明字符串。这允许发布服务器在不破坏应用程序的情况下加密其内容

    正如其他人所指出的,客户端永远不应该拥有签名密钥,因为客户端永远不可能被信任


    现在,如果令牌是使用非对称密钥签名的,则可以下载公钥并验证令牌,而不会影响系统的安全性。有很多JavaScript库可以做到这一点,但你没有理由这么做。

    根据你使用的语言,已经有很多经过充分测试和工作的JWT库可用,因此你不必亲自动手。@Morgan你能给我指一些链接,告诉我它是如何做到的吗。在任何情况下,前端都需要密钥。我想看看这是如何安全地提供给前端的。你链接到的网站有一个不同平台的JWT解码库列表。选中此项可解码令牌客户端side@Ash我不关心解码。关于如何在FrontEnd上验证令牌的问题取决于您使用的语言,已经有很多经过充分测试和工作的JWT库可用,因此您不必亲自进行验证。@Morgan您能给我指一些链接说明它是如何做到这一点的吗。在任何情况下,前端都需要密钥。我想看看这是如何安全地提供给前端的。你链接到的网站有一个不同平台的JWT解码库列表。选中此项可解码令牌客户端side@Ash我不关心解码。关于如何验证FrontEnd上的令牌我完全同意你的观点,在客户端拥有秘密是一个很大的安全风险。这是否意味着,无论有效载荷中存在什么信息,我都不能在前端使用它?因为可能会发生这样的情况:当JWT作为响应发送到浏览器时,一些恶意用户截获了响应并更改了负载。我唯一能确保有效负载没有被改变的方法是验证JWT,我需要密钥。在这种情况下,我使用的有效负载信息不正确。因此,我必须验证JWT的真实性。这是为什么要使用HTTPS的原因之一。如果您仍然需要在客户机上验证令牌,请使用不对称算法。然后您可以使用公钥进行验证,但只有服务器可以使用私钥创建有效的令牌。最佳做法是什么。不建议吗