在Cookie中存储Bearer令牌的安全性

use*_*902 5 cookies csrf csrf-protection single-page-application bearer-token

我的SPA使用React作为前端,使用laravel API作为后端。

当用户登录时(通过axios和api),api将返回访问(承载者令牌)作为响应。我使用react-cookie框架将访问令牌作为cookie存储在浏览器中。该cookie将被读取并用于以后的任何请求。

这是正确的方法吗?Cookie数据不只是浏览器中可以被任何攻击者轻易获得的东西吗?由于它只是一个文件,因此可以放在计算机的某个位置。

是什么阻止了攻击者获取该Cookie,冒充该用户并开始执行需要身份验证的操作?

该令牌的使用寿命为1年。仅在用户每次登录时才会刷新。我知道,如果将寿命设置得较短,它将更加安全。但是,这是否意味着用户将不得不不断登录?

-----更新-----

我不确定所提供的解决方案是否回答了我的问题。SPA应用程序是基于前端的,并且该请求可以来自任何地方,例如邮递员,移动应用程序或希望与我的后备服务器通信的任何第三方设备。因此,这些设备需要一种在本地存储一些访问令牌以用于将来任何请求的方法。

我知道这可能发生的唯一方法是服务器将一些身份验证令牌发送给请求者,并将其存储在某个地方以用于下一个请求。

在这种情况下,我不确定CSRF令牌或其他任何方式是否可以帮助我解决问题?

就像facebook一样,如果我清除缓存,则必须重新登录。这意味着facebook正在我的位置计算机上存储一些东西,以便下次可以自动对我进行身份验证

Swa*_*odo 7

你的 JS 不应该访问 cookie。您可以在 Cookie 上设置一些标志,这将有助于保护它们并确保它们仅用于正确的目的。

如果在 cookie 上设置了HttpOnly标志,那么 JS 将无法访问它,但它仍然会随任何请求一起发送。

SameSite标志将确保 cookie 仅发送回向您提供该 cookie 的站点。从而防止泄漏。

安全将使其仅通过安全连接发送 cookie,以防止有人从您的网络流量中嗅探它。

编辑

您可能想要查找授权工作流程,但其要点是:

  1. 用户使用用户名和密码登录
  2. 从后端登录时会发出 JSON Web 令牌并将其发送到浏览器
  3. JWT(JSON Web token)可以存储在浏览器Web Storage(Session Storage)中的cookie中
  4. 对 REST API 的后续请求将在标头或查询字符串中嵌入令牌以进行授权。通过这种形式的授权,您的 REST API 可以了解谁在发出请求以及根据授权级别返回哪种资源

请参阅@tpopov 的回答,因为他也提出了一些非常好的观点。


tpo*_*pov 5

我只想添加一些在 cookie 中存储令牌的缺点,您也应该注意:

  • cookie 的最大大小仅为 4kb,因此如果您对令牌附加了许多声明,则可能会出现问题。

  • Cookie 可能容易受到跨站点请求伪造(CSRF 或 XSRF)攻击。使用 Web 应用程序框架的 CSRF 保护使 cookie 成为存储 JWT 的安全选项。通过检查 HTTP Referer 和 Origin 标头,也可以部分防止 CSRF。您还可以设置 SameSite=strict cookie 标志来防止 CSRF 攻击。

  • 如果应用程序需要跨域访问,则可能难以实施。Cookie 具有附加属性(域/路径),可以修改这些属性以允许您指定允许将 cookie 发送到何处。

- - - - 更新 - - -

您还可以使用 cookie 来存储身份验证令牌,即使它更好(至少在我看来比使用本地存储或某些会话中间件(如 Redis)更好)。如果我们将 httpOnly 和安全标志放在一边,还有一些不同的方法可以控制 cookie 的生命周期:

  • 浏览器关闭后可以销毁 Cookie(会话 Cookie)。
  • 实施服务器端检查(通常由正在使用的 Web 框架为您完成),您可以实施到期或滑动窗口到期。
  • Cookie 可以是持久的(在浏览器关闭后不会被销毁)并具有过期时间。