CORSとは誰が何の情報を基に制御しているか
結論 ~ CORSとは誰が何の情報を基に制御しているか ~
早速結論です。
追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組み
重要な点は誰が、何を制御しているかです。
1: HTTPヘッダー(Access-Control-Allow-Originなど)を追加するのはWEBサーバー
2: CORSのエラーを制御するのはブラウザ
このようにWEBサーバーとブラウザが連携して? クロスオリジンのリクエストを制御しています。
いつブラウザのCORSの制御が行われる
プリリクエスト (Preflight Request)
プリリクエスト CORS で行われる事前確認のためのリクエストです。
つまり、APIの本リクエストが行われる前にWEBサーバー側に事前確認のリクエストを送っているのです。
特定の HTTP メソッドやヘッダーが使用される場合、ブラウザはまず OPTIONS メソッドでリクエストを送信し、サーバーに問い合わせます。
例えば、Content-Type: application/json や、Authorization ヘッダーが含まれているリクエスト、または PUT や DELETE メソッドのリクエストはプリリクエストが必要です。
目的は、ブラウザが実際のリクエストを送信する前に、サーバーが許可しているかを確認することです。
シンプルリクエスト
いかなるリクエストでも CORS のプリフライト(OPTIONS)が発生するわけではありません。
CORS の仕様上、以下の条件をすべて満たすリクエストは「シンプルリクエスト」として扱われ、プリフライトは行われません。
ただし、プリフライトがない=CORS制御がない、というわけではありません。
サーバーが適切な CORS レスポンスヘッダ(特に Access-Control-Allow-Origin
)を返さない場合、ブラウザはレスポンスをブロックします。
以下のすべての条件を満たすと、シンプルリクエストとみなされます:
- メソッドが
GET
,POST
, またはHEAD
のいずれかである。 - カスタムヘッダー(
Authorization
やX-Requested-With
など)が使用されていない。 -
Content-Type
が以下のいずれかである:text/plain
multipart/form-data
application/x-www-form-urlencoded
CORSで利用されるヘッダー
CORSヘッダー種類
- Access-Control-Allow-Origin
サーバーがリクエスト元のオリジン (例: https://example.com) を許可するかどうかを指定します。
許可するオリジンを指定、もしくは * ですべてのオリジンを許可します。
例:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods
- サーバーが許可する HTTP メソッド (GET, POST, PUT, など) を指定します。
例:
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers
- クライアントがリクエストで使用できるカスタムヘッダーを指定します。
例:
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials
- クッキーや認証情報を含むリクエストを許可する場合は true に設定します。
例:
コードをコピーする
Access-Control-Allow-Credentials: true
CORSヘッダーはいつ付与されるか
プリリクエストのレスポンス で CORS ヘッダーを付与する
プリリクエストが成功すると、ブラウザは実際のリクエストを送信します。
このときも、サーバーはレスポンスに CORS ヘッダーを付与します。
参考情報
Discussion