Cross-Origin Resource Sharing - CORS
(AKA Cross-Domain AJAX request) は、ほとんどの Web 開発者が遭遇する可能性のある問題です。Same-Origin-Policy によると、ブラウザはセキュリティ サンドボックスでクライアント JavaScript を制限します。通常、JS はリモート サーバーと直接通信できません。別のドメインから。これまで開発者は、クロスドメイン リソース リクエストを実現するための多くのトリッキーな方法を作成してきましたが、最も一般的に使用される方法は次のとおりです。
- Flash/Silverlight またはサーバー側を「プロキシ」として使用して、リモートと通信します。
- パディング付き JSON ( JSONP )。
- リモート サーバーを iframe に埋め込み、fragment または window.name を介して通信します。こちらを参照してください。
これらのトリッキーな方法には多かれ少なかれいくつかの問題があります。たとえば、JSONP は開発者が単純に「評価」するとセキュリティ ホールが発生する可能性があり、上記の #3 は機能しますが、両方のドメインが相互に厳密な契約を構築する必要があり、柔軟性もエレガントさもありません。私見では:)
W3C は、この問題を解決するための安全で柔軟な、推奨される標準的な方法を提供する標準ソリューションとして、クロスオリジン リソース共有 (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
上でマークした青い部分はカーネルの事実であり、「オリジン」リクエストヘッダーは「クロスオリジンリクエストまたはプリフライトリクエストの発信元を示します」、「アクセス制御-許可-オリジン」レスポンスヘッダーは、このページがリモートリクエストを許可していることを示していますDomainA (値が * の場合は、任意のドメインからのリモート要求を許可することを示します)。
上で述べたように、W3 は、実際に Cross-Origin HTTP リクエストを送信する前に「プリフライト リクエストOPTIONS
」を実装するブラウザを推奨しました。一言で言えば、これは HTTPリクエストです。
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 要求を送信したドメインが含まれている場合にのみ、この必須条件を満たすことで、ブラウザは実際のクロスドメイン要求を送信し、結果をキャッシュします「Preflight-Result-Cache」内。
私は 3 年前に CORS についてブログを書きました: AJAX Cross-Origin HTTP request