如何使用仅 HTTP cookie 验证 Django REST API?

How to Authenticate Django REST API with HTTP only cookie?

我的项目使用django rest framework和react js环境,存储jwt token local-storage,cookie不安全所以我决定保存httponly cookie,如何实现authenticate

如何在 http 中传递令牌 header

以下文字来自我的文章React and Token-based Authentications with Django REST API Backend, which is a part of complete tutorial on how to build SaaS with Django and React from scratch

互联网上有很多关于如何在网站中存储 auth_token 以确保安全的讨论:

这是我的看法。

  • 最安全的选择是不在 client-side 上存储任何安全数据。只需在用户每次刷新网站或在新标签页中打开网站时强制用户登录即可。
  • 在 XSS(跨站点脚本)攻击的情况下,可以读取 localStorage 中的值。这是真的。如果我们在带有 httpOnly 设置的 cookie 中设置了令牌,那么在 XSS 的情况下它们将无法读取。也是真的。这是否意味着带有 httpOnly 的 cookie 比 localStorage 更好?不能这么说。
  • 首先,React有一个built-in机制来对抗XSS攻击。仅当您使用 dangerouslySetInnerHTML.
  • 明确要求时,它才会呈现原始 HTML
  • 如果会有 XSS,那么坏人可以从 localStorage 读取 token 但他能用它做什么?他可以将其发送到他的服务器或将其用于恶意请求。我们可以使用内容安全策略 (CSP) 保护应用程序免于从未知来源加载未知脚本(我肯定会在以后 posts 中写到)。
  • 好的,所以仍然可以选择进行恶意请求。这可以用于两种类型的数据存储:localStoragecookies.
  • 此外,如果使用带有 httpOnly 的 cookie,则可以从其他来源进行恶意请求(Cross-Site 请求伪造)。这种攻击不适用于 localStorage.
  • 防止恶意请求的最简单解决方案是注销(在我们的例子中)。在本教程中,在注销时令牌被销毁,因此不能再使用它来验证请求(我使用的是 Djoser 包)。
  • 总而言之,在 XSS 的情况下,无可救药(cookie 帮不上什么忙)。 Cookie 启用了另一种类型的 CSRF 攻击。

请记住,如果您使用 token-based 身份验证,DRF 中将禁用 CSRF cookie。 CSRF cookie 仅在 session-based 身份验证的情况下启用。所以如果你还想使用httpOnly cookies,请记得使用CSRF cookies(否则有可能发生CSRF攻击!)。