我一直在阅读CORS
及其运作方式,但我发现很多令人困惑的事情。例如,有很多关于诸如
用户
Joe
正在使用浏览器BrowserX
从site.com
获取数据, 然后向spot.com
发送请求。为此,spot
有 特别标题... yada yada yada
没有太多背景,我不明白为什么网站不会让某些地方的请求。我的意思是,他们的存在是为了回应请求,不是吗?为什么某些人的请求不被允许?
非常感谢CORS
要解决的问题的一个很好的解释(或一个链接)。
所以问题是,
CORS
正在解决的问题是什么?
答案 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等发出请求,对吗?然后,我的网站将代表您发布信息,阅读信息,下订单等。或者代表我的帐户。