Web全般
2021.5.14
なんとなくわかったつもりになっていたCORSについて、ちゃんと理解するためにまとめてみました。
Cross-Origin Resource Sharing、日本語訳するとオリジン間リソース共有のこと。
オリジンとは、プロトコルとドメイン、ポート番号のこと。
クライアント側のWebアプリケーションに適用されるセキュリティルールの1つ。 日本語訳すると同一オリジン(生成元)ポリシー。
同一オリジンポリシーは重要なセキュリティの仕組みであり、あるオリジンから読み込まれた文書やスクリプトが、どのように他のオリジンからのリソースと対話することができるかを制限するものです。悪意ある行動を起こしかねないリソースを分離し、攻撃の可能性を縮小するのに役立ちます。 MDNより
現代の主要なブラウザはすべて、Same Origin Policyに基づく制限を実装しています。
簡単に言うと、JavaScriptで自由にやりとりできるところは、そのJavaScriptをとってきたところと同一の場所だけに制限されるのです。
同一オリジンかどうかは、前述のとおりホスト、ポート番号、プロトコルによって判断されます。 ホスト、ポート番号、プロトコルのいずれか1つでも違う場合はSame Origin Policyの対象となってリクエストに失敗します。
CORSは、原則Same Origin Policyによって同一オリジン間でないとできないやりとりを、異なるオリジン間でも安全に許可する方法です。
CORSは、HTTPリクエストを行う際のヘッダーに情報を記述します。
まず、HTTPリクエストを「単純なHTTPリクエスト(シンプルリクエスト)」と「単純でないHTTPリクエスト(プリフライトリクエスト)」に分類します。
以上にあてはまるものは、「単純なHTTPリクエスト」としてそのままリクエストを送信し、サーバーからの応答をチェックします。
Origin: https://test.co.jp
Access-Control-Allow-Origin: http://test.co.jp //特定のサイトを許可 Access-Control-Allow-Origin: * // 全てのサイトを許可 Access-Control-Allow-Headers "X-Requested-With, Origin, X-Csrftoken, Content-Type, Accept" //フレームワークにより異なる
シンプルリクエスト以外のHTTPリクエストは単純でないHTTPリクエスト(プリフライトリクエスト)に分類されます。
プリフライトリクエストの場合、ブラウザのJavaScriptからサーバーに事前問い合わせ(プリフライト)を行い、アクセスが許可されるか確認します。
Access-Control-Allow-Methods: PUT, DELETE, PATCH
CORSの基本的な部分について理解できました。 今後は具体的な実装方法についても勉強していきます!
Megumi Tanimoto
Editor
フロントエンドエンジニア1年目。
エンジニアライフ、技術的なアウトプットを中心に発信します。