当前位置: 首页 > 知识库问答 >
问题:

JWT应该存储在localStorage还是cookie中?[副本]

慕嘉茂
2023-03-14

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

  • localStorage受XSS限制,通常不建议在其中存储任何敏感信息
  • 对于cookie,我们可以应用“httpOnly”标志,以降低XSS的风险。然而,如果我们要从后端的Cookies中读取JWT,那么我们将受到CSRF的约束

因此,基于上述前提,最好将JWT存储在Cookies中。对于服务器的每个请求,JWT都将从cookie中读取,并使用承载方案html" target="_blank">添加到授权头中。然后,服务器可以验证请求头中的JWT(而不是从cookie中读取)。

我的理解正确吗?如果是,上述方法是否存在任何安全问题?或者实际上我们可以从一开始就不用使用本地存储?

共有3个答案

卞昀
2023-03-14
  • 不要将令牌存储在Localstore或Sessionstore中,因为这样的令牌可以从javascript中读取,因此它可以被XSS攻击。
  • 不要在Cookie中存储您的令牌。Cookie(带有HttpOnly标志)是一个更好的选择——它容易受到XSS攻击,但它容易受到CSRF攻击

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

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

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

古明煦
2023-03-14

来自Stormpath的一篇及时的帖子详细阐述了我的观点并回答了我的问题。

将JWT存储在Cookie中,然后在每个请求上传递JWT,如我所述,或者如文章所建议的,依靠后端来防止CSRF(例如,在出现问题时使用xsrfToken)。

杨征
2023-03-14

我喜欢XSRF双提交Cookies方法,它在@pKid169的文章中提到,但是有一件事文章没有告诉你。您仍然不受XSS的保护,因为攻击者可以做的是注入脚本,读取您的CSRF cookie(不是HttpOnly),然后使用此CSRF令牌向您的某个APIendpoint发出请求,JWT cookie将自动发送。

所以在现实中,你仍然容易受到XSS的影响,只是攻击者不能窃取你的JWT令牌供以后使用,但是他仍然可以使用XSS代表你的用户发出请求。

无论您是将JWT存储在本地存储中,还是将XSRF令牌存储在非仅http的cookie中,都可以很容易地被XSS抓取。即使是HttpOnly cookie中的JWT也会被高级XSS攻击抓获。

因此,除了双提交Cookies方法之外,您还必须始终遵循针对XSS的最佳实践,包括转义内容。这意味着删除任何会导致浏览器执行您不希望它执行的操作的执行代码。通常这意味着删除//

 类似资料:
  • 问题内容: 我目前正在使用reactjs构建一个单页面应用程序。我读到许多不使用localStorage的原因是由于XSS漏洞。由于React避开了所有用户输入,现在使用localStorage是否安全? 问题答案: 在大多数现代单页应用程序中,我们确实必须将令牌存储在客户端的某个位置(最常见的用例-在页面刷新后使用户保持登录状态)。 共有2个可用选项:Web存储(会话存储,本地存储)和客户端co

  • 问题内容: 我正在一个应用程序中工作,该应用程序需要在用户登录期间保留一些数据,但我有一个问题,localStorage,sessionStorage和cookie有什么区别? 我在问我可以使用什么来将某些数据持久化在DOM中,即使用户刷新页面,有人说:使用sessionStorage或localStorage,然后,有人想到了使用ngCookies的想法,因为它可以在每个浏览器,但是,我应该使用

  • 数据是非常小的,就像水果的列表,不会经常改变,也只有一个服务将使用这个数据和服务到其他服务,请提到您的方法的优点和缺点。

  • 我正在使用vue.js和vuex开发一个应用程序,它使用JWT令牌对JSON API服务器进行身份验证。所以我想知道存放JWT代币的最佳做法是什么? 如果我将其存储在vuex商店中,则页面刷新后它会丢失,因此用户需要再次登录,这不是很方便。 如果我将其存储在浏览器的本地存储中,它会在下次登录之前被弃用,然后假设身份验证令牌的组件会混淆。我不知道如何处理这个问题。 感谢你对此的暗示。

  • 问题内容: 我正在使用ExpressJS,Mongodb(Mogoose)构建应用程序。应用程序包含访问用户之前必须对其进行身份验证的路由。 目前,我已经编写了一个快速的中间件来做同样的事情。在这里,借助JWT令牌,我正在进行mongodb查询以检查用户是否已通过身份验证。但是感觉这可能会在我的数据库上增加不必要的请求负载。 我应该针对此特定任务集成redis吗? 会改善API性能吗?还是应该继续

  • 本文向大家介绍除了cookie,还有什么存储方式。说说cookie和localStorage的区别?相关面试题,主要包含被问及除了cookie,还有什么存储方式。说说cookie和localStorage的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 还有localStorage,sessionStorage,indexdDB等 cookie和localStorage的区别: co