【问题标题】:How to Authenticate Django REST API with HTTP only cookie?如何使用仅 HTTP cookie 验证 Django REST API?
【发布时间】:2021-02-19 20:18:11
【问题描述】:

我使用django rest框架和react js环境为我的项目存储jwt令牌本地存储,cookie不安全所以我决定保存httponly cookie,我如何实现身份验证

如何在http header中传递token

【问题讨论】:

    标签: reactjs django django-rest-framework django-react


    【解决方案1】:

    以下文字来自我的文章React and Token-based Authentications with Django REST API Backend,是complete tutorial on how to build SaaS with Django and React from scratch的一部分。

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

    这是我的看法。

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

    请注意,如果您使用基于令牌的身份验证,则 DRF 中会禁用 CSRF cookie。 CSRF cookie 仅在基于会话的身份验证的情况下启用。所以如果你还想使用httpOnly cookie,请记得使用CSRF cookie(否则有可能被CSRF攻击!)。

    【讨论】:

    • 如果最安全的选择是不在客户端存储任何安全数据并强制用户在每次刷新时登录,如果你想持久化安全数据怎么办?
    • 恶意代码进入浏览器的唯一途径是浏览器扩展。如果您使用 Httponly cookie,扩展仍然可以从服务器获取数据。但它不能直接从服务器访问数据。我认为没有办法完全阻止扩展访问 javascript。攻击者还有其他方式进行 XSS 攻击吗?考虑到我在发送到后端之前在客户端对我的所有数据进行了编码。并在将它们存储到数据库之前过滤掉任何多余的字符。因此,当我想在前端使用数据时,我会再次对其进行解码
    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2021-03-04
    • 2020-12-01
    • 2013-08-22
    • 2016-01-26
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    相关资源
    最近更新 更多