TIL 26. What is CORS?
Today's topic
今回のpostではCORSについて議論します.Djangoを使用してAPIを作成し、初期設定を行うたびに
pip install django-cors-headers
django-cors-headersをインストールして設定します.py fileで関連コンテンツをアップロードして開始しました.なぜ毎回cors-headersをインストールするのか知りたいので調べて、投稿に整理したいです.👉 What is CORS?
CROSS-Origin Resource Sharing(COS)は、追加のHTTPヘッダ通知ブラウザを使用して、あるソースで実行されるWebアプリケーションが別のソースから選択されたリソースにアクセスできるようにするメカニズムです.
👉 What is"Origin"?
Origin(ソース)は、プロトコル、host、portを含むことを意味します.
ex) https://www.google.com/search?q=cors
プロトコル、host、port(:443)-非表示
同じソース(ison-origin)は、プロトコル、host、portが同じであることを意味します.
👉 What is 'SOP(same-origin policy)'?
その上で、SOPというルールがあります.これは、同じソース(origin)でしかリソースを共有できないルールです.ブラウザが他のサーバから要求した場合、このポリシーはブラウザを介してサーバ間で通信しない場合に適用されません.
👉 Why is SOP necessary?
最大の原因は警備側の原因です.これらの制限がない場合、他のソースからの悪意のあるユーザは、ソースコードを表示し、CSRFまたはXSSなどの方法を使用して情報を取得することができる.これを防ぐために、SOPのようなルールがあります.
しかし、異なるソースからリソースを必要とする場合が多くなり、この場合、CORSをSOPを迂回することによって異なるソースからリソースを要求する.
👉 Principle of CORS?
Webクライアントアプリケーションが他のソースからのリソースを要求すると、HTTPプロトコルを使用して要求が送信され、ブラウザは要求ヘッダでOriginというフィールドに要求を送信し、要求をソースに送信します.
ex) Origin : http://www.google.com
その後、サーバが要求に応答すると、応答ヘッダのアクセス制御Allow-Origin値は「このリソースへのアクセスを許可するソース」を低下させる.その後、応答を受信したブラウザは、自身が発行した要求のOriginと、サーバが発行した応答のAccess-Clontrol-Allow-Originとを比較して、応答が有効かどうかを判断する.
基本的にはこのような流れであるが,3つの異なるCORSアクセス制御スキーム(ソースリソースを交差して共有する動作方式)があり,いずれの場合もスキームに従って調整される.
Requestには3種類あり、各リクエストについて詳しく説明します.
👉 Preflight request
Preflight Requestは、プリリクエストと本リクエストに分けられます.まず,OPTIONS法によりHTTP要求を別のドメインのリソースに送信し,実際の要求が伝送時に安全であることを確保する.Cross-originリクエストは、ユーザデータに影響を与えるため、予め送信される(prefired).
OPTIONSリクエストは、2つの異なるリクエストヘッダを同時に送信する.上図では、フライト前に要求された「アクセス制御要求方法」は、実際の要求が送信されたときにPOST方法に送信され、「アクセス制御要求Headers」は、実際の要求が送信されたときにX-PINGOTHERおよびContent-Type Aカスタムヘッダとともにサーバに送信される.
サーバから受信方法とタイトルが表示されます.上記のPreflightレスポンスは、「Post」と「GET」が有用な方法であることを教えてくれます.最後の行はpreflightリクエストに対する応答をキャッシュできる秒数です.
Preflight requestを送信すると、プリリクエストが2回と実際のリクエストが2回発行されるため、ブラウザが同じリクエストをキャッシュして送信すると、プリリクエストは発行されず、すぐにこのリクエストが発行されます.
Preflightリクエストが完了すると、実際のリクエストが送信されます.
Preflightでは、重要なのは「Access Control Allow-Origin」であり、この値をヘッダ内でチェックすることでBrowserがCORS運転状態にあるかどうかを判断します.
👉 Simple request
Simple Requestは、Preflight Requestとは異なり、リクエストを送信するとすぐにクロスソースであるかどうかを確認しますが、以下のすべての条件を満たす必要があります.
Simple Request(Simple Request)とは、スタンバイリクエストを送信しない場合に、本リクエストをサーバに直接送信し、アクセス制御Allow-Originと同じ値を応答ヘアに送信し、ブラウザがCORSルールに違反しているかどうかをチェックする方法である.すなわち、preflightとsimple requestスキームの全体的な論理自体は同じであり、preflightリクエストの存在の有無のみが異なる.
👉 Credentialed request
第3の態様は、認証情報を含む要求である.他の方法よりもセキュリティを強化したい場合は、使用できます.
ブラウザが提供する非同期リソース要求API XMLHttpRequestオブジェクトまたはfetch APIには、ブラウザのCookie情報または認証に関連するヘッダがほとんど含まれていないため、個別のcrudtialオプションを指定する必要があります.
リソース要求で認証情報を含むオプションを使用する場合、ブラウザはアクセス制御-すべてのOriginだけでなく、他のソースのリソースを要求するときに追加のチェックを行います.
要求に検証情報が含まれている場合、ブラウザは、他のソースからのリソースを要求すると、CORSルールに違反しているかどうかを確認するルールに次の2つを追加します.
1.Access Control Allow-Originに*は含まれません.明示的なURLでなければなりません.
2.応答ヘッダには、アクセス制御のすべての認証情報が含まれている必要があります:true
📖 ソース:
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
https://evan-moon.github.io/2020/05/21/about-cors/
My opinion
この記事では、初期設定時に「django-cors-headers」をインストールする理由とcorsの重要性について説明します.知れば知るほど知りたくなる世界.
Reference
この問題について(TIL 26. What is CORS?), 我々は、より多くの情報をここで見つけました https://velog.io/@yg910524/TIL-24.-What-is-CORSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol