クロスオリジン リソース共有( CORS ) は、同一オリジン ポリシーを安全にバイパスするメカニズムです。つまり、Web ページが、その Web ページを提供しているドメインとは異なるドメインのサーバーから制限されたリソースにアクセスできるようにします。
ウェブページには、クロスオリジンの画像、スタイルシート、スクリプト、iframe、ビデオを自由に埋め込むことができます。特定の「クロスドメイン」リクエスト、特にAjaxリクエストは、同一オリジン セキュリティ ポリシーによってデフォルトで禁止されています。CORS は、ブラウザとサーバーが対話して、クロスオリジン リクエストを許可しても安全かどうかを判断する方法を定義します。[1]これにより、純粋に同一オリジン リクエストよりも自由度と機能性が向上しますが、すべてのクロスオリジン リクエストを単に許可するよりも安全です。
CORSの仕様は、WHATWGのFetch Living Standardの一部として含まれています。[2]この仕様では、CORSが現在ブラウザでどのように実装されているかを説明しています。 [3]以前の仕様はW3C勧告として公開されました。[4]
技術概要

JavaScript から作成された HTTP リクエストのうち、別のドメインを指す <form> タグやセーフリストに含まれていないヘッダーを使用して作成できないものについては、仕様では、ブラウザがリクエストを「プリフライト」し、HTTP OPTIONS リクエスト メソッドを使用してサーバーからサポートされているメソッドを要求し、サーバーから「承認」されたら、実際の HTTP リクエスト メソッドを使用して実際のリクエストを送信することが義務付けられています。サーバーは、リクエストとともに「資格情報」 (Cookie や HTTP 認証データを含む) を送信するかどうかをクライアントに通知することもできます。[5]
簡単なリクエストの例
ユーザーが http://www.example.com にアクセスし、ページが http://service.example.com からデータを取得するためにクロスオリジン リクエストを試行するとします。CORS 対応ブラウザは、次のように service.example.com へのクロスオリジン リクエストを試行します。
- ブラウザは、親ページを提供したドメインを含む service.example.com に、追加の
OriginHTTP ヘッダーを含む GET リクエストを送信します。出典: http://www.example.com
- service.example.com のサーバーは、次の 3 つの応答のいずれかを送信します。
- 要求されたデータと、
Access-Control-Allow-Originその応答内の (ACAO) ヘッダーは、オリジンからの要求が許可されていることを示します。たとえば、この場合は次のようになります。アクセス制御許可元: http://www.example.com
- 要求されたデータと、
Access-Control-Allow-Originすべてのドメインからの要求が許可されていることを示すワイルドカードを含む (ACAO) ヘッダー:アクセス制御許可元: *
- サーバーがクロスオリジンリクエストを許可していない場合のエラーページ[6]
- 要求されたデータと、
ワイルドカードの同一オリジン ポリシーは、ページまたは API 応答が任意のサイトの任意のコードからアクセスできるようにする場合に適しています。Google Fontsなどのパブリック ホスティング サービスで無料で利用できるWeb フォントがその一例です。
「*」の値は、資格情報を提供する要求を許可しないという点で特別です。つまり、クロスドメイン要求でHTTP認証、クライアント側SSL証明書、またはCookieを送信することを許可しません。[7]
CORS アーキテクチャでは、 Access-Control-Allow-Origin ヘッダーは、元の Web アプリケーション サーバー ( www.example.com ) ではなく、外部 Web サービス ( service.example.com ) によって設定されていることに注意してください。ここで、service.example.com はCORS を使用して、ブラウザーがwww.example.comを承認し、 service.example.comにリクエストを送信できるようにします。
サイトがヘッダー「Access-Control-Allow-Credentials:true」を指定している場合、サードパーティのサイトが特権アクションを実行し、機密情報を取得できる可能性があります。
プリフライトの例
特定の種類のクロスドメイン Ajax リクエストを実行する場合、CORS をサポートする最新のブラウザは、アクションを実行する権限があるかどうかを判断するために追加の「プリフライト」リクエストを開始します。クロスオリジン リクエストは、ユーザー データに影響を与える可能性があるため、このようにプリフライトされます。
オプション / ホスト: service.example.com 出典: http://www.example.com アクセス制御要求メソッド: PUT
service.example.com がアクションを受け入れる場合、次のヘッダーで応答する可能性があります。
アクセス制御許可元: http://www.example.com アクセス制御許可メソッド: PUT
その後、ブラウザは実際のリクエストを行います。service.example.com がこのオリジンからのクロスサイト リクエストを受け入れない場合、OPTIONS リクエストに対してエラーが応答され、ブラウザは実際のリクエストを行いません。
ヘッダー
CORS に関連する HTTP ヘッダーは次のとおりです。
リクエストヘッダー
OriginAccess-Control-Request-MethodAccess-Control-Request-Headers
レスポンスヘッダー
Access-Control-Allow-OriginAccess-Control-Allow-CredentialsAccess-Control-Expose-HeadersAccess-Control-Max-AgeAccess-Control-Allow-MethodsAccess-Control-Allow-Headers
ブラウザのサポート
CORS は、次のレイアウト エンジンに基づくすべてのブラウザーでサポートされています。
- BlinkおよびChromiumベースのブラウザ(Chrome 28+、[8] [9] Opera 15+、[8] Amazon Silk、Android 4.4+ WebView、QtのWebEngine)
- Gecko 1.9.1(Firefox 3.5、[10] SeaMonkey 2.0 [11])以上。
- MSHTML/Trident 6.0 (Internet Explorer 10) はネイティブサポートされています。[12] MSHTML/Trident 4.0 & 5.0 (Internet Explorer 8 & 9) はXDomainRequest オブジェクトを介して部分的なサポートを提供します。[13]
- Prestoベースのブラウザ(Opera)は、 Opera 12.00 [14]およびOpera Mobile 12以降でCORSを実装していますが、Opera Miniでは実装されていません。[15]
- WebKit(最初のリビジョンは不明、Safari 4以上、[16] Google Chrome 3以上、おそらくそれ以前)。[17]
- Microsoft Edgeの全バージョン。[18]
歴史
クロスオリジンサポートは、もともと2004年3月にTellme NetworksのMatt Oshry、Brad Porter、Michael BodellによってVoiceXML 2.1 [19]に組み込むことが提案され、VoiceXMLブラウザによる安全なクロスオリジンデータリクエストを可能にしました。このメカニズムは本質的に一般的なものであり、VoiceXMLに固有のものではないと判断され、その後実装NOTEに分離されました。[20] W3CのWebAppsワーキンググループは、主要なブラウザベンダーの参加を得て、NOTEをW3Cワーキングドラフトとして公式化し、正式なW3C勧告のステータスに向けて軌道に乗り始めました。
2006年5月に最初のW3Cワーキングドラフトが提出されました。[21] 2009年3月にドラフトは「Cross-Origin Resource Sharing」に改名され、 [22] 2014年1月にW3C勧告として承認されました。[23]
CORS と JSONP
CORS は、 JSONPパターンの現代的な代替手段として使用できます。CORS の利点は次のとおりです。
- JSONP はリクエスト メソッドのみをサポートしますが
GET、CORS は他の種類の HTTP リクエストもサポートします。 - CORS を使用すると、Web プログラマーは JSONP よりも優れたエラー処理をサポートする通常のXMLHttpRequestを使用できます。
- JSONPは外部サイトが侵害された場合にクロスサイトスクリプティング(XSS)の問題を引き起こす可能性がありますが、CORSを使用すると、Webサイトが応答を手動で解析してセキュリティを強化できます。 [1]
JSONPの主な利点は、CORSサポート以前のレガシーブラウザ( Opera MiniおよびInternet Explorer 9以前)でも動作できることです。CORSは現在、ほとんどの最新のWebブラウザでサポートされています。 [24]
参照
参考文献
- ^ ab 「クロスドメイン Ajax とクロスオリジン リソース共有」。NCZOnline。2010 年 5 月 25 日。2012年 7 月 5 日閲覧。
- ^ 「Fetch Living Standard」。
- ^ 「WebAppSec ワーキング グループ議事録」。
- ^ 「クロスオリジンリソース共有」。
- ^ 「Cross-Origin Resource Sharing (CORS) - HTTP | MDN」。developer.mozilla.org 2023年5月10日。 2023年6月7日閲覧。
- ^ 「CORS エラー - HTTP | MDN」。developer.mozilla.org 2023-05-10 . 2023-07-04閲覧。
- ^ [1]. W3.org. 2021年31月7日閲覧。
- ^ ab "Blink". QuirksBlog. 2013年4月. 2013年4月4日閲覧。
- ^ 「Google が独自の道を進み、WebKit レンダリング エンジンをフォーク」 Ars Technica 2013 年 4 月2013 年4 月 4 日閲覧。
- ^ 「HTTP アクセス制御 (CORS) - MDN」。Developer.mozilla.org。2010 年 5 月 27 日時点のオリジナルよりアーカイブ。2012年 7 月 5 日閲覧。
- ^ 「Gecko - MDN」。Developer.mozilla.org。2012-06-08。2012-08-03 にオリジナルからアーカイブ。2012-07-05に取得。
- ^ Tony Ross、プログラム マネージャー、Internet Explorer (2012-02-09)。「IE10 の XHR 用 CORS」。MSDN。2012年 12 月 14 日閲覧。
- ^ 「CORS を使用したクロスサイト XMLhttp リクエスト」。MOZILLA。2012年 9 月 5 日閲覧。
- ^ David Honneffer、ドキュメンテーションスペシャリスト (2012-06-14)。「12.00 for UNIX Changelog」。Opera。2012-06-18 にオリジナルからアーカイブ。2012-07-05に取得。
- ^ David Honneffer、ドキュメンテーションスペシャリスト ( 2012-04-23 )。「Opera Software: Opera Presto 2.10 での Web 仕様のサポート」。Opera.com。2012-07-05に閲覧。
- ^ 2009 年 7 月 6 日、Arun Ranganathan (2009-07-06) による投稿。「cross-site xmlhttprequest with CORS ✩ Mozilla Hacks – the Web developer blog」。Hacks.mozilla.org。2012年 7 月 5 日閲覧。
{{cite web}}: CS1 maint: 数値名: 著者リスト (リンク) - ^ 「59940: Apple Safari WebKit クロスオリジン リソース共有バイパス」。Osvdb.org。2012 年 7 月 19 日時点のオリジナルよりアーカイブ。2012 年 7 月 5 日閲覧。
- ^ 「Microsoft Edge 開発者ガイド」。2023 年 12 月 21 日。
- ^ 「Voice Extensible Markup Language (VoiceXML) 2.1」。W3.org。2004年3月23日。 2012年7月5日閲覧。
- ^ 「<?access-control?> 処理命令 1.0 を使用した XML コンテンツへの読み取りアクセスの承認」 W3.org 。 2012 年 7 月 5 日閲覧。
- ^ 「<?access-control?> 処理命令を使用した XML コンテンツへの読み取りアクセスの承認 1.0 W3C - ワーキング ドラフト 2006 年 5 月 17 日」。W3.org。2015年8 月 17 日閲覧。
- ^ 「Cross-Origin Resource Sharing - W3C Working Draft 2009年3月17日」。W3.org 。 2015年8月17日閲覧。
- ^ 「Cross-Origin Resource Sharing - W3C Recommendation 2014年1月16日」 W3.org 。 2015年8月17日閲覧。
- ^ 「いつクロスオリジンリソース共有を使用できますか?」caniuse.com 。 2012年7月12日閲覧。
外部リンク
- Fetch Living Standard(CORS の現在の仕様)
- 正しいレスポンス ヘッダーを使用して Apache に CORS を設定し、すべてを通過させる[ permanent dead link ]
- さまざまな(Web)サーバーで CORS サポートを有効にするための詳細な方法情報
- HTML5 Rocks が CORS の仕組みを詳しく説明します
- オンライン CORS 誤設定スキャナ 2020-08-10 にWayback Machineでアーカイブ
