代码之家  ›  专栏  ›  技术社区  ›  user172902

在cookies中存储不记名令牌的安全性

  •  3
  • user172902  · 技术社区  · 7 年前

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

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

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

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

    代币的使用寿命为1年。它只在用户每次登录时刷新。我明白,如果我把寿命缩短,它会更安全。但是,这意味着用户必须经常登录?

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

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

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

    在这种情况下,我不确定CSRF代币或任何其他方式是否有助于我的担忧?

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   tpopov    7 年前

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

    • cookie的最大大小只有4KB,因此如果 您有许多附加到令牌的声明。

    • cookie易受跨站点请求伪造(csrf或 XSRF攻击。使用Web应用程序框架的CSRF保护使 cookies是存储JWT的安全选项。CSRF也可以部分 通过检查http referer和origin头阻止。你可以 同时设置samesite=strict cookie标志以防止CSRF攻击。

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

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

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

    • 关闭浏览器后可以销毁cookie(会话 饼干)
    • 实现服务器端检查(通常由 使用中的Web框架),您可以实现到期或滑动窗口到期。
    • cookies可以持久(不被销毁 在浏览器关闭后)将过期。
        2
  •  1
  •   Swazimodo    7 年前

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

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

    这个 SameSite 标志将确保仅将cookie发送回给您的站点。防止泄漏。

    这个 Secure 标记将使其仅通过安全连接发送cookie,以防止有人从您的Web流量中嗅出cookie。

    编辑

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

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

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

    推荐文章