如何在基于Web的应用程序中正确安全地存储JWT令牌?

Ale*_*lex 7 javascript browser frontend jwt

我听说过有关浏览器存储和cookie的信息,但无法弄清楚存储令牌的最佳安全方法是什么。另外也不知道是否存在其他方法,或者是否有任何第三方库可以正常工作。

我想详尽地列出可用的方法,以每种方法的优点/不便之处以及最好的方式(如果有的话)列出所有方法。

big*_*ann 12

  1. JWT 永远不应该存储在您的 localStorage 中
  2. 事实上,它们甚至不应该存储在您的 cookie 中除非您能够实施非常严格的 CSRF 保护

查看此内容以获取动力

  • JWT 作为 id_token 就像您的用户凭据
  • JWT 作为 access_token 就像您的会话令牌

最安全的选项是内存中查看此内容以进行深入研究

  • 问题询问在哪里存储 JWT,但您的答案仅回答了在哪里不存储 JWT 并提供了一些链接。答案大多应该是独立的,因此如果链接有答案,最好将该信息带入您的答案中。 (36认同)
  • @giraffesyo 答案在最后一行:“最安全的选项是内存中的”。 (4认同)
  • 据我了解,内存存储似乎只能在单页应用程序中使用。 (2认同)

Dmi*_* S. 7

JWT的存储位置

使用基于令牌的身份验证,可以选择存储JWT的位置。强烈建议您将令牌存储在本地存储/会话存储或cookie中。

Web存储(本地存储/会话存储)

通常,JWT放置在浏览器的本地存储中,这对于大多数用例都适用。

使用用户名和密码登录用户时,响应正文包含access_token JWT。然后,您需要在客户端代码中处理此响应。然后可以将此令牌存储在localStorage或sessionStorage中。

单击此处获取使用sessionStorage的示例

这两个localStoragesessionStorage两个扩展Storage。它们之间的唯一区别是数据的持久性:

localStorage-数据一直保留到明确删除为止。所做的更改将被保存,并可供当前和将来对该站点的所有访问。

sessionStorage-所做的更改将被保存,并且可用于当前页面以及将来在同一窗口上访问该网站。关闭窗口后,将删除存储。

Web存储的缺点

  • 与cookie不同,本地存储被沙箱化到特定域,并且其数据不能被任何其他域(包括子域)访问。
  • Web存储可通过同一域上的JavaScript进行访问,因此,您站点上运行的所有JavaScript都可以访问Web存储,因此,它很容易受到跨站点脚本(XSS)攻击的攻击。
  • 开发人员必须确保JWT始终通过HTTPS发送,绝不通过HTTP发送。

使用Cookies

您还可以使用cookie来存储JWT。设置cookie的确切方法取决于您使用的客户端语言。

有多种选项可控制Cookie的生存期:

  • 关闭浏览器后,可以销毁cookie(会话cookie)。
  • 实施服务器端检查(通常由使用中的Web框架为您完成),然后可以实现到期或滑动窗口到期。
  • Cookies可以是永久性的(在关闭浏览器后不会销毁),并且会过期。
  • Cookie既可以由JavaScript读取,也可以由服务器端代码读取,如果httpOnly设置了该标志,则只能由服务器端读取。

Cookie的缺点

  • Cookie的最大大小仅为4kb,因此如果您对令牌附加了许多声明,可能会出现问题。
  • Cookies可能是易受攻击的跨站点伪造(CSRF或XSRF)攻击。当恶意网站使用户的Web浏览器在当前已对用户进行身份验证的受信任站点上执行有害操作时,会发生这种类型的攻击。这是对浏览器如何处理Cookie的一种利用。使用Web应用程序框架的CSRF保护,使Cookie成为存储JWT的安全选项。通过检查HTTP RefererOrigin标头也可以部分阻止CSRF 。
  • 如果应用程序需要跨域访问,可能很难实现。Cookies具有其他属性(域/路径),可以对其进行修改以允许您指定允许将cookie发送到的位置。

原始文章:https : //auth0.com/docs/security/store-tokens#how-to-implement

  • 你好,我喜欢你的回答。还有一个问题是:“与 cookie 不同,本地存储被沙盒化到特定域,其数据不能被任何其他域(包括子域)访问”您能否提供一个示例?这在实践中意味着什么? (2认同)