CORS

ブラウザの同一オリジンポリシーを緩和し、異なるオリジン間のリソース共有を許可する仕組み

セキュリティHTTP

CORS とは

CORS (Cross-Origin Resource Sharing) は、ブラウザの同一オリジンポリシーを緩和し、異なるオリジン間のリソース共有を許可する仕組みである。フロントエンドと API が異なるドメインにある場合に必要。関連記事: 「CORS ヘッダー」「CORS オリジン」「CORS プリフライト」。

同一オリジンポリシー

オリジン = スキーム + ホスト + ポート

https://app.example.com → https://api.example.com
  ホストが異なる → クロスオリジン → CORS が必要

https://example.com → https://example.com/api
  同一オリジン → CORS 不要

CORS の流れ

1. ブラウザが fetch('https://api.example.com/data') を実行
2. ブラウザが Origin: https://app.example.com ヘッダーを付与
3. サーバーが Access-Control-Allow-Origin: https://app.example.com を返す
4. ブラウザがレスポンスを JavaScript に渡す

Origin が許可リストにない場合:
  → ブラウザがレスポンスをブロック (サーバーは正常に応答している)

CORS を回避する方法

# CloudFront でパスベースルーティング → 同一オリジン
Distribution:
  Properties:
    DistributionConfig:
      CacheBehaviors:
        - PathPattern: /api/*
          TargetOriginId: api
      DefaultCacheBehavior:
        TargetOriginId: s3
# https://example.com と https://example.com/api は同一オリジン

よくあるエラーと対策

エラー 原因 対策
No 'Access-Control-Allow-Origin' サーバーが CORS ヘッダーを返していない API Gateway の CORS 設定
Preflight で 401 OPTIONS に認証が必要 OPTIONS は認証不要にする
* + Credentials ワイルドカードと Cookie の併用 具体的なオリジンを指定

CORS 関連の用語集

用語 説明
CORS ヘッダー レスポンスヘッダーの詳細
CORS オリジン オリジンの定義と判定
CORS プリフライト OPTIONS リクエストの仕組み
CORS と HSTS HTTPS 強制との関係
CORS と SameSite Cookie の送信制御
CORS とトークン Bearer トークンの送信

基礎から学ぶなら関連書籍が手がかりになる。

関連用語