Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于JWT授权的困惑_Jwt - Fatal编程技术网

关于JWT授权的困惑

关于JWT授权的困惑,jwt,Jwt,我正在努力理解关于JWT授权的一些事情 假设我以用户身份成功登录。然后,服务器将向我发送JWT令牌,我可以将其用于每个后续请求 我的问题是,在这一点上,客户端上有权访问此令牌的任何人是否可以从技术上将其放入授权标头中,并向受保护的端点发出请求并成功地获取数据 此时,客户端上有权访问此令牌的任何人都可以 JWT身份验证假定使用加密传输通道(https),因此只有经过身份验证的客户端才能访问JWT令牌。这通常适用于任何令牌身份验证(如cookie…) 此时,客户端上有权访问此令牌的任何人都可以 JW

我正在努力理解关于JWT授权的一些事情

假设我以用户身份成功登录。然后,服务器将向我发送JWT令牌,我可以将其用于每个后续请求

我的问题是,在这一点上,客户端上有权访问此令牌的任何人是否可以从技术上将其放入授权标头中,并向受保护的端点发出请求并成功地获取数据

此时,客户端上有权访问此令牌的任何人都可以

JWT身份验证假定使用加密传输通道(https),因此只有经过身份验证的客户端才能访问JWT令牌。这通常适用于任何令牌身份验证(如cookie…)

此时,客户端上有权访问此令牌的任何人都可以


JWT身份验证假定使用加密传输通道(https),因此只有经过身份验证的客户端才能访问JWT令牌。这通常适用于任何令牌身份验证(如cookie等)。

是的,您所说的是正确的,这就是为什么任何JWT都应该有一个过期值的主要原因,因此即使它以某种方式被盗,访问也会被限制在一定的时间段内(最佳实践建议在15-60分钟之间).

是的,您所说的是正确的,这就是为什么任何JWT都应该有一个过期值的主要原因,因此,即使它以某种方式被盗,访问也会被限制在一定的时间段内(最佳实践建议在15-60分钟之间)。

是的,任何拥有该令牌的人都是被授权的。由应用程序和浏览器来保护令牌。在应用程序中,您应始终:

  • 通过加密通道(HTTPS)发送令牌
  • 正确设置CORS,以便浏览器可以保护您的端点不受其他应用程序的访问
  • 使用较短的令牌到期时间,以限制令牌被误用的时间窗口

是的,任何拥有该代币的人都被授权。由应用程序和浏览器来保护令牌。在应用程序中,您应始终:

  • 通过加密通道(HTTPS)发送令牌
  • 正确设置CORS,以便浏览器可以保护您的端点不受其他应用程序的访问
  • 使用较短的令牌到期时间,以限制令牌被误用的时间窗口

在客户处存储JWT的最佳实践

它应该存储在一个httpOnly cookie中,这是一种特殊的cookie,只在HTTP请求中发送到服务器,它永远无法从浏览器中运行的JavaScript访问(无论是读还是写)


有关更多详细信息,请查看此最佳实践以在客户端存储JWT

它应该存储在一个httpOnly cookie中,这是一种特殊的cookie,只在HTTP请求中发送到服务器,它永远无法从浏览器中运行的JavaScript访问(无论是读还是写)


有关更多详细信息,请查看此

欢迎来到安全世界,这里一切都不同

这个话题一开始看起来更复杂。如前所述,第一步是使用安全连接保护令牌不被拦截。但这并不是故事的结局

如果令牌被安全地传输到客户端,则令牌必须存储在客户端的某个位置。一般有三种选择:

  • 将令牌存储在会话缓存中,例如本地存储
  • 将令牌作为仅HTTP cookie提交,以便脚本无法访问它
  • 将令牌存储在fronded代码中的某个位置
每种方法都有其优点和缺点。让我们从本地存储开始

本质上,本地存储是脚本可以访问的大型JavaScript对象。换句话说:如果一个脚本能够渗透到你的网页,它就能够读取你的本地存储,从而窃取你的令牌

接下来,将令牌作为仅HTTP cookie提交。这似乎很好。如果它是一个只有HTTP的cookies,脚本无法访问该信息,因此该信息是安全的,对吗?不。如果脚本能够渗透到您的站点,并从此站点对安全资源发出请求,则浏览器会自动发送令牌(这就是仅HTTP Cookie的工作方式)。这被称为

最后,可以将令牌存储在脚本中的某个位置。这似乎足够好了,因为可以为令牌选择任何可能的变量名,因此攻击者很难猜测。如果一个人为这个部分编写自己的代码,这是正确的。但大多数情况下,人们会依赖现有的解决方案,攻击者可以找到相应的变量并读取其值。此外,如果令牌未持久存储,则意味着用户必须在每次关闭和重新打开浏览器时重新登录。根据所需的用户体验,这可能不是一个选项

因此,这个问题没有“完美的解决方案”。这是一个“选择你的毒药”的情况。但故事并没有就此结束。如前所述,代币通常有一个到期日。然而,从用户体验来看,如果用户每隔一小时左右就必须重新登录,这是不好的,即使他/她在这段时间内是活跃的。举个例子,我们有刷新令牌的概念。刷新令牌是一种特殊令牌,当提供时,它会生成一个新的JWT访问令牌。然后,访问令牌可以有非常短的过期时间(例如5分钟)。如果访问令牌过期,客户端可以使用刷新令牌请求新令牌,刷新令牌通常很长,可能根本不会过期。但这只是我