gpt4 book ai didi

django - 在 cookie 中保存身份验证 token (Django Rest Framework + React)

转载 作者:行者123 更新时间:2023-12-04 23:36:58 24 4
gpt4 key购买 nike

所以,正如标题所说,我正在使用 Django Rest Framework,结合 React。

我使用 token 身份验证对用户进行身份验证。现在我面临一个问题。当我重新加载页面(例如按 F5 键)时,所有状态都消失了,在这种情况下我无法保存 token ,需要用户再次登录。

我想过将 token 存储在 cookie 中,但这似乎不太安全。

还有其他类似的问题,但没有答案真正解释这是多大的安全风险。我认为它相当高,因为拥有 token 似乎足以作为后端的某个人进行身份验证。

所以,我的问题是:我假设将我的身份验证 token 存储在 cookie 中是不安全的吗?

注:我正在考虑切换到基于 session 的身份验证,但我宁愿保护我的工作并保留 token 身份验证。

最佳答案

我忘记了我的旧答案仍然在互联网上获得了一些牵引力……而且我后来意识到这部分是错误的。
更新答案:I thought about storing the token in a cookie, but that doesn't seem very safe.如果操作正确,它就足够安全了。是的,任何对系统有物理访问权限的人仍然可以读取 cookie。更多关于这个下面。
让我们澄清一件事,绝对有必要在客户端(在本例中为浏览器)存储一些数据,并通过 API 调用发送这些数据以验证用户身份。让我们称这些数据为“ token ”。
当您在 API 调用中发送此 token 时,任何对系统具有物理访问权限的人都可以查看它。此外,没有必要对其进行加密,因为...

  • 您需要在发送之前对其进行解密,这使得未加密的字符串可读。
  • 您还需要在客户端存储解密 key ,这让我们回到了同样的问题。

  • 有什么选择?老实说,就这样吧。大多数网站都是这样工作的(几乎)。除非该网站持有一些非常敏感的信息。在这种情况下,可能会研究基于时间的密码、基于硬件的密码、生物特征?这些方法主要将安全保存 key 的责任转嫁给用户。
    你当然可以,让它更安全。以下是一些提示:
  • 在一段时间/不事件后从服务器中删除 token 。
  • 更新随机请求的 token ,并使之前的无效。
  • 允许用户查看事件 session 并删除它们。
  • 将它绑定(bind)到用户 IP,或者一些难以复制的东西。每次用户用不同的IP登录时,都要求输入密码。

  • 考虑到这一点,让我们谈谈存储 token 。
    我们只需要确保其他网站、恶意脚本和软件无法访问存储的 token 。 (如上所述,用户始终可以读取 token 。)
    您可以将其存储在 cookieslocalStorage .两者都工作正常,但 localStore旨在存储更大的数据。 Cookies最多可以存储 4096 字节的数据 - 这足以存储 token 。 Cookies在处理 SSR(服务器端渲染)时也有帮助。不过,在 React 中处理 cookie 可能会很棘手。 (提示:试试 next.js,它内置了对带有 React 的 cookie 和 SSR 的支持。)
    如果有帮助,您还可以在 cookie 中指定过期时间。
    TL;博士:使用 Cookies完全没问题。只要正确使用它。
    感谢@ShayanSalehian 指出这一点: LocalStorage is subject to XSS and cookie is subject to CSRF. So I think using cookies + CSRF is the most secure way even in TokenAuthentication for storing tokens on client...
    旧答案(剧透警告,部分错误。):
    这也是我不得不面对的事情。在这个过程中失去了几个晚上的 sleep 。
    免责声明:我不是任何安全专家。只是有点痴迷(阅读:偏执)。
    简短版本(回答您的问题):我最终使用 window.localStorage 来存储 token 。虽然我不相信这是最好的做法,但这不仅仅是关于“存储”部分 - 阅读长版以了解更多信息。
    长版:
    首先,让我们澄清一些事情。 React 更像是一个移动应用程序,而不是一个网页/网站。我不是在谈论 React Native - 我的意思是 React.js .
    为什么我说它更像是一个移动应用程序而不是一个网站?
    传统网站通常使用基于 session 的身份验证,浏览器/服务器通常为此准备。显然,这是一项毫不费力且无缝的任务。
    在移动应用程序(或客户端独立应用程序)中,您需要维护某种 token 以本质上告诉服务器“嘿,是我!我前段时间访问过。这是我的身份证。请让我进去好吗?” .问题是,很难在客户端保持 token 安全。在 Android v4.3 之前,Android 本身并没有提供任何安全的方式来存储身份验证 token 。这也不够安全,所以他们不久前引入了硬件支持的 keystore 。这就是为什么某些应用程序不能(并且仍然不能)在有 root 权限的设备上运行的原因。在此处阅读更多相关信息: https://stackoverflow.com/a/19669719/3341737
    与 React/独立 Web 应用程序相比,谷歌(在某种程度上)控制着 Android 客户端。他们实现基于硬件的 keystore 相对容易。对于网络应用程序,有大量的浏览器,有数百个版本等等。
    回到 window.localStorage。与 Cookie 类似,localStorage 对每个域都是隔离的。由于它是一个较新的 API,因此它的设计方式比旧的 Cookie 更好。
    加密 key 没有意义(尽管您可能会混淆它),因为您还需要将解密 key 存储在本地某个地方。因此,如果有人可以访问 token ,他们也可以访问解密 key 。
    这个问题的第二个方面(以及为什么“存储”不是唯一的问题)是 - 你真的想保护谁的 token ?
  • 中间的人?使用 SSL。
  • 其他网站?他们无法访问您域的 localStorage。
  • 一些人?真的。如果他们有,他们可以轻松获得 token 。物理访问 PC。物理访问实际上使他们成为用户(您想保护 token 不受用户影响?)。考虑到此人具有物理访问权限,即使您以某种方式安全地存储它,您也无法保护它。

  • 为什么不?因为您需要随每个请求发送 token - 每个请求发送的数据在浏览器网络检查器中可用。因此,无论您在何处以及如何存储 token ,它都可能被具有 PC 物理访问权限的人窃取。
    为什么不是 cookies ?两个原因(实际上是 1 个):
  • 默认情况下,每个请求都会发送 Cookie。你真的不需要这个,因为你只需要在 API 调用(而不是页面加载)期间发送 token 。此外,由于您使用的是 DRF(适用于任何 RESTful API 后端),您可能需要以特定方式向服务器发送 token - 这需要以任何方式自定义方法。
  • window.localStorage 是一个简洁的小 API(只是 window.localStorage.setItem('key', 'value') )。此外,与 Cookie 相比,最大大小限制要高得多。

  • 因此,window.localStorage 对我来说似乎是一个可行的选择。如果您有更好的解决方案,请启发我。
    话虽如此,这并不意味着您不能提高安全性。以下是一些建议:
  • 在一段时间或一段时间不事件后,从 DB 中使 token 无效/删除。
  • 使用足够随机的请求发送更新的 token (也使前一个无效),并用新的 token 替换存储的 token 。
  • 授予用户删除其帐户保存的 token 以及每个 token 的最后事件的权限。
  • 如果您真的(真的)担心,请将 token 与用户 IP(或其他无法克隆到另一个系统的内容)绑定(bind)。如果用户从新设备/位置/浏览器登录,请使用 2FA。
  • 关于django - 在 cookie 中保存身份验证 token (Django Rest Framework + React),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51143285/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com