CORS试图解决的问题是什么?

时间:2014-12-08 19:22:33

标签: cors same-origin-policy

我一直在阅读CORS及其运作方式,但我发现很多令人困惑的事情。例如,有很多关于诸如

之类的细节
  

用户Joe正在使用浏览器BrowserXsite.com获取数据,   然后向spot.com发送请求。为此,spot有   特别标题... yada yada yada

没有太多背景,我不明白为什么网站不会让某些地方的请求。我的意思是,他们的存在是为了回应请求,不是吗?为什么某些人的请求不被允许?

非常感谢CORS要解决的问题的一个很好的解释(或一个链接)。

所以问题是,

CORS正在解决的问题是什么?

3 个答案:

答案 0 :(得分:20)

通过JavaScript(AKA AJAX)从页面发起请求的Web浏览器的默认行为是它们遵循same-origin policy。这意味着只能通过AJAX将请求发送到同一个域(或子域)。对完全不同的域的请求将失败。

存在此限制是因为您的浏览器在其他域发出的请求会附带您的 Cookie ,这通常意味着您将登录到其他网站。因此,如果没有同源,任何网站都可以托管在stackoverflow.com上调用注销的JavaScript,它会将您注销。现在想象一下当我们谈论社交网络,银行网站等时的复杂性。

因此,所有浏览器都只是将基于脚本的网络调用限制在自己的域中,以使其简单安全。

  

www.x.com上的网站X无法向www.y.com网站Y发出AJAX请求,只能向* .x.com

有一些已知的解决方法(例如JSONP在请求中不包含cookie),但这些并不是永久解决方案。

CORS允许这些跨域请求发生,但只有当每一方都选择加入CORS支持时才会发生。

答案 1 :(得分:14)

首先,让我们谈谈相同的原产地政策。我引用a previous answer of mine

  

发明了同源政策,因为它阻止来自一个网站的代码访问另一个网站上的凭据限制内容。默认情况下,Ajax请求与目标站点授予的任何auth cookie一起发送。

     

例如,假设我意外加载http://evil.com/,它会发送http://mail.google.com/请求。如果SOP没有到位,并且我已登录Gmail,则evil.com的脚本可以看到我的收件箱。如果evil.com的网站想要在没有我的Cookie的情况下加载mail.google.com,则可以使用代理服务器; mail.google.com的公开内容不是秘密(但使用我的Cookie 访问时mail.google.com的内容是秘密)。

(请注意,我已经说过"凭据限制的内容",但当网站仅对某些IP地址可见时,它也可以是topology-restricted content。)

然而,有时候,evil.com没有试图窥视您的收件箱。有时,它只是一个有用的网站(例如,http://goodsite.foo)尝试使用来自其他来源的公共API(例如http://api.example.com)。在api.example.com 上努力工作的程序员希望所有来源都可以自由访问他们网站的内容。在这种情况下,api.example.com处的API服务器可以使用CORS标头允许goodsite.foo(或任何其他请求来源)访问其API响应。

因此,总而言之,我们假设默认情况下跨域访问是一件坏事(想想有人试图阅读您的收件箱),但有时候它会事(想想一个试图访问公共API的网站)。 CORS允许在请求的站点希望它发生时发生好的情况。

答案 2 :(得分:0)

不允许来自任何地方的请求存在安全和隐私原因。如果您访问过我的网站,您不希望我的代码使用您的cookie从您的浏览器向Facebook,reddit,您的银行,eBay等发出请求,对吗?然后,我的网站将代表您发布信息,阅读信息,下订单等。或者代表我的帐户。