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

我必须将令牌存储在cookie、localstorage或session中吗?

邹海超
2023-03-14

我正在使用React SPA、Express、Express-session、Passport和JWT。我对存储令牌的一些不同的客户端存储选项感到困惑:cookie、Session和JWT/passport。

是否必须将令牌存储在cookie中,即使我可以将它们存储在req.sessionid中?

 jwt.sign(
        payload,
        keys.jwt.secretOrPrivateKey, 
        {
            expiresIn:keys.jwt.expiresIn // < i dont know what is this expired for cookies or localstorage ?
        }, (err, token) => {

            res.redirect(keys.origin.url + "?token=" + token);
        });

我真的可以通过使用sessionID(没有cookie或localstorage)来存储与会话相关的所有内容吗?

只有做一次fetch,或者每一页刷新和检索数据,然后保存到redux,因为我使用React SPA。

共有1个答案

邹昊
2023-03-14

这个答案基于无状态方法,因此它不讨论传统的会话管理

你问了两个完全不同的问题:

  1. 购物车-与业务功能更相关
  2. OAuth2&jwt-与安全性和身份验证有关

LocalStorageSessionStorage不在子域之间共享。因此,如果我们有两个SPA在不同的子域上运行,我们将无法获得SSO功能,因为一个应用程序存储的令牌对组织内的另一个应用程序不可用。有一些使用iframe的解决方案,但它们看起来更像是变通办法,而不是好的解决方案。当响应标头x-frame-options用于避免使用iframe进行点击jacking攻击时,使用iframe的任何解决方案都是不可能的。

但是,可以通过使用指纹(如OWASP JWT备忘单中提到的)来降低这些风险,而指纹又需要cookie。

指纹的思想是,产生一个密码学上强的字节随机字符串。然后,原始字符串的Base64字符串将存储在httponlysecuresamesitecookie中,其名称前缀为__secure-。应该根据业务需求使用域和路径属性的正确值。该字符串的SHA256哈希也将在JWT的声明中传递。因此,即使XSS攻击将JWT访问令牌发送到攻击者控制的远程服务器,它也不能发送cookie中的原始字符串,因此服务器可以基于cookie的缺失拒绝请求。XSS脚本无法读取cookiehttponly

  1. 状态变量(Auth0使用它)-客户机将生成并随每一个请求传递一个密码学上很强的随机nonce,服务器将随响应回送该nonce,从而允许客户机验证该nonce。在Auth0文档中有解释。
  2. 始终检查referer标头,并仅在referer是受信任域时接受请求。如果referer header不存在或非白名单域,只需拒绝请求。使用SSL/TLS时,通常会出现引用器。登陆页面(主要是信息性的,不包含登录表单或任何安全内容)可能会很放松,并允许缺少referer标题的请求。
  3. 跟踪HTTP方法应在服务器中被阻止,因为该方法可用于读取httponlycookie。
  4. 还设置标题strict-transport-security:max-age=;IncludeSubDomains只允许安全连接,以防止任何中间人从子域覆盖CSRF cookie。
 类似资料:
  • 问题内容: 我正在使用ExpressJS,Mongodb(Mogoose)构建应用程序。应用程序包含访问用户之前必须对其进行身份验证的路由。 目前,我已经编写了一个快速的中间件来做同样的事情。在这里,借助JWT令牌,我正在进行mongodb查询以检查用户是否已通过身份验证。但是感觉这可能会在我的数据库上增加不必要的请求负载。 我应该针对此特定任务集成redis吗? 会改善API性能吗?还是应该继续

  • 在处理基于浏览器的应用程序时,关于安全存储JWT令牌的主题已经提出了很多问题。大家一致认为,应该使用仅限http的安全cookie。然而,当涉及短期访问令牌和长期刷新令牌时,存储JWT令牌似乎存在许多变化。 我发现了以下变化: 1.仅将JWT访问令牌和刷新令牌存储在http安全cookie中 赞成的意见: 无法从Javascript访问访问令牌和刷新令牌 欺骗: 引入CSRF漏洞,因此也必须添加C

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

  • Stormpath 中有很多博客文章讨论了您应该如何使用 cookie 而不是 sessionStorage/localStorage 来存储您的 JWT: https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage https://stormpath.com/blog/token-auth-sp

  • 我使用带有Angular 9的Spring boot和无状态会话实现。应用程序正在成功执行登录和注册功能。字符串引导在每个登录请求上生成令牌(JWT)。登录后,当我尝试运行第二个选项卡的应用程序时,它再次要求我登录。为了克服这个问题,我将令牌保存在LocalStorage,然后在单击另一个选项卡时,angular代码能够从LocalStorage中选择令牌。但是经过一些研发,我知道应该使用HTTP

  • 为了使用JWT保护REST API,根据一些材料(如本指南和本问题),JWT可以存储在本地存储或Cookies中。根据我的理解: localStorage受XSS限制,通常不建议在其中存储任何敏感信息 对于cookie,我们可以应用“httpOnly”标志,以降低XSS的风险。然而,如果我们要从后端的Cookies中读取JWT,那么我们将受到CSRF的约束 因此,基于上述前提,最好将JWT存储在C