オリジン間リソース共有 - CORS(オリジン間リソース共有)
異なるオリジン間での HTTP リクエストを制御する仕組み。同一オリジンポリシーを緩和しつつ、不正なアクセスを防ぐ。
概念図
実例
CORS レスポンスヘッダの設定例
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400Express.js での CORS ミドルウェア設定
// Express.js での CORS 設定
const cors = require("cors");
app.use(cors({
origin: ["https://app.example.com"],
methods: ["GET", "POST"],
credentials: true,
maxAge: 86400
}));CORS の仕組み
ブラウザは同一オリジンポリシー(Same-Origin Policy)により、異なるオリジンへの JavaScript からのリクエストをデフォルトでブロックします。
CORS はサーバー側が HTTP ヘッダで「どのオリジンからのアクセスを許可するか」を宣言する仕組みです。
単純リクエスト(Simple Request): GET, HEAD, POST(条件付き)は直接送信され、レスポンスの
Access-Control-Allow-Originヘッダで検証されるプリフライトリクエスト(Preflight): PUT, DELETE、カスタムヘッダを含むリクエストは、事前に OPTIONS メソッドで許可を確認する。
Access-Control-Max-Ageでプリフライト結果をキャッシュできる認証情報付きリクエスト:
credentials: "include"の場合、Access-Control-Allow-Originにワイルドカード(*)は使用できない。具体的なオリジンを指定する必要がある
よくある設定ミスと対策
Access-Control-Allow-Origin: *の乱用: 全オリジンを許可するとセキュリティリスクが高い。信頼できるオリジンのみをホワイトリストで指定するOrigin ヘッダのリフレクション: リクエストの Origin ヘッダをそのまま
Access-Control-Allow-Originに返す実装は危険。攻撃者のオリジンも許可してしまうnullオリジンの許可:Access-Control-Allow-Origin: nullはサンドボックス化された iframe から悪用される可能性があるcredentials と wildcard の同時使用:
Access-Control-Allow-Credentials: trueとAccess-Control-Allow-Origin: *は同時に使用できない。ブラウザがエラーにする
