跨域资源共享

跨域资源共享(英语:Cross-origin resource sharing,缩写:CORS),用于让网页的受限资源能够被其他域名的页面访问的一种机制。[1]

通过这个机制,页面能够自由地使用跨来源的(英语:cross-origin)图片、样式、脚本、iframes以及视频。[2]一些跨网域的请求(特别是Ajax)常常会被同源策略(英语:same-origin policy)所禁止。跨源资源共享定义了一种方式,让浏览器和服务器之间能互相确认是否足够安全可以允许使用跨源请求(英语:cross-origin requests)。[3]比起严格的同源请求,这将提供更多自由度和功能性(functionality),也比直接允许所有的跨源请求更为安全。

跨域资源共享是一份浏览器技术的规范,提供了 Web 服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略[4]

工作原理

跨域资源共享标准描述了,新的HTTP头部在浏览器有权限的时候,应该以如何的形式发送请求到远程URLs。虽然服务器会有一些校验和认证,但是浏览器有责任去支持这些头部以及增加相关的限制。

对于能够修改数据的Ajax和HTTP请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨源请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。[5]

浏览器支持

拥有以下排版引擎的浏览器都支持 CORS:

已知以下浏览器不支持 CORS:

  • Opera 10.61 为止 Opera 未实现 CORS[9]
  • Carmino 2.0.x 系列未实现 CORS,因为这些版本建构在 Gecko 1.9.0 之上[10]
  • Arora 0.10.2 有 WebKit 的 CORS 相关 API,但是若使用跨来源要求会失败[11]

历史

Tellme Networks 的马特·奥什里(Matt Oshry)、布拉德·波特(Brad Porter)与麦克·波德尔(Michael Bodell)于 2004 年 3 月提案将跨来源支持加入 VoiceXML 2.1[12] 以支持 VoiceXML 浏览器的跨来源资料请求。W3C 认为这不应该限制在 VoiceXML 而是一般的机制,因此将提案移到另一份实现备忘录[13]。几个主要的浏览器厂商透过 W3C 的 Web 应用程序工作小组正式的将该备忘录改写为 W3C 工作草案并以推动成为 W3C 推荐标准为目标。

CORS vs JSONP

跨域资源共享(CORS)是 JSONP 模式的现代版。与 JSONP 不同,CORS 除了 GET 请求方法以外也支持其他的 HTTP 请求。用 CORS 可以让网页设计师用一般的 XMLHttpRequest,这种方式的错误处理比 JSONP 要来的好。另一方面,JSONP 可以在不支持 CORS 的老旧浏览器上运作。现代的浏览器都支持 CORS[14]

参见

参考文献

  1. ^ on July 6, 2009 by Arun Ranganathan. cross-site xmlhttprequest with CORS ✩ Mozilla Hacks – the Web developer blog. Hacks.mozilla.org. 2009-07-06 [2012-07-05]. (原始内容存档于2019-09-11). 
  2. ^ Same-origin policy / Cross-origin network access. MDN. [2020-01-17]. (原始内容存档于2017-03-12). 
  3. ^ Cross-domain Ajax with Cross-Origin Resource Sharing. NCZOnline. [2012-07-05]. (原始内容存档于2016-04-29). 
  4. ^ 4.0 4.1 4.2 HTTP access control (CORS). Mozilla Developer Network. [2011-06-28]. (原始内容存档于2010-05-27). 
  5. ^ HTTP访问控制(CORS). MDN Web 文档. [2020-01-17]. (原始内容存档于2020-01-14) (中文). 
  6. ^ 6.0 6.1 Blink. QuirksBlog. April 2013 [4 April 2013]. (原始内容存档于2016-12-29). 
  7. ^ Google going its own way, forking WebKit rendering engine. Ars Technica. April 2013 [4 April 2013]. (原始内容存档于2020-12-21). 
  8. ^ Gecko. Mozilla Developer Network. [2011-06-28]. (原始内容存档于2012-08-03). 
  9. ^ 存档副本. [2011-06-28]. (原始内容存档于2011-07-17). 
  10. ^ HTTP Access Control in Camino • mozillaZine Forums. [2011-06-28]. (原始内容存档于2016-03-03). 
  11. ^ 存档副本. [2011-06-28]. (原始内容存档于2012-11-09). 
  12. ^ Voice Extensible Markup Language (VoiceXML) 2.1. [2011-06-28]. (原始内容存档于2016-09-23). 
  13. ^ Authorizing Read Access to XML Content Using the <?access-control?> Processing Instruction 1.0. [2018-06-10]. (原始内容存档于2018-09-24). 
  14. ^ Cross-domain Ajax with Cross-Origin Resource Sharing. [2011-06-28]. (原始内容存档于2016-04-29). 

外部链接