首页 > 解决方案 > 在 cookie 中存储 Bearer 令牌的安全性

问题描述

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

当用户登录时(通过 axios 和 api),api 返回一个访问(Bearer token)作为响应。我使用 react-cookie 框架将访问令牌作为 cookie 存储在浏览器中。此 cookie 将被读取并用于任何未来的请求。

这是正确的做法吗?cookie 数据不就是浏览器中任何攻击者都可以轻松获取的东西吗?因为它只是某处计算机的文件。

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

令牌的寿命可以说是 1 年。它只会在用户每次登录时刷新。我知道如果我将寿命设置得更短,它会更安全。但是,这是否意味着用户必须不断登录?

- - -更新 - - -

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

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

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

就像facebook一样,如果我清除缓存,我将不得不重新登录。这意味着 Facebook 正在我的定位计算机上存储一些内容,以便下次我可以自动进行身份验证

标签: cookiessingle-page-applicationcsrfcsrf-protectionbearer-token

解决方案


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

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

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

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

- - - - 更新 - - -

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

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

推荐阅读