Authentication 在浏览器上验证JWT
我一直在阅读,我知道它有三个部分,即,Authentication 在浏览器上验证JWT,authentication,jwt,Authentication,Jwt,我一直在阅读,我知道它有三个部分,即,标题,有效载荷和签名 我将头中使用的哈希算法、有效负载中的基本信息(例如名称、年龄、角色、到期日等)保留在有效负载中,然后对这两者进行base64编码,然后使用 在标头中指定的用于获取JWT的算法 我有一个前端,可以使用用户名和密码登录 登录请求转到服务器,服务器对其进行身份验证并返回JWT。假设使用的算法是HS256,这是一种对称密钥算法 因此,服务器将拥有用于生成JWT的密钥 作为登录请求响应的一部分,浏览器将具有JWT 现在这个JWT在使用之前可能会被
标题
,有效载荷
和签名
我将头中使用的哈希算法、有效负载中的基本信息(例如名称、年龄、角色、到期日等)保留在有效负载中,然后对这两者进行base64编码,然后使用
在标头中指定的用于获取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的原因之一。如果您仍然需要在客户机上验证令牌,请使用不对称算法。然后您可以使用公钥进行验证,但只有服务器可以使用私钥创建有效的令牌。最佳做法是什么。不建议吗