CORS 简单解释
Chat GPT生成的图片
你可能见过这种情况很多次了吧?
有成千上萬篇文章解釋如何修復上述錯誤,但“跨源資源共享(CORS)”究竟是什么,它又是怎么來的,為什麼會有這個東西?
为什么???
让我们先通过一个场景来回答为什么,然后看看它在不同时间点上会如何发展。
想象一下:你登录了bank.com
,这是你的银行服务。登录后,会在你的浏览器中存储一个“会话 cookie”。会话 cookie 告诉bank.com
背后的服务器,你的浏览器当前已登录到你的账户。以后对bank.com
的所有请求都将包含这个 cookie,服务器会认为你已登录,并作出相应的回应。
好的,现在你决定查看你的邮箱。你看到一封可疑的邮件,并且决定点击其中的链接,这将你带到attack.com
。记得,由于你浏览器中的那个会话 cookie,bank.com
仍然认为你是登录状态。接下来,这个网站向bank.com
发送请求以获取你的银行信息。对于bank.com
服务器来说,这看起来像你正常请求银行信息,因此它会将信息返回。现在,attack.com
可以访问这些信息,并恶意存储它们。
人们觉得这不太好,于是浏览器采用了同源策略(Same-Origin Policy),如果发现你试图从任何地方(除了 bank.com
)向 bank.com
发出请求,这些请求将会被阻止。这一点很重要——这实际上是一个浏览器层面的策略。bank.com
实际上无法得知请求来自哪里,因此不能很好地防范如 CSRF 这样的攻击。你的浏览器会介入并规定,如果看起来你在尝试向某个源(如 https://foo.com:4000 或 http://bar.org:3000 等 URL)发送请求,它只会发送相同源的请求。
这确实很棒,但它限制性太强了。我的意思是,公共API根本无法直接使用。除非你通过某种代理解决方案,否则你就无法请求数据。
zh: CSRF (跨站请求伪造)
你知道吗:服务器其实可以猜出请求是从哪里来的。有一个“Origin来源”,请求通常会带上这个信息,表明是哪个来源发起的请求。比如在刚才那个例子中,请求大概就是这个样子。
发往 bank.com, {
源: http://attack.com
}
理论上来说,bank.com
应该检查这一点以确保它只回应来自合理来源的请求。通常它确实如此,因此,同源策略似乎有点局限性。
这就是CORS登场的地方。
zh: CORS (跨域资源共享)
依据SOP,此类跨源请求不会被直接阻止,而是bank.com
的服务器可以检查这个Origin
头,并根据自己的CORS策略决定是否允许或拒绝该请求。当来自example.com
的网站尝试从bank.com
请求资源时,浏览器会在请求中自动包含一个Origin
头,表明请求来自example.com
。
如果 bank.com
认为 example.com
可信,或者请求的资源是公开的,它可以返回特定的 CORS 标头,如 Access-Control-Allow-Origin
,指明哪些来源可以访问该资源。此标头可以设置为 http://example.com
,明确允许该来源,或设置为 *
,以允许任何来源访问。
当然,浏览器让这一切变得简单。如果其中有任何错误的话,你就会看到那个讨厌的错误提示。
那如果请求没有Origin
头部又会怎样?如果它包含多个其他的头部,而是使用了其他方法又会怎样?
在这种情况下,CORS的处理就会变得稍微复杂一些,因为它不再是一个“简单请求”。这时候,CORS中的“预检查”请求的概念就显得很重要了。
起飞前检查
对于可能修改服务器数据的某些请求,如果它们使用 PUT 或 DELETE 方法,或带有不会自动包含在每个请求中的特殊头部,浏览器会先发送一个“预检”请求,之后再发送实际请求。这个“预检”请求是一个 HTTP OPTIONS 请求,其目的是确认服务器是否允许发送实际请求。
前置请求包含了描述实际请求的HTTP方法及其头部信息。接下来:
- 服务器响应:如果服务器支持CORS策略并且实际请求也得到支持,它会用包含允许的方法和头部的响应头来响应预检请求。这可能包括如
Access-Control-Allow-Methods
和Access-Control-Allow-Headers
这样的响应头。 - 浏览器决策:根据服务器对预检请求的响应结果,浏览器决定是否继续实际请求。如果服务器的响应表明请求被允许,浏览器会发送实际请求;如果未被允许,浏览器会阻止请求,你会看到一个与CORS相关的错误信息。
所以,最后的结论是...
现在,希望你对CORS有了更多的了解。我认为最重要的是要明白,这一切都是浏览器的策略,你的服务器必须按照这些政策编写以符合要求。它的目的是保护你。如果你使用的是Chrome浏览器,你不必太担心点击错误的链接(当然,你仍然应该稍微有点警惕 :D)。然而,这并不是一个绝对安全的策略。如果你使用的是不遵循标准的第三方浏览器,所有这些保护措施都会失效。这就是为什么一定要谨慎选择使用的软件!
共同学习,写下你的评论
评论加载中...
作者其他优质文章