オリジン間リソース共有(オリジンかんりそーすきょうゆう)とは | 意味や読み方など丁寧でわかりやすい用語解説
オリジン間リソース共有(オリジンかんりそーすきょうゆう)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
オリジン間リソース共有 (オリジンかんりそーすきょうゆう)
英語表記
Cross-Origin Resource Sharing (クロスオリジン リソース シェアリング)
用語解説
オリジン間リソース共有(Cross-Origin Resource Sharing, CORS)は、Webブラウザのセキュリティ機構の一つで、あるオリジン(Origin)のWebページから、別のオリジンのリソースにアクセスする際に発生する制限を緩和するための仕組み。
Webブラウザは、セキュリティ上の理由から、異なるオリジン間のリソース共有を原則として禁止している。これはSame-Origin Policy(同一オリジンポリシー)と呼ばれるもので、悪意のあるWebサイトが、ユーザーがアクセスしている別のWebサイトのデータを不正に取得することを防ぐためのもの。オリジンとは、プロトコル(http/https)、ホスト名(example.com)、ポート番号(:80, :443など)の組み合わせで定義される。これら3つがすべて一致する場合に、同一オリジンとみなされる。例えば、http://example.comとhttps://example.comはプロトコルが異なるため、異なるオリジンとなる。
同一オリジンポリシーが存在する状況で、異なるオリジン間のリソース共有が全くできないと、Webアプリケーションの開発において大きな制約となる。例えば、APIサーバーが異なるオリジンで提供されている場合、WebページからAPIサーバーにアクセスすることができなくなる。そこで登場するのがCORS。CORSは、サーバー側が許可するオリジンからのリクエストのみを受け入れるように設定することで、安全なクロスオリジンリクエストを可能にする。
CORSの仕組みは、主にHTTPヘッダーを利用して実現される。Webブラウザが異なるオリジンにリクエストを送信する際、ブラウザは自動的にOriginヘッダーをリクエストに付加する。このOriginヘッダーには、リクエストを送信したWebページのオリジン情報が含まれる。
サーバー側は、このOriginヘッダーの値を確認し、Access-Control-Allow-Originヘッダーをレスポンスに含めることで、どのオリジンからのリクエストを許可するかを指定する。Access-Control-Allow-Originの値には、特定のオリジンを指定することも、すべてのオリジンを許可する*を指定することも可能。ただし、Access-Control-Allow-Credentialsヘッダーがtrueに設定されている場合は、Access-Control-Allow-Originに*を使用することはできない。セキュリティ上の理由から、クレデンシャル(Cookie、Authorizationヘッダーなど)を伴うリクエストの場合は、具体的なオリジンを指定する必要がある。
CORSリクエストには、単純リクエスト(Simple Request)とプリフライトリクエスト(Preflight Request)の2種類がある。
単純リクエストは、特定の条件を満たすリクエストのこと。具体的には、HTTPメソッドがGET、HEAD、POSTのいずれかであり、Content-Typeヘッダーの値がapplication/x-www-form-urlencoded、multipart/form-data、text/plainのいずれかである場合、単純リクエストとみなされる。単純リクエストの場合、ブラウザは直接リクエストをサーバーに送信し、サーバーからのレスポンスに含まれるAccess-Control-Allow-Originヘッダーを確認する。ヘッダーの値がリクエスト元のオリジンと一致するか、*である場合、ブラウザはレスポンスをWebページに返す。一致しない場合は、ブラウザはレスポンスをWebページに渡さず、エラーを発生させる。
プリフライトリクエストは、単純リクエストの条件を満たさないリクエストのこと。例えば、HTTPメソッドがPUTやDELETEである場合や、カスタムヘッダーが含まれている場合などが該当する。プリフライトリクエストの場合、ブラウザはまず、OPTIONSメソッドを使ってサーバーにプリフライトリクエストを送信する。このプリフライトリクエストには、Access-Control-Request-Methodヘッダー(使用するHTTPメソッド)とAccess-Control-Request-Headersヘッダー(カスタムヘッダー)が含まれる。サーバーは、このプリフライトリクエストに対して、Access-Control-Allow-Methodsヘッダー(許可するHTTPメソッド)とAccess-Control-Allow-Headersヘッダー(許可するカスタムヘッダー)を含むレスポンスを返す。ブラウザは、サーバーからのレスポンスを確認し、リクエストを送信しても安全かどうかを判断する。許可されていない場合は、エラーが発生し、実際のリクエストは送信されない。許可されている場合は、実際のリクエストがサーバーに送信される。
CORSの設定は、サーバー側の設定によって制御されるため、Webアプリケーション開発者は、サーバー側の設定を適切に行う必要がある。誤った設定を行うと、セキュリティ上の問題を引き起こす可能性があるため、注意が必要。例えば、Access-Control-Allow-Originに*を指定することは、開発時には便利だが、本番環境では特定のオリジンのみを許可するように設定することが望ましい。また、クレデンシャルを伴うリクエストの場合は、Access-Control-Allow-Credentialsをtrueに設定し、Access-Control-Allow-Originには具体的なオリジンを指定する必要がある。
CORSは、Webセキュリティにおいて重要な役割を果たしている。CORSを理解し、適切に設定することで、安全なWebアプリケーションを開発することができる。システムエンジニアを目指す上で、CORSの仕組みと設定方法を理解しておくことは不可欠と言える。