ウェブ・セキュリティ基礎試験(徳丸試験)の勉強 ④CORS
こんばんわ!
世間では徳丸試験といわれている、ウェブ・セキュリティ基礎試験に挑戦しようということで、いつものごとくアウトプットで記事にまとめていきます。
今回は第四回目のCORSについてまとめます。
CORS
CORS(Cross-Origin Resource Sharing、オリジン間リソース共有)は、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組みです。
異なるオリジン間の通信
CORSは、異なるオリジン間でリソースを共有するための仕組みです。これにより、ウェブページが自身と異なるオリジンのリソースを安全に取得することが可能になります。
同一生成元ポリシー(Same-Origin Policy)の緩和
ウェブの世界では、同一生成元ポリシー(SOP)が採用されており、ウェブページ中のスクリプトは同一のオリジンにあるリソースのみにアクセス可能で、別オリジンリソースへのアクセスはブラウザにより遮断されています。しかし、ウェブアプリケーションが複雑さを増す中で、オリジン間でリソースの共有をしたいという需要が高まりました。そのため、SOPを一部緩和し、CSRFへのリスクを回避しながらリソース共有を行うための仕組みとして、CORSの仕様化が2005年からスタートしました。
単純リクエストとプリフライトリクエスト
CORSには単純リクエストとプリフライトリクエストの2種類の仕様があります。単純リクエストの対象となるのはGET、HEAD、POSTメソッドで、一部のHeaderやContent-Typeが指定さたシンプルなリクエストのみです。一方、単純リクエスト以外のクロスオリジンリクエストはプリフライトリクエストとして扱われ、メインリクエストを送信する前にOPTIONSメソッドを使ったプリフライトをサーバに送信し、その後メインリクエストを送信します。
CORSとCookie
CORS仕様ではデフォルトでクロスサイトのリクエストにCookieを付与しません。Cookieを付与するにはクライアント側でXMLHttpRequestのwithCredentialsフラグをtrueにし、サーバ側でAccess-Control-Allow-Credentials: trueヘッダーを付与する必要があります。
プリフライトリクエスト
プリフライトリクエストは、特定のHTTPリクエストを送信する前に、ブラウザが自動的に送信するHTTPメソッドの一つです。これは、クロスオリジンリソース共有(CORS)の一部として機能し、実際のHTTPリクエストをサーバーに送信する前に、そのリクエストがサーバーによって許可されるかどうかを確認します。
具体的には、ブラウザはHTTP OPTIONSメソッドを使用してプリフライトリクエストを送信し、サーバーはそれに対して適切なCORSヘッダーを含むレスポンスを返します。これにより、ブラウザは実際のリクエストを安全に送信できるかどうかを判断します
プリフライトリクエストは、特に以下のような場合に送信されます
・HTTPメソッドがGETやPOST以外の場合
・HTTPヘッダーにカスタムヘッダーが含まれている場合
・Content-Typeがapplication/x-www-form-urlencoded、multipart/form-data、またはtext/plain以外の場合
またリクエストヘッダは下記があげられます
Origin
リクエストを送信するオリジン(プロトコル、ドメイン、ポート)を指定します。
Access-Control-Request-Method
実際のリクエストで使用するHTTPメソッドを指定します。
Access-Control-Request-Headers
実際のリクエストで使用するカスタムHTTPヘッダーをカンマ区切りで指定します。
ここまでです。
読んでいただきありがとうございました!