CORSエラー(Cross-Origin Resource Sharing Error)とは?「Access-Control-Allow-Origin」の設定

CORSエラーとは

CORSは「異なるオリジン(ドメイン、プロトコル、ポート)間でのリソース共有」を制御するセキュリティの仕組みです。

そのため異なるオリジン間でリソースをリクエストしようとする際にブラウザが制限をかけることにより、CORSエラーが発生します。

ウェブサイト localhost:3000 fetch(‘/api/data’) APIサーバー localhost:8000 Access-Control-Allow-* ブラウザ CORSチェック ✓ オリジンの確認 ✓ メソッドの許可 ✓ ヘッダーの確認 CORSエラーが発生する場合: 1. オリジンの不一致(例:localhost:3000からのリクエストに対し、サーバーが異なるオリジンを許可) 2. 許可されていないHTTPメソッド(GET/POST/PUT等)の使用

「Access-Control-Allow-Origin」の設定

異なるオリジン間のリクエストで制限をうけずにアクセスするためには、レスポンスヘッダーに「Access-Control-Allow-Origin」を指定することで可能になります。

プリフライトリクエストとは

異なるオリジン(ドメイン)へリクエストを送る前の「事前確認」

  • 本来のリクエストを送る前に、そのリクエストが安全かどうかを確認します
  • HTTPのOPTIONSメソッドを使用して送信されます

プリフライトリクエストはブラウザが自動的に行います。開発者が明示的にコードを書く必要はありません。

プリフライトが必要になるケース

  • 特殊なヘッダーを使用する場合
  • application/jsonなどの特殊なContent-Typeを使用する場合
  • GET/POST/HEAD以外のメソッド(PUT、DELETEなど)を使用する場合

プリフライトリクエストの流れ

ブラウザがOPTIONSリクエストを送信 サーバーがCORS設定を返答 許可された場合のみ、本来のリクエストを送信

CORSリクエストパターン パターン1: Simple Request (プリフライトなし) フロントエンド API サーバー GETリクエスト/通常フォーム送信 パターン2: プリフライト成功パターン フロントエンド API サーバー 1. OPTIONSリクエスト 2. CORS OK 3. 本来のリクエスト パターン3: プリフライト失敗パターン フロントエンド API サーバー 1. OPTIONSリクエスト 2. CORS エラー 本来のリクエストは送信されない

開発者ツールでの確認方法

  1. ブラウザの開発者ツールを開く
  2. Networkタブで確認
    • OPTIONSメソッドのリクエスト → これがプリフライトリクエスト
    • その直後の本来のリクエスト

リクエストヘッダー:

  • Origin: [送信元のドメイン]
  • Access-Control-Request-Method: [使用予定のメソッド]
  • Access-Control-Request-Headers: [使用予定のヘッダー]

レスポンスヘッダー:

  • Access-Control-Allow-Origin: [許可されているドメイン]
  • Access-Control-Allow-Methods: [許可されているメソッド]
  • Access-Control-Allow-Headers: [許可されているヘッダー]
Elements Network Console Name Method Status /api/data OPTIONS 204 /api/data POST 200 プリフライトリクエストの確認方法: 1. ブラウザの開発者ツールを開く (F12 または右クリック → 検証) 2. Networkタブを選択 3. OPTIONSメソッドのリクエストを探す 4. リクエストをクリックすると詳細が表示される: – Request Headers: Origin, Access-Control-Request-Method – Response Headers: Access-Control-Allow-Origin, Methods, Headers

ローカルのNext.jsのプロジェクトからさくらインターネットのレンタルサーバーのphpのAPIにアクセスする場合