導入
ブラウザーの同一生成元ポリシーとは、要求アドレスが要求元と一致しない要求への応答を制限するポリシーを指します。つまり、クロスオリジン要求に対するサーバーの応答がブラウザーの同一生成元ポリシー仕様に準拠していない場合、ブラウザは応答コンテンツを表示しません。
2 つの URL のprotocol、hosts、およびport 番号のいずれかが異なる限り、それらは異なるソースと見なされます。
これには非常に重要な点が含まれます。つまり、送信したクロスオリジン リクエストはサーバーに到達しませんでしたが、ブラウザは、サーバーから返されたレスポンス ヘッダーの関連フィールドに従って、レスポンス コンテンツを表示するかどうかを決定します。
CORS関連のフィールドについては、この記事Cross-Origin Resource Sharing CORS の詳細な説明を参照してください。この記事では、CORS 関連のフィールドがブラウザーでの CORS リクエストの成功にどのように影響するかを詳しく紹介しています。
GET、POST、およびHEADメソッドについては、応答ヘッダーのAccess-Control-Allow-Methodsにそれらが含まれていなくても、Access-Control-Allow-Originフィールドがrequest 、これも予算と見なされます。チェック リクエストは成功しました。GET、POST、および HEADの 3 つの値がAccess-Control-Allow-Methodsのデフォルト値であり、Access-Control-Allow-Methodsフィールドを設定することは、許可されるメソッドをさらに追加することであることがわかります。.
ブラウザーは、このようなクロスオリジン リクエスト (CORS) を単純なリクエストと複雑なリクエストの 2 つのカテゴリに分類します。
簡単なリクエスト
単純なリクエストの定義については、MDN ドキュメントを参照してください。要件を満たさないものは複雑なリクエストと見なされます。
違い
この 2 つの違いは、複雑なリクエストが送信される前にプリフライト リクエスト (プリフライト)が送信されないことです。プリフライト リクエストの目的は、ブラウザが一部の CORS を成功させないにもかかわらず、実際にサーバーにリクエストしたことです。プリフライト リクエストがない場合、サーバーへの CORS リクエストが削除される可能性があり、正常に影響を受けますが、同一生成元ポリシーにより、ブラウザーは応答の結果を返しません。したがって、実際のCORS を送信する前に、一般的なブラウザは事前チェック要求を送信して、サーバーがクロスオリジンを許可するかどうかを尋ねます。そうでない場合は、サーバーのデータに影響を与えないように、実際の要求を送信しません。
最新の Chrome バージョンでは、単純なリクエストであっても、アクセスするアドレスがプライベート ネットワークの場合、最初にプリフライト リクエストを開始することに注意してください。
このドキュメントでは、パブリック ネットワーク内の LAN へのアクセスや、LAN 内のローカル ネットワーク (localhost) へのアクセスなど、いつプライベート ネットワークにアクセスするかを指定します。
プライベート ネットワークへのアクセスもプリフライト リクエストを送信する必要がある理由については、この場合、 DNS リバインディング攻撃が発生する可能性があるためです。この記事は、DNS リバインディング攻撃の原理を紹介するのに適しています: DNS リバインディング攻撃の詳細な説明。
しかし、実際には、よく考えてみると、プリフライト リクエストは必要ないように思えます。サーバーは CORS リクエストの送信元に基づいて、リクエストに応答するかどうかを完全に判断できるため、リクエストが要件を満たしていない場合は、直接拒否することができます. ブラウザが事前チェックリクエストを送信する必要はありません.初め。これは実際にそうです。すでにCORS に対する保護を備えているサーバーの場合、プリフライト リクエストは確かに冗長ですが、ブラウザーの同一生成元ポリシーは後で登場し、それ以前のサーバーは CORS を防止せず、意図的にリクエストの送信元を区別しませんでしたが、それらすべてに応答すると、実際に上記の状況が発生するため、ブラウザはこのタイプのサーバーを保護するためにさまざまな制限を課します. これが、ブラウザーの同一生成元ポリシーが紳士協定であり、ブラウザー側でのみ有効であると言われる理由です。
この投稿をご覧ください:なぜプリフライト リクエストを導入するのですか?
HTML タグのクロスドメイン
form フォーム、a タグ、 img タグなど、多くの HTML タグはリクエストを送信できますが、スクリプト タグを使用してクロスオリジン ポリシーの影響を受けないようにするJSONPなど、制限されないものもあります。
物質
この質問への答えは非常に良いと思います:フォームフォームの送信ではクロスドメインの問題がないのに、ajax の送信ではクロスドメインの問題があるのはなぜですか?
あるドメイン名の JS は、別のドメイン名のコンテンツを許可なく読み取ることはできません。ただし、ブラウザは別のドメイン名へのリクエストの送信を妨げません。