跨來源資源共享
跨域资源共享(英語:,缩写:CORS),用于让网页的受限资源能够被其他域名的页面访问的一种机制。[1]
通过该机制,页面能够自由地使用不同源(英語:)的图片、样式、脚本、iframes以及视频。[2]一些跨域的请求(特别是Ajax)常常会被同源策略(英語:)所禁止的。跨源资源共享定义了一种方式,为的是浏览器和服务器之间能互相确认是否足够安全以至于能使用跨源请求(英語:)。[3]比起纯粹的同源请求,这将更为自由和功能性的(functionality ),但比纯粹的跨源请求更为安全。
工作原理
跨域资源共享标准描述了,新的HTTP头部在浏览器有权限的时候,应该以如何的形式发送请求到远程URLs。虽然服务器会有一些校验和认证,但是浏览器有责任去支持这些头部以及增加相关的限制。
对于能够修改数据的Ajax和HTTP请求方法(特别是 GET
以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST
请求),浏览器必须首先使用 OPTIONS
方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨源请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。[5]
瀏覽器支援
擁有以下宣染引擎的瀏覽器都支援 CORS:
- Gecko 1.9.1(Firefox 3.5[4]、SeaMonkey 2.0[6])以上
- WebKit(未確認最早版本,Safari 4 以上、Chrome 3 以上,可能早些)
- MSHTML/Trident 4.0(Internet Explorer 8)由 XDomainRequest 物件提供部份支援[4]
已知以下瀏覽器不支援 CORS:
歷史
Tellme Networks 的馬特·奧什里(Matt Oshry)、布拉德·波特(Brad Porter)與麥克·波德爾(Michael Bodell)於 2004 年 3 月提案將跨來源支援加入 VoiceXML 2.1[10] 以支援 VoiceXML 瀏覽器的跨來源資料請求。W3C 認為這不應該限制在 VoiceXML 而是一般的機制,因此將提案移到另一份實作備忘錄[11]。幾個主要的瀏覽器廠商透過 W3C 的 Web 應用程式工作小組正式的將該備忘錄改寫為 W3C 工作草案並以推動成為 W3C 推薦標準為目標。
CORS vs JSONP
跨域资源共享(CORS)是 JSONP 模式的現代版。與 JSONP 不同,CORS 除了 GET 请求方法以外也支援其他的 HTTP 请求。用 CORS 可以讓網頁設計師用一般的 XMLHttpRequest,這種方式的錯誤處理比 JSONP 要來的好。另一方面,JSONP 可以在不支援 CORS 的老舊浏览器上運作。現代的瀏覽器都支援 CORS[12]。
参考文献
- on July 6, 2009 by Arun Ranganathan. . Hacks.mozilla.org. 2009-07-06 [2012-07-05]. (原始内容存档于2019-09-11).
- . MDN. [2020-01-17]. (原始内容存档于2017-03-12).
- . NCZOnline. [2012-07-05]. (原始内容存档于2016-04-29).
- . Mozilla Developer Network. [2011-06-28]. (原始内容存档于2010-05-27).
- . MDN Web 文档. [2020-01-17]. (原始内容存档于2020-01-14) (中文).
- . Mozilla Developer Network. [2011-06-28]. (原始内容存档于2012-08-03).
- . [2011-06-28]. (原始内容存档于2011-07-17).
- . [2011-06-28]. (原始内容存档于2016-03-03).
- . [2011-06-28]. (原始内容存档于2012-11-09).
- . [2011-06-28]. (原始内容存档于2016-09-23).
- . [2018-06-10]. (原始内容存档于2018-09-24).
- . [2011-06-28]. (原始内容存档于2016-04-29).
外部連結
- (英文)W3C 工作草案 页面存档备份,存于
- (英文)使用指引
- (英文)推廣 CORS 的網站 页面存档备份,存于