「APIに Access-Control-Allow-Origin を付けたら動いたけど、これ安全?」——CORSは“付ければOK”ではなく、許可する相手を絞るのが肝です。仕組みと安全な設定を解説します(攻撃手順は載せません)。
まず仕組み
ブラウザには「別オリジンのJSは勝手に他サイトの応答を読めない」という同一オリジンポリシーがあります。CORSは、その例外をサーバーが明示的に許可した相手にだけ開くためのものです。
| 応答ヘッダ | 意味 |
|---|---|
Access-Control-Allow-Origin | どのオリジンに応答の読み取りを許すか |
Access-Control-Allow-Credentials | Cookie等の認証情報を伴う通信を許すか |
Access-Control-Allow-Methods / -Headers | 許可するHTTPメソッド/ヘッダ |
ポイントは、CORSは「制限を緩める」側の仕組みだということ。緩め方を間違えると、本来読めないはずのデータが第三者に読めてしまいます。
何が危ない設定か
危険な設定(やりがち)
- リクエストの Origin をそのまま反射して許可する
Access-Control-Allow-Origin: *+ 認証情報も許可- 必要のないAPIまで広く別オリジンに開放
安全な設定
- 許可リスト(信頼できる固定のオリジンだけ)
- それ以外は既定で拒否
- 認証情報を伴うなら
*を使わず具体的なオリジンを指定
安全な設定の基本
許可リスト方式にする(最重要)
Originを鵜呑みに反射しない
Origin をそのまま Access-Control-Allow-Origin に echo しない。許可リストと突き合わせて一致したときだけ返す。認証情報を伴うなら * を使わない
Access-Control-Allow-Origin: * と Allow-Credentials: true を併用しない。具体的なオリジンを指定する。開く範囲を最小に
次に読む
- 用語:XSS とは / CSRF とは
- 確認:セキュリティヘッダ診断
よくある質問
QCORSは何のための仕組みですか?
ブラウザには『別のオリジン(サイト)のJavaScriptは、勝手に他サイトの応答を読めない』という同一オリジンポリシーがあります。CORS(Cross-Origin Resource Sharing)は、その例外を“サーバーが明示的に許可した相手にだけ”開くための仕組みです。Access-Control-Allow-Origin などの応答ヘッダで、どのオリジンに応答の読み取りを許すかを宣言します。
QCORSの設定ミスで何が起きますか?
許可を緩くしすぎると、攻撃者のサイトのJavaScriptから、利用者のログイン済みAPIの応答を読まれる恐れがあります。典型例は、リクエストのOriginをそのまま反射して許可する設定や、Access-Control-Allow-Origin を * にしつつ認証情報(Cookie等)も許可してしまう設定です。結果として個人情報やトークンが第三者サイトに渡り得ます。
Q安全な設定の基本は?
『許可リスト方式』です。あらかじめ決めた信頼できるオリジンだけを許可し、それ以外は拒否(既定で拒否)。リクエストのOriginを鵜呑みに反射しない。認証情報を伴う通信では Access-Control-Allow-Origin に * を使わず、具体的なオリジンを指定する。そもそも別オリジンに公開する必要があるエンドポイントだけを対象にする、のが基本です。