CORS(オリジン間リソース共有)とは

こーす

同一オリジンポリシーで制限されている、ほかのオリジンへのリクエストとその応答の読み取りを、サーバが許可した範囲で認めるための仕組み。サーバは Access-Control-Allow-Origin などの応答ヘッダで、どのオリジンからの読み取りを許すかを示す。Content-Type が application/json のPOSTのように、単純なフォームの送信では作れないリクエストでは、ブラウザが先に OPTIONS メソッドで事前の確認(プリフライト)を送る。ブラウザが守る規則で、サーバを攻撃から守る仕組みではない。

「CORS(オリジン間リソース共有)」は、1分野の1問の練習問題に出てきます(Web技術の基礎など)。

この用語の分野: Web技術の基礎

単純なリクエストとプリフライト

GETや、フォームで送れる形式(application/x-www-form-urlencoded、multipart/form-data、text/plain)のPOSTなどは確認なしで送られ、応答をスクリプトが読めるかどうかだけが Access-Control-Allow-Origin で決まります。それ以外のメソッドや Content-Type、独自のヘッダを使うリクエストでは、ブラウザがまず OPTIONS で、使うメソッドとヘッダを Access-Control-Request-Method などで伝えます。サーバが許可を返すと、ブラウザは本来のリクエストを送ります。

Cookieを付けるとき

ほかのオリジンへのリクエストにCookieを付けて送るには、スクリプトの側で credentials を指定し、サーバが Access-Control-Allow-Credentials: true を返す必要があります。このとき Access-Control-Allow-Origin に、すべてを表す * は使えず、許可するオリジンを具体的に書きます。許可するオリジンを広げすぎると、ほかのサイトから利用者の情報を読まれるおそれがあります。

よくある誤解

CORSのエラーは、ブラウザが応答をスクリプトに渡さなかったことを示すもので、リクエストそのものはサーバに届いている場合があります。また、CORSはブラウザが守る規則なので、コマンドラインのツールやほかのサーバからのリクエストは止めません。サーバのデータを守るには、認証や権限の確認を別に行います。

CORS(オリジン間リソース共有)の練習問題に挑戦

https://app.example.com のページのJavaScriptが、fetch を使って https://api.example.net/orders へ、Content-Type: application/json の本文を付けたPOSTのリクエストを送ろうとしている。このときのCORSの動作として、正しいものはどれか。

  1. ACORSはブラウザ以外にも働くので、サーバの許可がなければ、コマンドラインのツールから送ったPOSTもネットワークの途中で止められる
  2. BブラウザはまずOPTIONSメソッドで事前の確認(プリフライト)を送り、サーバがヘッダで許可を返した場合だけ、本来のPOSTを送る
  3. C異なるオリジンへのリクエストはいつも確認なしで送られ、サーバが応答に何も付けなくても、ページのJavaScriptは応答を読み取れる
答えと解説を見る

正解:B. ブラウザはまずOPTIONSメソッドで事前の確認(プリフライト)を送り、サーバがヘッダで許可を返した場合だけ、本来のPOSTを送る

CORSは、同一オリジンポリシーで制限されている、ほかのオリジンへのリクエストとその応答の読み取りを、サーバが許可した範囲で認める仕組みです。Content-Type が application/json のPOSTは、単純なフォームの送信では作れない種類のリクエストなので、ブラウザはまず OPTIONS で、使うメソッドやヘッダを伝えて許可を確かめます。サーバの応答に Access-Control-Allow-Origin などの許可がなければ、ブラウザは本来のリクエストを送りません。CORSはブラウザが守る規則なので、サーバは別に、認証や権限の確認で自分を守る必要があります。

よくある質問

CORSのエラーは、クライアントの側で直せますか?

いいえ。どのオリジンからの読み取りを許すかはサーバが決めるので、APIのサーバの応答に、適切な許可のヘッダを付ける必要があります。自分で管理していないAPIなら、自分のサーバを経由して呼び出す方法もあります。

同一オリジンポリシーとCORSは、どういう関係ですか?

同一オリジンポリシーが、ほかのオリジンの応答の読み取りを原則として禁止し、CORSは、サーバが明示した範囲でその例外を認める仕組みです。CORSの許可を返さなければ、同一オリジンポリシーの制限がそのまま働きます。

解説の中の「CORS(オリジン間リソース共有)」

「CORS(オリジン間リソース共有)」が出てくる問題(1問)

  1. https://app.example.com のページのJavaScriptが、fetch を使って https://api.example.net/orders へ、Content-Type: application/json の本文を付けたPOSTのリクエストを送ろうとしている。このときのCORSの動作として、正しいものはどれか。

Web技術の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

同一オリジンポリシー イベントループ WebSocket HTTP HTTPステータスコード HTTPメソッド OAuth Cookie サーバサイドレンダリング(SSR) JSON

用語集の一覧へ