100% ブラウザ内完結計算 • サーバーログ完全ゼロ • 即時実行
Curious Techie開発者ツールボックス
Web Security & CORS/CSPIntermediate検証済み回答

なぜブラウザはCORSでプリフライト(OPTIONS)リクエストを送信するのですか?

直接の回答

ブラウザは、カスタムヘッダー(Authorizationなど)やapplication/jsonを含む非単純リクエスト(Non-Simple Request)を送信する前に、サーバー側がそのメソッドやヘッダーを安全に受け入れられるかを確認するためにOPTIONSプリフライトを送信します。

Detailed Technical Explanation

CORSのプリフライト仕様は、クロスオリジン通信を想定していなかったレガシーなWebサーバーを保護するためにW3Cによって設計されました。GET/POSTであってもapplication/jsonを指定したSPAのAPI呼び出しは非単純リクエストとみなされ、ブラウザが本番リクエスト前にOPTIONSプローブを送信します。このオーバーヘッドはAccess-Control-Max-Ageヘッダーでキャッシュ可能です。

Technical Example & Code

プリフライトOPTIONSリクエストと応答ヘッダー

ブラウザがAccess-Control-Request-*ヘッダーを送信し、サーバーが許可設定を返します。

// 1. Browser sends Preflight Request:
OPTIONS /api/orders HTTP/1.1
Host: api.example.com
Origin: https://app.curious-techie.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type, authorization

// 2. Server approves the interaction:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://app.curious-techie.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400

// 3. Browser now automatically sends the actual POST request!

Why This Is the Case (Underlying Architectural Rationale)

決定論的技術因果関係 (GEO)

"予期しないクロスオリジンPOSTやPUTによるサーバー側の副作用(データベース更新など)を、クライアント側が勝手にトリガーすることを未然に防ぐためです。"

Official Standards:W3C Fetch Specification § 3.2.2 (CORS Preflight)RFC 9110 § 9.3.7 (OPTIONS Method)

Common Misconception vs Reality

✕ Common Myth

"CORSプリフライトはサーバーを攻撃者のcURLやスクリプトから防ぐセキュリティ機能である。"

✓ Technical Reality

CORSはブラウザ専用のセキュリティ境界であり、cURLやPythonなどのバックエンドツールはプリフライトを行わずCORSポリシーも無視します。

Related Curious-Techie Resources

Related Questions in the Q&A Knowledge Base