JWT应该存储在localStorage还是cookie?

pki*_*169 68 security cookies restful-authentication local-storage jwt

为了使用JWT保护REST API,根据一些材料(如本指南和此问题),JWT可以存储在localStorageCookies中.根据我的理解:

  • localStorage受XSS限制,通常不建议在其中存储任何敏感信息.
  • 使用Cookie,我们可以应用标志"httpOnly",这可以降低XSS的风险.但是,如果我们要在后端从Cookies读取JWT,那么我们将受到CSRF的约束.

因此,基于上述前提 - 最好将JWT存储在Cookies中.在每次向服务器发出请求时,将从Cookie中读取JWT并使用承载方案添加到授权标头中.然后,服务器可以验证请求标头中的JWT(而不是从cookie中读取它).

我的理解是否正确?如果是这样,上述方法是否有任何安全问题?或者实际上我们可以在第一时间使用localStorage逃脱?

Ima*_*ghi 38

我喜欢@ pkid169所说的文章中提到的XSRF Double Submit Cookies方法,但文章中有一件事没有对你说.您仍然没有受到XSS保护,因为攻击者可以执行的操作是注入读取CSRF cookie(不是HttpOnly)的脚本,然后使用此CSRF令牌向您的某个API端点发出请求,并自动发送JWT cookie.

所以实际上你仍然容易受到XSS的攻击,只是攻击者无法窃取你的JWT令牌供以后使用,但他仍然可以使用XSS代表你的用户提出请求.

无论是将JWT存储在localStorage中还是将XSRF令牌存储在非http-only cookie中,都可以通过XSS轻松获取.甚至你的HttpOnly cookie中的JWT也可以通过高级XSS攻击来获取.

因此,除了Double Submit Cookies方法之外,您还必须始终遵循针对XSS的最佳实践,包括转义内容.这意味着删除任何可能导致浏览器执行您不​​希望的操作的可执行代码.通常这意味着删除// <![CDATA [标记和HTML属性,导致JavaScript被评估).

  • 你能澄清一下如何抓住HttpOnly cookie中的JWT吗?如果XSRF令牌被XSS攻击,XSRF可以使用它,但它真的可以被自己抓取吗? (5认同)
  • “即使你在 HttpOnly cookie 中的 JWT 也可以被高级 XSS 攻击抓取。” 是假的。编辑原始帖子以更正此问题。 (2认同)

pki*_*169 18

来自Stormpath的及时帖子已经详细阐述了我的观点并回答了我的问题.

TL; DR

将JWT存储在cookie中,然后在我提到的每个请求上通过授权头中的JWT,或者如文章所示,依靠后端来防止CSRF(例如xsrfToken在Angular的情况下使用).

  • 您好,我不确定这是否正确,但是当您为控制器实现 CrossOrigin 时,使用 cookie 存储 jwt 是否有一些特别的缺点,这是我的服务器应用程序位于不同位置的场景,我们正在调用api 在我们位于另一个城市的客户端应用程序中?这难道不是许多网络服务提供商不使用 cookie 的原因吗? (3认同)
  • 当我将 JWT 存储在 cookie 中时,如何将其添加到授权标头中?我无权访问它... (3认同)

dev*_*tor 15

  • 不要将您的令牌存储在 LocalStorage 或 SessionStorage 中,因为此类令牌可以从 javascript 中读取,因此容易受到 XSS 攻击。
  • 不要将您的令牌存储在 Cookie 中。Cookie(带有 HttpOnly 标志)是一个更好的选择——它有 XSS 倾向,但容易受到 CSRF 攻击

相反,在登录时,您可以提供两个令牌:访问令牌和刷新令牌。访问令牌应存储在 Javascript 内存中,刷新令牌应存储在 HttpOnly Cookie 中。刷新令牌仅用于创建新的访问令牌 - 仅此而已。

当用户打开新标签页或站点刷新时,您需要根据存储在 Cookie 中的刷新令牌执行创建新访问令牌的请求。

我也强烈推荐阅读这篇文章:https : //hasura.io/blog/best-practices-of-using-jwt-with-graphql/

  • 当您可以将刷新令牌视为访问令牌时,为什么会增加复杂性?如果我将访问令牌标记为“secure”、“samesite: strict”、“http-only”,这种方法如何更安全? (12认同)
  • 这并不更安全 (3认同)
  • 如果您的页面中有恶意 XSS,该脚本可以对 /refresh-token 执行 GET 请求并访问新的 jwt,然后将其发送到远程服务器。那么,在这种情况下,这个模式是否具有与 localstorage 相同的漏洞? (2认同)

Ian*_*ter 11

为了帮助防止利用现有 cookie 的 CSRF 攻击,您可以使用该SameSite指令设置 cookie。将其设置为laxstrict

这仍然是一个草案,截至 2019 年,尚未得到所有当前浏览器的完全支持,但根据您的数据的敏感性和/或您对用户使用的浏览器的控制,这可能是一个可行的选择。设置该指令SameSite=lax将允许“使用‘安全’...HTTP 方法的顶级导航”。