🗂

CORSとは誰が何の情報を基に制御しているか

2024/11/15に公開

結論 ~ CORSとは誰が何の情報を基に制御しているか ~

早速結論です。

追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組み

https://developer.mozilla.org/ja/docs/Web/HTTP/CORS

重要な点は誰が、何を制御しているかです。
1: HTTPヘッダー(Access-Control-Allow-Originなど)を追加するのはWEBサーバー
2: CORSのエラーを制御するのはブラウザ

このようにWEBサーバーとブラウザが連携して? クロスオリジンのリクエストを制御しています。

いつ、ブラウザのCORSの制御が行われる

シンプルリクエスト

いかなるリクエストでもCORSの制御が発生する訳では有りません。
CORSの仕様上プリリクエストを必要としないリクエストです。
以下の条件をすべて満たす場合に、シンプルリクエストとみなされます:

  • メソッドが GET, POST, または HEAD のいずれかである。
  • カスタムヘッダー (Authorization など) が使用されていない。
  • Content-Type が以下のいずれかである:
    • text/plain
  • multipart/form-data
  • application/x-www-form-urlencoded

プリリクエスト (Preflight Request)

プリリクエスト CORS で行われる事前確認のためのリクエストです。
つまり、APIの本リクエストが行われる前にWEBサーバー側に事前確認のリクエストを送っているのです。

特定の HTTP メソッドやヘッダーが使用される場合、ブラウザはまず OPTIONS メソッドでリクエストを送信し、サーバーに問い合わせます。
例えば、Content-Type: application/json や、Authorization ヘッダーが含まれているリクエスト、または PUT や DELETE メソッドのリクエストはプリリクエストが必要です。
目的は、ブラウザが実際のリクエストを送信する前に、サーバーが許可しているかを確認することです。

CORSで利用されるヘッダー

CORSヘッダー種類

  1. Access-Control-Allow-Origin
    サーバーがリクエスト元のオリジン (例: https://example.com) を許可するかどうかを指定します。
    許可するオリジンを指定、もしくは * ですべてのオリジンを許可します。
例:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods
  1. サーバーが許可する HTTP メソッド (GET, POST, PUT, など) を指定します。
例:
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers
  1. クライアントがリクエストで使用できるカスタムヘッダーを指定します。
例:
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials
  1. クッキーや認証情報を含むリクエストを許可する場合は true に設定します。
例:
コードをコピーする
Access-Control-Allow-Credentials: true

CORSヘッダーはいつ付与されるか

プリリクエストのレスポンス で CORS ヘッダーを付与する

プリリクエストが成功すると、ブラウザは実際のリクエストを送信します。
このときも、サーバーはレスポンスに CORS ヘッダーを付与します。

参考情報

https://developer.mozilla.org/ja/docs/Web/HTTP/CORS

Discussion