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

时间:2018-09-30 02:27:29

标签: cookies single-page-application csrf csrf-protection bearer-token

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

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

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

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

  • Cookie的最大大小只有4kb,因此,如果 您对令牌有很多主张。

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

  • 如果应用程序需要,可能难以实现 跨域访问。 Cookies具有其他属性(域/路径) 可以修改以允许您指定Cookie的位置 允许发送。

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

您也可以使用cookie来存储auth令牌,即使这样更好(至少在我看来比使用本地存储或Redis这样的会话中间件)。如果我们搁置httpOnly和安全标志,则有多种方法可以控制Cookie的生存期:

  • 关闭浏览器后,Cookie可能会被破坏(会话 饼干)。
  • 实施服务器端检查(通常由您完成 Web框架),则可以实现过期或滑动窗口过期。
  • Cookie可以持久存在(不会销毁) 浏览器关闭后),并且到期。

答案 1 :(得分:1)

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

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

SameSite标志将确保cookie只发送回给您的站点。这样可以防止泄漏。

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

修改

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

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

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