将承载令牌存储在cookie中的安全性

问题描述 投票:3回答:2

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

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

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

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

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

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

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

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

在这种情况下,我不确定CSRF令牌或任何其他方式是否有助于我的关注?

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

cookies single-page-application csrf csrf-protection bearer-token
2个回答
2
投票

我只想添加一些在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可以是持久的(在浏览器关闭后不会被销毁)到期。

0
投票

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

HttpOnly标志设置在cookie上,然后JS将无法访问它,但它仍将与任何请求一起发送。

SameSite标志将确保cookie仅被发送回给您的网站。这可以防止泄漏。

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

编辑

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.