クロスオリジンリソースシェアリング- CORS
(別名クロスドメインAJAXリクエスト)は、ほとんどのWeb開発者が遭遇する可能性のある問題であり、Same-Origin-Policyによると、ブラウザはセキュリティサンドボックス内のクライアントJavaScriptを制限します。通常、JSはリモートサーバーと直接通信できません。別のドメインから。過去に、開発者はクロスドメインリソースリクエストを実現するための多くのトリッキーな方法を作成しました。
- リモートと通信するための「プロキシ」としてFlash / Silverlightまたはサーバー側を使用します。
- JSON With Padding(JSONP)。
- リモートサーバーをiframeに埋め込み、フラグメントまたはwindow.nameを介して通信します。ここを参照してください。
これらのトリッキーな方法には多少の問題があります。たとえば、JSONPは開発者がそれを単に「評価」するとセキュリティホールにつながる可能性があり、上記の#3は機能しますが、両方のドメインは互いに厳密なコントラクトを構築する必要があり、柔軟でもエレガントでもありません私見では:)
W3Cは、この問題を解決するための安全で柔軟な推奨される標準的な方法を提供する標準ソリューションとして、Cross-Origin Resource Sharing(CORS)を導入しました。
メカニズム
高レベルでは、CORSはドメインAからのクライアントAJAX呼び出しとドメインBでホストされているページとの間の契約であると簡単に見なすことができます。典型的なクロスオリジン要求/応答は次のようになります。
DomainA AJAXリクエストヘッダー
Host DomainB.com
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json
Accept-Language en-us;
Accept-Encoding gzip, deflate
Keep-Alive 115
Origin http://DomainA.com
DomainB応答ヘッダー
Cache-Control private
Content-Type application/json; charset=utf-8
Access-Control-Allow-Origin DomainA.com
Content-Length 87
Proxy-Connection Keep-Alive
Connection Keep-Alive
上記でマークした青色の部分はカーネルの事実であり、「Origin」リクエストヘッダーは「クロスオリジンリクエストまたはプリフライトリクエストの発信元を示します」、「Access-Control-Allow-Origin」レスポンスヘッダーはこのページがDomainA(値が*の場合、任意のドメインからのリモート要求を許可することを示します)。
上記で述べたように、W3 は実際にクロスオリジンのHTTPリクエストを送信する前に「プリフライトリクエスト」を実装するようブラウザに推奨しましたOPTIONS
。
OPTIONS DomainB.com/foo.aspx HTTP/1.1
foo.aspxがOPTIONS HTTP動詞をサポートしている場合、以下のような応答を返す可能性があります。
HTTP/1.1 200 OK
Date: Wed, 01 Mar 2011 15:38:19 GMT
Access-Control-Allow-Origin: http://DomainA.com
Access-Control-Allow-Methods: POST, GET, OPTIONS, HEAD
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Max-Age: 1728000
Connection: Keep-Alive
Content-Type: application/json
応答に「Access-Control-Allow-Origin」が含まれ、その値が「*」であるか、CORSリクエストを送信したドメインが含まれている場合のみ、この必須条件の条件を満たすことにより、ブラウザは実際のクロスドメインリクエストを送信し、結果をキャッシュします「プリフライト結果キャッシュ」
3年前にCORSについてブログに投稿しました:AJAX Cross-Origin HTTP request
http://siteA/MyCode.js
。