異なるドメイン間の API リクエストをブラウザが安全に許可するための仕組み。
CORS(Cross-Origin Resource Sharing)は、ブラウザが異なるオリジン間でのHTTPリクエストを安全に制御するための仕組みです。マンションに例えてみましょう。同じマンション(同一オリジン)の住人なら自由に行き来できますが、別のマンション(別オリジン)の部屋に入るには、その部屋の住人から「許可証」をもらう必要があります。CORSヘッダーはこの「許可証」に相当します。
上のツールで「シンプルリクエスト」シナリオを再生すると、OriginヘッダーとAccess-Control-Allow-Originヘッダーのやり取りが確認できます。
CORS のリクエストは「シンプルリクエスト」と「プリフライト付きリクエスト」の2種類に分かれます。どちらになるかはブラウザが自動で判断するため、開発者が選ぶものではありません。
判断基準はシンプルで、HTTP メソッドとヘッダーが「安全」な範囲内かどうかです。
GET / HEAD / POST のいずれかPUT / DELETE / PATCHAuthorization ヘッダーを付けるContent-Type: application/json を使うCORS は HTTP ヘッダーでやり取りします。リクエスト側(ブラウザが自動付与)とレスポンス側(サーバーが設定)に分かれます。
リクエスト元のオリジン(スキーム + ドメイン + ポート)を伝えます。ブラウザが自動で付けるため、JavaScript から変更や削除はできません。サーバーはこの値を見て許可するかどうかを判断します。
プリフライト(OPTIONS)リクエストでのみ使われます。本リクエストで使いたい HTTP メソッドをサーバーに伝えます。
プリフライトで使われます。本リクエストで使いたいカスタムヘッダーをサーバーに伝えます。
最も重要な CORS ヘッダーです。どのオリジンからのアクセスを許可するかを指定します。ブラウザはこの値とリクエスト元の Origin を比較し、一致しなければレスポンスを JavaScript から読めなくします。
* は手軽ですが、Cookie や Authorization を送る場合は使えません。本番環境では具体的なオリジンを指定するのが安全です。
プリフライトレスポンスで使います。許可する HTTP メソッドの一覧を返します。
プリフライトレスポンスで使います。許可するリクエストヘッダーの一覧を返します。
Cookie や Authorization ヘッダーをクロスオリジンで送受信するかを制御します。true にすると、クライアント側で credentials: "include" を指定した場合に Cookie が送受信されます。
プリフライトの結果をブラウザがキャッシュする秒数です。この間は同じ種類のリクエストでプリフライトが省略されます。
デフォルトでは JavaScript から読めるレスポンスヘッダーは限られています(Cache-Control, Content-Type 等のみ)。カスタムヘッダーを JavaScript から読みたい場合に指定します。
プリフライトが必要なCORSリクエストの5つのステップを追いかけます。