From e5bdc30d0d12febf0708df40c25a8cd882957120 Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Mon, 14 Oct 2024 13:28:52 +0900 Subject: [PATCH] =?UTF-8?q?2024/10/02=20=E6=99=82=E7=82=B9=E3=81=AE?= =?UTF-8?q?=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5=E3=81=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/ja/web/http/cors/cors_principle.png | Bin 20192 -> 0 bytes files/ja/web/http/cors/cred-req-updated.png | Bin 8649 -> 0 bytes files/ja/web/http/cors/fetching-page-cors.svg | 308 ++++++++++++++++++ .../ja/web/http/cors/include-credentials.svg | 65 ++++ files/ja/web/http/cors/index.md | 153 ++++----- files/ja/web/http/cors/preflight-correct.svg | 1 + files/ja/web/http/cors/preflight_correct.png | Bin 24349 -> 0 bytes files/ja/web/http/cors/simple-req.png | Bin 5933 -> 0 bytes files/ja/web/http/cors/simple-request.svg | 63 ++++ 9 files changed, 515 insertions(+), 75 deletions(-) delete mode 100644 files/ja/web/http/cors/cors_principle.png delete mode 100644 files/ja/web/http/cors/cred-req-updated.png create mode 100644 files/ja/web/http/cors/fetching-page-cors.svg create mode 100644 files/ja/web/http/cors/include-credentials.svg create mode 100644 files/ja/web/http/cors/preflight-correct.svg delete mode 100644 files/ja/web/http/cors/preflight_correct.png delete mode 100644 files/ja/web/http/cors/simple-req.png create mode 100644 files/ja/web/http/cors/simple-request.svg diff --git a/files/ja/web/http/cors/cors_principle.png b/files/ja/web/http/cors/cors_principle.png deleted file mode 100644 index 31e6382e116e7d01cb45530a98c73c8bcc40c505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20192 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 c04$yV4^vJ>FZ|vJ8vpgdmEBwl3 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 + + + + + + + + + +
+
+
+ 画像 +
+
+
+
+ 画像 +
+
+ + + + +
+
+
+
+ フォントと domain-b.com からの +
+
+ 画像のあるキャンバス +
+
+
+
+
+ フォントと domain-b.com からの画像のあるキャンバス +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ ウェブ文書 +
+
+
+
+ ウェブ文書 +
+
+ + + + + + + + + + + + + + + + + + + + +
+
+
+ + GET /index.html + +
+
+
+
+ GET /index.html +
+
+ + + + +
+
+
+
+ + GET styles.css + +
+
+
+
+
+ GET styles.css +
+
+ + + + +
+
+
+ + GET header.png + +
+
+
+
+ GET header.png +
+
+ + + + +
+
+
+ + GET image.png + +
+
+
+
+ GET image.png +
+
+ + + + +
+
+
+ + GET font.woff + +
+
+
+
+ GET font.woff +
+
+ + + + +
+
+
+ ウェブサーバー +
+ + domain-a.com + +
+
+
+
+ ウェブサーバー +
+
+ + + + + + + + +
+
+
+ ウェブサーバー +
+ + domain-b.com + +
+
+
+
+ ウェブサーバー +
+
+ + + + + +
+
+
+ + メインリクエスト: オリジンを定義 + +
+
+
+
+ メインリクエスト: オリジンを定義 +
+
+ + + + +
+
+
+ + domain-a.com + +
+
+
+
+ domain-a.com +
+
+ + + + + + +
+
+
+ + 同一オリジンリクエストは常に許可される +
+
+
+
+
+
+ 同一オリジンリクエストは常に許可される +
+
+ + + + +
+
+
+ + CORS によって制御されたオリジン間リクエスト +
+
+
+
+
+
+ CORS によって制御されたオリジン間リクエスト + +
+
+ + +
+
+ diff --git a/files/ja/web/http/cors/include-credentials.svg b/files/ja/web/http/cors/include-credentials.svg new file mode 100644 index 00000000000000..6ea49a16226e53 --- /dev/null +++ b/files/ja/web/http/cors/include-credentials.svg @@ -0,0 +1,65 @@ + + + + サーバー + + + + クライアント + + + + + + サーバー + + + + + + + クライアント + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GET /resources/credentialed-content/ HTTP/1.1 + Origin: https://foo.example + Cookie: pageAccess=2 + + HTTP/1.1 200 OK + Access-Control-Allow-Origin: https://foo.example + Access-Control-Allow-Credentials: true + + diff --git a/files/ja/web/http/cors/index.md b/files/ja/web/http/cors/index.md index be2aaeca014acc..a3f85a2856f0f7 100644 --- a/files/ja/web/http/cors/index.md +++ b/files/ja/web/http/cors/index.md @@ -2,36 +2,36 @@ title: オリジン間リソース共有 (CORS) slug: Web/HTTP/CORS l10n: - sourceCommit: 185d871fd1c78b6c762d4a703b269dafb3167bbb + sourceCommit: f75b2c86ae4168e59416aed4c7121f222afc201d --- {{HTTPSidebar}} オリジン間リソース共有 (Cross-Origin Resource Sharing, {{Glossary("CORS")}}) は、追加の {{Glossary("HTTP")}} ヘッダーを使用して、ある{{glossary("origin", "オリジン")}}で動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組みです。ウェブアプリケーションは、自分とは異なるオリジン (ドメイン、プロトコル、ポート番号) にあるリソースをリクエストするとき、オリジン間 HTTP リクエストを実行します。 -オリジン間リクエストとは、例えば `https://domain-a.com` で提供されているウェブアプリケーションのフロントエンド JavaScript コードが {{domxref("XMLHttpRequest")}} を使用して `https://domain-b.com/data.json` へリクエストを行うような場合です。 +オリジン間リクエストとは、例えば `https://domain-a.com` で提供されているウェブアプリケーションのフロントエンド JavaScript コードが {{domxref("Window/fetch", "fetch()")}} を使用して `https://domain-b.com/data.json` へリクエストを行うような場合です。 -セキュリティ上の理由から、ブラウザーは、スクリプトによって開始されるオリジン間 HTTP リクエストを制限しています。例えば、 `XMLHttpRequest`や [Fetch API](/ja/docs/Web/API/Fetch_API) は[同一オリジンポリシー](/ja/docs/Web/Security/Same-origin_policy) (same-origin policy) に従います。つまり、これらの API を使用するウェブアプリケーションは、そのアプリケーションが読み込まれたのと同じオリジンに対してのみリソースのリクエストを行うことができ、それ以外のオリジンからの場合は正しい CORS ヘッダーを含んでいることが必要です。 +セキュリティ上の理由から、ブラウザーは、スクリプトによって開始されるオリジン間 HTTP リクエストを制限しています。例えば、`fetch()` や {{domxref("XMLHttpRequest")}} は[同一オリジンポリシー](/ja/docs/Web/Security/Same-origin_policy) (same-origin policy) に従います。つまり、これらの API を使用するウェブアプリケーションは、そのアプリケーションが読み込まれたのと同じオリジンに対してのみリソースのリクエストを行うことができ、それ以外のオリジンからの場合は正しい CORS ヘッダーを含んでいることが必要です。 -![CORS の仕組みの図式化](cors_principle.png) +![CORS の仕組みの図式化](fetching-page-cors.svg) -CORS の仕組みは、安全なオリジン間のリクエストとブラウザー・サーバー間のデータ転送を支援します。最近のブラウザーは CORS を `XMLHttpRequest` や [Fetch](/ja/docs/Web/API/Fetch_API) などの API で使用して、オリジン間 HTTP リクエストのリスクの緩和に役立てています。 +CORS の仕組みは、安全なオリジン間のリクエストとブラウザー・サーバー間のデータ転送を支援します。最近のブラウザーは CORS を `fetch()` や `XMLHttpRequest` などの API で使用して、オリジン間 HTTP リクエストのリスクの緩和に役立てています。 ## CORS を使用したリクエストとは この [cross-origin sharing standard](https://fetch.spec.whatwg.org/#http-cors-protocol) では、以下についてオリジン間の HTTP リクエストができるようにしています。 -- 前述のような {{domxref("XMLHttpRequest")}} または [Fetch API](/ja/docs/Web/API/Fetch_API) の呼び出し。 -- ウェブフォント (CSS の `@font-face` で別ドメインのフォントを利用するため)。[これによりサーバーは、許可したウェブサイトのみからオリジンをまたがって読み込んで利用できる TrueType フォントを提供することができます。](https://www.w3.org/TR/css-fonts-3/#font-fetching-requirements) +- 前述のような `fetch()` や `XMLHttpRequest` の呼び出し。 +- ウェブフォント(CSS の `@font-face` で別ドメインのフォントを利用するため)。[これによりサーバーは、許可したウェブサイトのみからオリジンをまたがって読み込んで利用できる TrueType フォントを提供することができます。](https://www.w3.org/TR/css-fonts-3/#font-fetching-requirements) - [WebGL テクスチャ](/ja/docs/Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL)。 - {{domxref("CanvasRenderingContext2D.drawImage()", "drawImage()")}} を使用してキャンバスへ描かれた画像や映像のフレーム -- [画像から生成した CSS シェイプ](/ja/docs/Web/CSS/CSS_Shapes/Shapes_From_Images)。 +- [画像から生成した CSS シェイプ](/ja/docs/Web/CSS/CSS_shapes/Shapes_from_images)。 この記事では、 HTTP ヘッダーの要件を含むオリジン間リソース共有の全般的な説明を行います。 ## 機能概要 -オリジン間リソース共有の仕様は、ウェブブラウザーから情報を読み取ることを許可されているオリジンをサーバーが記述することができる、新たな [HTTP ヘッダー](/ja/docs/Web/HTTP/Headers)を追加することで作用します。加えて仕様書では、サーバーの情報に副作用を引き起こすことがある HTTP のリクエストメソッド (特に {{HTTPMethod("GET")}} 以外の HTTP メソッドや、特定の [MIME タイプ](/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types)を伴う {{HTTPMethod("POST")}}) のために、ブラウザーが HTTP の {{HTTPMethod("OPTIONS")}} リクエストメソッドを用いて、あらかじめリクエストの「プリフライト」 (サーバーから対応するメソッドの一覧を収集すること) を行い、サーバーの「認可」のもとに実際のリクエストを送信することを指示しています。サーバーはリクエスト時に「資格情報」 ([Cookie](/ja/docs/Web/HTTP/Cookies) や [HTTP 認証](/ja/docs/Web/HTTP/Authentication)など) を送信するべきかをクライアントに伝えることもできます。 +オリジン間リソース共有の仕様は、ウェブブラウザーから情報を読み取ることを許可されているオリジンをサーバーが記述することができる、新たな [HTTP ヘッダー](/ja/docs/Web/HTTP/Headers)を追加することで作用します。加えて仕様書では、サーバーの情報に副作用を引き起こすことがある HTTP のリクエストメソッド (特に {{HTTPMethod("GET")}} 以外の HTTP メソッドや、特定の [MIME タイプ](/ja/docs/Web/HTTP/MIME_types)を伴う {{HTTPMethod("POST")}}) のために、ブラウザーが HTTP の {{HTTPMethod("OPTIONS")}} リクエストメソッドを用いて、あらかじめリクエストの「プリフライト」 (サーバーから対応するメソッドの一覧を収集すること) を行い、サーバーの「認可」のもとに実際のリクエストを送信することを指示しています。サーバーはリクエスト時に「資格情報」 ([Cookie](/ja/docs/Web/HTTP/Cookies) や [HTTP 認証](/ja/docs/Web/HTTP/Authentication)など) を送信するべきかをクライアントに伝えることもできます。 CORS は様々なエラーで失敗することがありますが、セキュリティ上の理由から、エラーについて *JavaScript から知ることができない*よう定められています。コードからはエラーが発生したということしか分かりません。何が悪かったのかを具体的に知ることができる唯一の方法は、ブラウザーのコンソールで詳細を見ることです。 @@ -39,13 +39,13 @@ CORS は様々なエラーで失敗することがありますが、セキュリ ## アクセス制御シナリオの例 -オリジン間リソース共有の動作の仕組みを説明する 3 つのシナリオを示します。これらの例はすべて {{domxref("XMLHttpRequest")}} を用いており、対応しているブラウザーにおいて、オリジンをまたいでアクセスすることができます。 +オリジン間リソース共有の動作の仕組みを説明する 3 つのシナリオを示します。これらの例はすべて {{domxref("Window/fetch", "fetch()")}} を用いており、対応しているブラウザーにおいて、オリジンをまたいでアクセスすることができます。 ### 単純リクエスト リクエストによっては {{Glossary("Preflight_request","CORS プリフライト")}}を発生させません。これをこの記事では古い [CORS 仕様書](https://www.w3.org/TR/2014/REC-cors-20140116/#terminology)に倣って*単純リクエスト*と呼んでいますが、 (現在 CORS を定義している) [Fetch 仕様書](https://fetch.spec.whatwg.org/) ではこの用語を使用していません。 -その動機は、HTML 4.0 からの {{HTMLElement("form")}} 要素(クロスサイト {{domxref("XMLHttpRequest")}} と {{domxref("fetch")}} に先行する)は、どのオリジンにでも単純なリクエストを送信できるので、サーバーを書く人はすでに {{Glossary("CSRF", "cross-site request forgery")}} (CSRF) から保護していなければならないからです。この仮定の下では、 CSRF の脅威はフォーム送信の脅威よりも悪くないので、サーバーはフォーム送信のように見えるすべてのリクエストを受け取ることを(プリフライトリクエストに応答することによって)オプトインする必要はないのです。しかし、サーバーは {{HTTPHeader("Access-Control-Allow-Origin")}} を使用して、レスポンスをスクリプトと共有することを選択する必要があります。 +その動機は、HTML 4.0 からの {{HTMLElement("form")}} 要素(サイト間 {{domxref("Window/fetch", "fetch()")}} と {{domxref("XMLHttpRequest")}} に先行する)は、どのオリジンにでも単純なリクエストを送信できるので、サーバーを書く人はすでに {{Glossary("CSRF", "cross-site request forgery")}} (CSRF) から保護していなければならないからです。この仮定の下では、 CSRF の脅威はフォーム送信の脅威よりも悪くないので、サーバーはフォーム送信のように見えるすべてのリクエストを受け取ることを(プリフライトリクエストに応答することによって)オプトインする必要はないのです。しかし、サーバーは {{HTTPHeader("Access-Control-Allow-Origin")}} を使用して、レスポンスをスクリプトと共有することを選択する必要があります。 *単純リクエスト*は、**以下のすべての条件を満たす**ものです。 @@ -63,9 +63,6 @@ CORS は様々なエラーで失敗することがありますが、セキュリ - {{HTTPHeader("Content-Type")}} (但し、下記の追加の要件に注意してください) - {{HTTPHeader("Range")}} ([単純範囲ヘッダー値](https://fetch.spec.whatwg.org/#simple-range-header-value)、例えば `bytes=256-` や `bytes=127-255` の場合) -> [!NOTE] -> Firefox は、まだ `Range` をセーフリストリクエストヘッダーとして実装していません。[バグ 1733981](https://bugzilla.mozilla.org/show_bug.cgi?id=1733981)を参照してください。 - - {{HTTPHeader("Content-Type")}} ヘッダーで指定できる{{Glossary("MIME type", "メディア種別")}}に許されるタイプ/サブタイプの組み合わせは、以下のもののみです。 - `application/x-www-form-urlencoded` @@ -78,26 +75,27 @@ CORS は様々なエラーで失敗することがありますが、セキュリ > [!NOTE] > WebKit Nightly および Safari Technology Preview は、 {{HTTPHeader("Accept")}}、{{HTTPHeader("Accept-Language")}}、{{HTTPHeader("Content-Language")}} ヘッダーの値に追加の制限を掛けています。これらのヘッダーが「標準外」の値の場合、 WebKit/Safari はそのリクエストが「単純リクエスト」の条件に合うとは判断しません。 WebKit/Safari がこれらのヘッダーのどの値を「標準外」と判断するかについては、以下の WebKit のバグを除いて文書化されていません。 > -> - [Require preflight for non-standard CORS-safelisted request headers Accept, Accept-Language, and Content-Language](https://bugs.webkit.org/show_bug.cgi?id=165178) -> - [Allow commas in Accept, Accept-Language, and Content-Language request headers for simple CORS](https://bugs.webkit.org/show_bug.cgi?id=165566) -> - [Switch to a blacklist model for restricted Accept headers in simple CORS requests](https://bugs.webkit.org/show_bug.cgi?id=166363) +> - [Require preflight for non-standard CORS-safelisted request headers Accept, Accept-Language, and Content-Language](https://webkit.org/b/165178) +> - [Allow commas in Accept, Accept-Language, and Content-Language request headers for simple CORS](https://webkit.org/b/165566) +> - [Switch to a blacklist model for restricted Accept headers in simple CORS requests](https://webkit.org/b/166363) > > これは仕様の一部ではないので、他のブラウザーはこの追加の制限を実装していません。 -例えば、ドメイン `https://foo.example` にあるウェブコンテンツがドメイン `https://bar.other` にあるコンテンツを呼び出したいとします。以下のようなコードが `foo.example` 内の JavaScript で使用されるかもしれません。 +例えば、`https://foo.example` のウェブコンテンツが JSON コンテンツをドメイン `https://bar.other` から取得したいとします。 この種のコードは、`foo.example` で展開された JavaScript で使用される可能性があります。 ```js -const xhr = new XMLHttpRequest(); -const url = "https://bar.other/resources/public-data/"; +const fetchPromise = fetch("https://bar.other"); -xhr.open("GET", url); -xhr.onreadystatechange = someHandler; -xhr.send(); +fetchPromise + .then((response) => response.json()) + .then((data) => { + console.log(data); + }); ``` この処理は、特権を扱うために CORS ヘッダーを使用して、クライアントとサーバーの間で簡単なデータ交換を行います。 -![Diagram of simple CORS GET request](simple-req.png) +![単純な CORS GET リクエストの図](simple-request.svg) この場合、ブラウザーがサーバーに何を送信し、サーバーが何を返すかを見てみましょう。 @@ -141,7 +139,7 @@ Access-Control-Allow-Origin: * Access-Control-Allow-Origin: https://foo.example ``` -> **メモ:** [資格情報を含むリクエスト](#資格情報を含むリクエスト)に応答する場合、サーバーは `Access-Control-Allow-Origin` ヘッダーにオリジンを値として指定する必要があり、"`*`" ワイルドカードを指定することはできません。 +> **メモ:** [資格情報を含むリクエスト](#資格情報を含むリクエスト)に応答する場合、サーバーは `Access-Control-Allow-Origin` ヘッダーにオリジンを値として指定する必要があり、`*` ワイルドカードを指定することはできません。 ### プリフライトリクエスト @@ -150,17 +148,24 @@ Access-Control-Allow-Origin: https://foo.example プリフライトが行われるリクエストの例です。 ```js -const xhr = new XMLHttpRequest(); -xhr.open("POST", "https://bar.other/doc"); -xhr.setRequestHeader("X-PINGOTHER", "pingpong"); -xhr.setRequestHeader("Content-Type", "text/xml"); -xhr.onreadystatechange = handler; -xhr.send("Arun"); +const fetchPromise = fetch("https://bar.other/doc", { + method: "POST", + mode: "cors", + headers: { + "Content-Type": "text/xml", + "X-PINGOTHER": "pingpong", + }, + body: "Arun", +}); + +fetchPromise.then((response) => { + console.log(response.status); +}); ``` 上記の例では、 `POST` で送信する XML の本体を作成しています。また、標準外の `X-PINGOTHER` HTTP リクエストヘッダーを設定しています。このようなヘッダーは HTTP/1.1 プロトコルに含まれていませんが、ウェブアプリケーションでは一般的に便利なものです。リクエストで `Content-Type` に `text/xml` を使用しており、かつ独自のヘッダーを設定しているため、このリクエストではプリフライトを行います。 -![プリフライトされたリクエストのイメージ図](preflight_correct.png) +![プリフライトされたリクエストのイメージ図](preflight-correct.svg) > [!NOTE] > 後述するように、実際の `POST` リクエストでは `Access-Control-Request-*` ヘッダーを含みません。`OPTIONS` リクエストのみで必要になります。 @@ -177,7 +182,7 @@ Accept-Encoding: gzip,deflate Connection: keep-alive Origin: https://foo.example Access-Control-Request-Method: POST -Access-Control-Request-Headers: X-PINGOTHER, Content-Type +Access-Control-Request-Headers: content-type,x-pingother HTTP/1.1 204 No Content Date: Mon, 01 Dec 2008 01:15:39 GMT @@ -191,16 +196,16 @@ Keep-Alive: timeout=2, max=100 Connection: Keep-Alive ``` -上記の 1 - 10 行目は {{HTTPMethod("OPTIONS")}} メソッドによるプリフライトリクエストを表します。ブラウザーは上記の JavaScript コードで使用していていたリクエストの引数に基づいて、プリフライトの送信が必要であることを判断します。これによりサーバーは実際のリクエストの引数によって送られるリクエストを受け入れ可能かを応答することができます。 OPTIONS は HTTP/1.1 のメソッドであり、サーバーから付加的な情報を得るために用いるもので、また{{Glossary("Safe/HTTP","安全")}}なメソッド、つまりリソースを変更するためには使用できないメソッドです。 OPTIONS リクエストと合わせて、他にリクエストヘッダーを 2 つ送信していることに注意してください (それぞれ 9 行目と 10 行目です)。 +最初のブロックは、{{HTTPMethod("OPTIONS")}} メソッドによるプリフライトリクエストを表します。ブラウザーは上記の JavaScript コードで使用していていたリクエストの引数に基づいて、プリフライトの送信が必要であることを判断します。これによりサーバーは実際のリクエストの引数によって送られるリクエストを受け入れ可能かを応答することができます。 OPTIONS は HTTP/1.1 のメソッドであり、サーバーから付加的な情報を得るために用いるもので、また{{Glossary("Safe/HTTP","安全")}}なメソッド、つまりリソースを変更するためには使用できないメソッドです。 OPTIONS リクエストと合わせて、他にリクエストヘッダーを 2 つ送信していることに注意してください。 ```http Access-Control-Request-Method: POST -Access-Control-Request-Headers: X-PINGOTHER, Content-Type +Access-Control-Request-Headers: content-type,x-pingother ``` {{HTTPHeader("Access-Control-Request-Method")}} ヘッダーは、プリフライトリクエストの一部として、実際のリクエストが `POST` リクエストメソッドで行われることをサーバーに通知します。 {{HTTPHeader("Access-Control-Request-Headers")}} ヘッダーは、実際のリクエストにカスタムヘッダーである `X-PINGOTHER` および Content-Type が含まれることをサーバーに通知します。ここでサーバーは、この状況下でリクエストの受け入れを望むかを判断する機会が与えられます。 -上記の 12 - 21 行目はサーバーが返すレスポンスであり、リクエストメソッド (`POST`) とリクエストヘッダー (`X-PINGOTHER`) が受け入れられることを示しています。特に、 15 - 18 行目を見てみましょう。 +上記の 2 番目のブロックはサーバーが返すレスポンスであり、リクエストメソッド (`POST`) とリクエストヘッダー (`X-PINGOTHER`) が受け入れられることを示しています。特に、次の行を見てみましょう。 ```http Access-Control-Allow-Origin: https://foo.example @@ -211,7 +216,7 @@ Access-Control-Max-Age: 86400 サーバーは `Access-Control-Allow-Origin: https://foo.example` により、アクセスをリクエストしているオリジンのドメインだけに限定することを返答しています。また、 `Access-Control-Allow-Methods` を返しており、これは当該リソースへの問い合わせで `POST` および `GET` が有効なメソッドであることを伝えます(なお、このヘッダーはレスポンスヘッダーの {{HTTPHeader("Allow")}} と似ていますが、アクセス制御でのみ使用されることに注意してください)。 -またサーバーは、 `Access-Control-Allow-Headers` を "`X-PINGOTHER, Content-Type`" の値で送信し、実際のリクエストで使用されるヘッダーを承認しています。 `Access-Control-Allow-Methods` と同様に、 `Access-Control-Allow-Headers` は受け入れ可能なヘッダーをカンマ区切りのリストで表します。 +またサーバーは、 `Access-Control-Allow-Headers` を `X-PINGOTHER, Content-Type` の値で送信し、実際のリクエストで使用されるヘッダーを承認しています。 `Access-Control-Allow-Methods` と同様に、 `Access-Control-Allow-Headers` は受け入れ可能なヘッダーをカンマ区切りのリストで表します。 最後に {{HTTPHeader("Access-Control-Max-Age")}} は、プリフライトリクエストを再び送らなくてもいいように、プリフライトのレスポンスをキャッシュしてよい時間を秒数で与えます。既定値は 5 秒です。この例では 86400 秒、つまり 24 時間です。なお、ブラウザーはそれぞれ[内部的な上限値](/ja/docs/Web/HTTP/Headers/Access-Control-Max-Age)を持っており、 `Access-Control-Max-Age` を超えた場合に制限を行います。 @@ -246,14 +251,14 @@ Keep-Alive: timeout=2, max=99 Connection: Keep-Alive Content-Type: text/plain -[Some XML payload] +[いくらかの XML コンテンツ] ``` #### プリフライトリクエストとリダイレクト 現在のところ、すべてのブラウザーが下記のようなプリフライトリクエストのリダイレクトに対応しているわけではありません。プリフライトリクエストにリダイレクトが発生すると、ブラウザーによっては以下のようなエラーメッセージを報告します。 -> The request was redirected to 'https\://example.com/foo', which is disallowed for cross-origin requests that require preflight. +> The request was redirected to `https://example.com/foo`, which is disallowed for cross-origin requests that require preflight. > Request requires preflight, which is disallowed to follow cross-origin redirects. もともと CORS プロトコルはそのような動作を要求していましたが、[その後で必要がないと変更されました](https://github.com/whatwg/fetch/commit/0d9a4db8bc02251cc9e391543bb3c1322fb882f2)。しかし、多くのブラウザーはまだ変更を実装していないため、もともと要求されていた動作に従っています。 @@ -275,27 +280,26 @@ Content-Type: text/plain > [!NOTE] > 資格情報を含むリクエストを異なるドメインに行う場合、サードパーティクッキーポリシーも適用されます。このポリシーは、この章で説明しているように、サーバーやクライアントでの設定とは無関係に常に実施されます。 -{{domxref("XMLHttpRequest")}} や [Fetch](/ja/docs/Web/API/Fetch_API) と CORS の両方によって明らかになる最も興味深い機能は、[HTTP クッキー](/ja/docs/Web/HTTP/Cookies)と HTTP 資格情報によってわかる「資格情報を含む」リクエストを作成することができることです。既定では、オリジン間の `XMLHttpRequest` または [Fetch](/ja/docs/Web/API/Fetch_API) の呼び出しにおいて、ブラウザーは資格情報を送信**しません**。 `XMLHttpRequest` オブジェクトまたは {{domxref("Request")}} のコンストラクターの呼び出し時に、特定のフラグを設定する必要があります。 +{{domxref("Window/fetch", "fetch()")}} または {{domxref("XMLHttpRequest")}} と CORS の両方によって明らかになる最も興味深い機能は、[HTTP クッキー](/ja/docs/Web/HTTP/Cookies)と HTTP 資格情報によってわかる「資格情報を含む」リクエストを作成することができることです。既定では、オリジン間の `fetch()` または `XMLHttpRequest` の呼び出しにおいて、ブラウザーは資格情報を送信**しません**。 + +`fetch()` リクエストに資格情報を含めるようにするには、[`credentials`](/ja/docs/Web/API/RequestInit#credentials) オプションを `"include"` に設定してください。 + +`XMLHttpRequest` リクエストに資格情報を含めるようにするには、{{domxref("XMLHttpRequest.withCredentials")}} プロパティを `true` に設定してください。 以下の例では `https://foo.example` から読み込まれた元のコンテンツが、 `https://bar.other` にあるリソースに対してクッキーを設定したシンプルな GET リクエストを行います。 foo.example のコンテンツは以下のような JavaScript を含んでいるかもしれません。 ```js -const invocation = new XMLHttpRequest(); const url = "https://bar.other/resources/credentialed-content/"; -function callOtherDomain() { - if (invocation) { - invocation.open("GET", url, true); - invocation.withCredentials = true; - invocation.onreadystatechange = handler; - invocation.send(); - } -} +const request = new Request(url, { credentials: "include" }); + +const fetchPromise = fetch(request); +fetchPromise.then((response) => console.log(response)); ``` -7 行目で、クッキー付きで呼び出しを行うために {{domxref("XMLHttpRequest")}} に設定する必要があるフラグ、 `withCredentials` という論理型の値を示しています。既定では、クッキーなしで呼び出しが行われます。これは単純な `GET` リクエストなのでプリフライトは行いませんが、ブラウザーは {{HTTPHeader("Access-Control-Allow-Credentials")}}`: true` ヘッダーを持たないレスポンスを**拒否**し、ウェブコンテンツを呼び出すレスポンスを作成**しない**でしょう。 +このコードは、{{domxref("Request")}} オブジェクトを作成し、コンストラクターで `credentials` オプションを `"include"` に設定し、このリクエストを `fetch()` に渡します。これは単純な `GET` リクエストなのでプリフライトは行いませんが、ブラウザーは {{HTTPHeader("Access-Control-Allow-Credentials")}}`: true` ヘッダーを持たないレスポンスを**拒否**し、ウェブコンテンツを呼び出すレスポンスを作成**しない**でしょう。 -![Access-Control-Allow-Credentials を使用した単純な GET リクエストの図。](cred-req-updated.png) +![Access-Control-Allow-Credentials を使用した単純な GET リクエストの図。](include-credentials.svg) 以下はクライアントとサーバーとの間のやりとりの例です。 @@ -326,10 +330,10 @@ Keep-Alive: timeout=2, max=100 Connection: Keep-Alive Content-Type: text/plain -[text/plain payload] +[text/plain コンテンツ] ``` -10 行目に `https://bar.other` 向けのクッキーが含まれていますが、bar.other が {{HTTPHeader("Access-Control-Allow-Credentials")}}`: true` (16 行目) をレスポンスに含めなければ、レスポンスは無視されこのウェブコンテンツで使用できません。 +リクエストの `Cookie` ヘッダーには、`https://bar.other` のコンテンツを対象とした Cookie が含まれていますが、この例で示されているように、bar.other が {{HTTPHeader("Access-Control-Allow-Credentials")}}`: true` を返さなかった場合、レスポンスは無視され、ウェブコンテンツには利用できません。 #### プリフライトリクエストと資格情報 @@ -338,31 +342,30 @@ CORS のプリフライトリクエストに資格情報を含めてはいけま > [!NOTE] > エンタープライズ認証サービスの中には、 [Fetch](https://fetch.spec.whatwg.org/#cors-protocol-and-credentials) 仕様書に反して、プリフライトリクエストで TLS クライアント証明書を送信することを要求するものがあります。 > -> Firefox 87 では、`network.cors_preflight.allow_client_cert` を `true` に設定することで、この準拠していない動作を有効にすることができます。([Firefox バグ 1511151](https://bugzil.la/1511151)). Chromium ベースのブラウザーでは現在、CORS プリフライトリクエストで TLS クライアント証明書を常に送信します ([Chrome bug 775438](https://bugs.chromium.org/p/chromium/issues/detail?id=775438))。 +> Firefox 87 では、`network.cors_preflight.allow_client_cert` を `true` に設定することで、この準拠していない動作を有効にすることができます。([Firefox バグ 1511151](https://bugzil.la/1511151)). Chromium ベースのブラウザーでは現在、CORS プリフライトリクエストで TLS クライアント証明書を常に送信します ([Chrome バグ 775438](https://crbug.com/775438))。 #### 資格情報付きリクエストとワイルドカード 資格情報付きリクエストに返答する場合、 -- サーバーは `Access-Control-Allow-Origin` ヘッダーで "`*`" ワイルドカードを指定**してはならず**、 `Access-Control-Allow-Origin: https://example.com` のように、明示的にオリジンを指定しなければなりません。 - -- サーバーは `Access-Control-Allow-Headers` ヘッダーで "`*`" ワイルドカードを指定**してはならず**、 `Access-Control-Allow-Headers: X-PINGOTHER, Content-Type` のように、明示的にヘッダー名を指定しなければなりません。 - -- サーバーは `Access-Control-Allow-Methods` ヘッダーで "`*`" ワイルドカードを指定**してはならず**、 `Access-Control-Allow-Methods: POST, GET` のように、明示的にメソッド名を指定しなければなりません。 +- サーバーは `Access-Control-Allow-Origin` ヘッダーで `*` ワイルドカードを指定**してはならず**、 `Access-Control-Allow-Origin: https://example.com` のように、明示的にオリジンを指定しなければなりません。 +- サーバーは `Access-Control-Allow-Headers` ヘッダーで `*` ワイルドカードを指定**してはならず**、 `Access-Control-Allow-Headers: X-PINGOTHER, Content-Type` のように、明示的にヘッダー名を指定しなければなりません。 +- サーバーは `Access-Control-Allow-Methods` ヘッダーで `*` ワイルドカードを指定**してはならず**、 `Access-Control-Allow-Methods: POST, GET` のように、明示的にメソッド名を指定しなければなりません。 +- サーバーは `Access-Control-Expose-Headers` ヘッダーで `*` ワイルドカードを指定**してはならず**、 `Access-Control-Expose-Headers: Content-Encoding, Kuma-Revision` のように、明示的にメソッド名を指定しなければなりません。 リクエストが資格情報 (多くの場合は `Cookie` ヘッダー) を含んでおり、そのレスポンスが `Access-Control-Allow-Origin: *` ヘッダー (つまりワイルドカード) を含んでいる場合、ブラウザーはレスポンスへのアクセスをブロックし、開発ツールのコンソールに CORS エラーを報告します。 ただし、リクエストが (`Cookie` ヘッダーのような) 資格情報を含んで行われ、そのレスポンスがワイルドカードではない実際のオリジンを含んでいる場合 (例えば `Access-Control-Allow-Origin: https://example.com` など)、ブラウザーは指定されたオリジンからのレスポンスへのアクセスを許可します。 -また、レスポンス内の `Access-Control-Allow-Origin` レスポンスヘッダーの値が実際のオリジンではなく "`*`" ワイルドカードであった場合、クッキーは設定されません。 +また、レスポンス内の `Access-Control-Allow-Origin` レスポンスヘッダーの値が実際のオリジンではなく `*` ワイルドカードであった場合、クッキーは設定されません。 #### サードパーティークッキー -CORS のレスポンスに設定されたクッキーは、サードパーティークッキーに関する通常のポリシーに従うことに注意してください。上記の例では、ページは `foo.example` から読み込まれていますが、 19 行目のクッキーは `bar.other` から送られているので、ユーザーのブラウザーがサードパーティークッキーをすべて拒否するよう設定されていた場合は保存されません。 +CORS のレスポンスに設定されたクッキーは、サードパーティークッキーに関する通常のポリシーに従うことに注意してください。上記の例では、ページは `foo.example` から読み込まれていますが、レスポンスの `Cookie` ヘッダーは `bar.other` から送られているので、ユーザーのブラウザーがサードパーティークッキーをすべて拒否するよう設定されていた場合は保存されません。 リクエスト中のクッキー (10 行目) は、通常のサードパーティクッキーポリシーでも抑制されることがあります。したがって、クッキーポリシーが強制されていると、この章で説明されている機能が無効になり、事実上、認証されたリクエストを行うことができなくなるかもしれません。 -[SameSite](/ja/docs/Web/HTTP/Headers/Set-Cookie/SameSite) 属性に関するクッキーポリシーは適用されます。 +[SameSite](/ja/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value) 属性に関するクッキーポリシーは適用されます。 ## HTTP レスポンスヘッダー @@ -376,7 +379,7 @@ CORS のレスポンスに設定されたクッキーは、サードパーティ Access-Control-Allow-Origin: | * ``` -`Access-Control-Allow-Origin` は、リソースへのアクセスを許可するオリジンをブラウザーに伝えるための単一のオリジン、または — 資格情報を**含まない**リクエストにおいては — どのオリジンにもリソースへのアクセスを許可することをブラウザーに伝えるワイルドカード "`*`" のどちらかを指定することができます。 +`Access-Control-Allow-Origin` は、リソースへのアクセスを許可するオリジンをブラウザーに伝えるための単一のオリジン、または — 資格情報を**含まない**リクエストにおいては — どのオリジンにもリソースへのアクセスを許可することをブラウザーに伝えるワイルドカード `*` のどちらかを指定することができます。 例えば、 `https://mozilla.org` のオリジンからのコードにリソースへのアクセスを許可するには、次のように指定します。 @@ -385,11 +388,11 @@ Access-Control-Allow-Origin: https://mozilla.org Vary: Origin ``` -サーバーがワイルドカード "`*`" ではなく (ホワイトリストの一部としてリクエストするオリジンに基づいて動的に変更される可能性がある) 単一のオリジンを指定した場合は、サーバーは `Origin` を {{HTTPHeader("Vary")}} レスポンスヘッダーに含めて、サーバーのレスポンスが {{HTTPHeader("Origin")}} リクエストヘッダーの値によって変化することもクライアントに示してください。 +サーバーがワイルドカード `*` ではなく (ホワイトリストの一部としてリクエストするオリジンに基づいて動的に変更される可能性がある) 単一のオリジンを指定した場合は、サーバーは `Origin` を {{HTTPHeader("Vary")}} レスポンスヘッダーに含めて、サーバーのレスポンスが {{HTTPHeader("Origin")}} リクエストヘッダーの値によって変化することもクライアントに示してください。 ### Access-Control-Expose-Headers -{{HTTPHeader("Access-Control-Expose-Headers")}} ヘッダーは、指定されたヘッダーをブラウザー内の JavaScript ({{domxref("XMLHttpRequest.getResponseHeader()","getResponseHeader()")}} など) からアクセスできる許可リストに加えます。 +{{HTTPHeader("Access-Control-Expose-Headers")}} ヘッダーは、指定されたヘッダーをブラウザー内の JavaScript({{domxref("Response.headers")}} など)からアクセスできる許可リストに加えます。 ```http Access-Control-Expose-Headers: [, ]* @@ -443,7 +446,7 @@ Access-Control-Allow-Headers: [, ]* ## HTTP リクエストヘッダー -この節では、 HTTP リクエストを発行する際、オリジン間リソース共有機能を利用するためにクライアントが使用できるヘッダーの一覧を掲載します。なお、これらのヘッダーはサーバーの呼び出し時に設定されます。オリジン間 {{domxref("XMLHttpRequest")}} の機能を使用する開発者は、オリジン間リソース共有のリクエストヘッダーをプログラムで設定する必要はありません。 +この節では、 HTTP リクエストを発行する際、オリジン間リソース共有機能を利用するためにクライアントが使用できるヘッダーの一覧を掲載します。なお、これらのヘッダーはサーバーの呼び出し時に設定されます。オリジン間リクエストを作成する開発者は、オリジン間共有リクエストヘッダーをプログラムで設定する必要はありません。 ### Origin @@ -471,10 +474,10 @@ Access-Control-Request-Method: ### Access-Control-Request-Headers -{{HTTPHeader("Access-Control-Request-Headers")}} ヘッダーは、プリフライトリクエストを発行する際に、実際のリクエストを行う際に ({{domxref("XMLHttpRequest.setRequestHeader()","setRequestHeader()")}} などによって) 使用する HTTP ヘッダーをサーバーに知らせるために使用します。このブラウザー側のヘッダーは、サーバー側のヘッダー {{HTTPHeader("Access-Control-Allow-Headers")}} によって回答されます。 +{{HTTPHeader("Access-Control-Request-Headers")}} ヘッダーは、プリフライトリクエストを発行する際に、実際のリクエストを行う際に(例えば、[`headers`](/ja/docs/Web/API/RequestInit#headers) オプションとして渡すことで)使用する HTTP ヘッダーをサーバーに知らせるために使用します。このブラウザー側のヘッダーは、サーバー側のヘッダー {{HTTPHeader("Access-Control-Allow-Headers")}} によって回答されます。 -``` -Access-Control-Request-Headers: [, ]* +```http +Access-Control-Request-Headers: [,]* ``` 使用例は[前述のとおりです](#プリフライトリクエスト)。 @@ -490,13 +493,13 @@ Access-Control-Request-Headers: [, ]* ## 関連情報 - [CORS のエラー](/ja/docs/Web/HTTP/CORS/Errors) -- [Enable CORS: I want to add CORS support to my server](https://enable-cors.org/server.html) +- [CORS の有効化: CORS 対応をサーバーに追加したい](https://enable-cors.org/server.html)(英語) +- [フェッチ API](/ja/docs/Web/API/Fetch_API) - {{domxref("XMLHttpRequest")}} -- [Fetch API](/ja/docs/Web/API/Fetch_API) -- [Will it CORS?](https://httptoolkit.tech/will-it-cors) - 対話型の CORS の説明および生成 -- [How to run Chrome browser without CORS](https://alfilatov.com/posts/run-chrome-without-cors/) -- [Using CORS with All (Modern) Browsers](https://www.telerik.com/blogs/using-cors-with-all-modern-browsers) -- [Stack Overflow のよくある問題を解決するための "how to" 情報](https://stackoverflow.com/questions/43871637/no-access-control-allow-origin-header-is-present-on-the-requested-resource-whe/43881141#43881141): +- [Will it CORS?](https://httptoolkit.com/will-it-cors/) - 対話型の CORS の説明および生成(英語) +- [Chrome ブラウザーを CORS なしで実行する方法](https://alfilatov.com/posts/run-chrome-without-cors/)(英語) +- [すべての(現代の)ブラウザーで CORS を使用](https://www.telerik.com/blogs/using-cors-with-all-modern-browsers)(英語) +- [Stack Overflow のよくある問題を解決するための "how to" 情報](https://stackoverflow.com/questions/43871637/no-access-control-allow-origin-header-is-present-on-the-requested-resource-whe/43881141#43881141)(英語): - CORS のプリフライトを防止する方法 - CORS プロキシーを使用して「Access-Control-Allow-Origin ヘッダーの欠落」を回避する方法 diff --git a/files/ja/web/http/cors/preflight-correct.svg b/files/ja/web/http/cors/preflight-correct.svg new file mode 100644 index 00000000000000..fc5c47cba018fd --- /dev/null +++ b/files/ja/web/http/cors/preflight-correct.svg @@ -0,0 +1 @@ +サーバークライアントサーバークライアントプリフライトリクエストメインリクエストOPTIONS /doc HTTP/1.1Origin: https://foo.exampleAccess-Control-Request-Method: POSTAccess-Control-Request-Headers: X-PINGOTHER, Content-type...HTTP/1.1 204 No ContentAccess-Control-Allow-Origin: https://foo.exampleAccess-Control-Allow-Methods: POST, GET, OPTIONSAccess-Control-Allow-Headers: X-PINGOTHER, Content-typeAccess-Control-Max-Age: 86400...POST /doc HTTP/1.1X-PINGOTHER: pingpongContent-Type: text/xml; charset=UTF8Origin: https://foo.example...HTTP/1.1 200 OKAccess-Control-Allow-Origin: https://foo.exampleVary: Accept-Encoding, OriginContent-Length: 235... \ No newline at end of file diff --git a/files/ja/web/http/cors/preflight_correct.png b/files/ja/web/http/cors/preflight_correct.png deleted file mode 100644 index 72f9a8bf89bcd145253f08e56f52807a37e7e10e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24349 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 diff --git a/files/ja/web/http/cors/simple-req.png b/files/ja/web/http/cors/simple-req.png deleted file mode 100644 index 8c3f857e7c892f7518c53b5f01859ab94db0e78c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5933 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 + + + サーバー + + + + クライアント + + + + + + サーバー + + + + + + + クライアント + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GET /resources/public-data/ HTTP/1.1 + Origin: https://foo.example + + HTTP/1.1 200 OK + Access-Control-Allow-Origin: * + +