CORS(クロスオリジンリソース共有)完全ガイド:API アクセス制限とセキュリティの実践

なぜブラウザはクロスドメインリクエストをブロックするのか?

フロントエンド開発中に「Access-Control-Allow-Origin」エラーに遭遇したことはありませんか?これはシステムの不具合ではなく、ユーザー保護のための「同一生成元ポリシー(Same-Origin Policy, SOP)」によるものです。SOP は、異なるオリジン(プロトコル、ドメイン、ポートが異なる)からのリクエストが直接データにアクセスするのを制限します。

同一生成元ポリシーと CORS の核心的な違い

同一生成元ポリシーはブラウザのデフォルトの動作ですが、CORS(Cross-Origin Resource Sharing)は、安全な前提でサーバーが特定の外部ソースにデータアクセスを許可するための仕組みです。HTTP ヘッダーを介して、サーバーは許可するソースを明確に定義できます。

開発者へのヒント:CORS エラーは通常、サーバー側ではなくブラウザ側で発生します。バックエンド API が正しく動作していても、CORS 設定が欠けているとブラウザはセキュリティの観点からレスポンスをブロックします。

単純リクエストとプリフライトリクエストの判断基準

すべてのリクエストが複雑な CORS ハンドシェイクを必要とするわけではありません。HTTP メソッドとヘッダーの複雑さに応じて、ブラウザは「単純リクエスト」と「非単純リクエスト」を区別します。

リクエストタイプ特徴プリフライト (Preflight)
単純リクエストGET/POST、標準ヘッダーのみ不要
非単純リクエストカスタムヘッダーや PUT/DELETE を含む必要 (OPTIONS)

プリフライトリクエストの仕組み

非単純リクエストの場合、ブラウザはまず OPTIONS リクエストをサーバーに送信し、「このリクエストを送信してよいか?」を尋ねます。サーバーは許可されたソースやメソッドを返し、それが承認された後にのみ実際のリクエストが送信されます。

よくある CORS 設定ミス

  • Access-Control-Allow-Origin をワイルドカード(*)にし、認証情報(Credentials)を許可している。
  • OPTIONS リクエストを正しく処理しておらず、プリフライトが失敗する。
  • 必要な Access-Control-Allow-Headers が欠けている。
  • すべてのソースを無制限に開放しており、クロスサイト攻撃のリスクがある。

API の CORS ヘッダーを正しく設定する方法

サーバーサイドの設定では「最小権限の原則」に従いましょう。アスタリスクではなく、許可された Origin を明示的に指定します。Cookie を送信する必要があるアプリでは、Access-Control-Allow-Credentials を true に設定し、Origin が * になっていないことを確認してください。

セキュリティ警告:API に機密データが含まれている場合、本番環境で Access-Control-Allow-Origin を * に設定しないでください。すべてのサイトが API データにアクセスできるようになってしまいます。

現代的な API 設計におけるセキュリティの考慮事項

CORS に加えて、Content-Security-Policy (CSP) や X-Content-Type-Options などの他のセキュリティヘッダーも併せて確認することをお勧めします。これらのメカニズムを統合することで、XSS やクロスサイトリクエストフォージェリのリスクを大幅に低減できます。