问题和标题一样。
我一直在关注有关Django Rest Framework的教程(来自Thinkster),其中有关身份验证的内容如下所示。
” 在我们的情况下,客户端和服务器将在不同的位置运行。服务器将在http://localhost:3000/上运行,而客户端将在http://localhost:5000/上运行。浏览器认为这两个位置在不同的域中,类似于在http://www.server.com上运行服务器,在http://www.client.com上运行客户端。我们将不允许外部域访问我们的Cookie,因此我们必须找到使用会话的另一种替代解决方案。
如果您想知道为什么我们不允许访问我们的cookie,则应查看下面链接的有关“跨域资源共享(CORS)”和“跨站点请求伪造(CSRF)”的文章。如果您只想开始编码,请选中相应的框并继续操作。
”
在这里,我阅读了这里推荐的所有材料,以及有关CORS和CSRF的MDN文档,但是仍然不明白为什么在这里使用CORS和CSRF时不应该使用会话。
我什至发现有些页面说如果我将'withCredentials'字段更改为'true',那么我就可以参加会议。(CORS requests with session/cookie)
答案 0 :(得分:0)
首先,您应该了解会话和cookie的工作方式。当对站点 A 发出请求时,浏览器将发送该站点的所有cookie以及用于会话身份验证的请求。
假设拥有站点 B 的攻击者 Eve (出于某种原因而经常在网络安全中使用)想要访问站点A,他要做的就是只需在浏览器添加A的cookie时发送请求,因为该请求将发送给A. Voila!您的服务器对请求进行身份验证,他可以访问。这种攻击称为跨站请求伪造(CSRF)
现在,这是跨域请求共享(CORS)。它是浏览器用来防止CSRF攻击的机制。在跨域发出这样的请求之前,他们首先执行 preflight请求,该请求基本上询问服务器是否接受来自给定域的请求以及它们从该域接受哪些HTTP方法和标头。如果您的服务器中未设置CORS(通常使用django-cors),则默认情况下,浏览器将不允许跨域请求。
因此,当客户端和服务器位于不同的域中时,您实际上可以使用会话身份验证,但是您必须确保将白名单中的仅客户端域列入白名单,而使用CORS拒绝来自其他域的请求配置。
当然,更聪明,更邪恶的夏娃仍然可以以某种方式找到解决该问题的方法,但是它至少可以确保您网站的基本和最低安全性