CORSドメイン間preflightリクエスト

2557 ワード

Access-Control-Allow-Originレスポンスヘッダフィールドを使用すると、非単純なリクエストに対してCORSメカニズムがドメイン間でpreflight(OPTIONSリクエスト)を最初に行い、このリクエストが成功した後に真のリクエストを送信することができることを知っています.この設計は、サーバがCORS規格について知っていることを確保し、CORSをサポートしていない古いサーバを保護することを目的としています.
Wikipedia: https://upload.wikimedia.org/wikipedia/commons/c/ca/Flowchart_showing_Simple_and_Preflight_XHR.svg
単純なリクエスト
単純要求とは、具体的には、要求メソッドが単純メソッドであり、要求ヘッダが単純ヘッダであるHTTP要求をいう.具体的には、
  • 簡単な方法はGET,HEAD,POST|を含む.
  • 単純ヘッダは、Accept,Accept-Language,Content-Language,およびapplication/x-www-form-urlencoded,multipart/form-data,text/plainのいずれかの値を有するContent-Typeヘッダを含む.

  • 非単純リクエストブラウザでは、カスタムヘッダx-fooのHTTPリクエストを追加するなど、OPTIONSリクエストが最初に送信されます.
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.setRequestHeader('x-foo', 'bar');
    xhr.send();
    

    サーバは、成功した応答(2 xx)を必要とし、Access-Control-Alow-Headersx-fooを含める必要があります(単純なヘッダではないため).
    OPTIONS /origin-redirect-with-preflight 200
    Access-Control-Allow-Headers:x-foo
    Access-Control-Allow-Origin:http://index.com:4001
    Connection:keep-alive
    Content-Length:0
    

    Access-Control-Request-Headers
    Access-Clontrol-Request-Headersは、preflightリクエストに実際のリクエストに含まれるヘッダフィールドを識別するために使用され、preflightリクエスト自体はこれらのヘッダフィールドを送信しません.例えば、上記の要求におけるAccess-Control-Request-Headersフィールドの値はx-fooであるべきである.これらのフィールドは、対応するAccess-Control-Allow-Headers応答ヘッダに含まれるべきである.200 preflightを返しても失敗します.
    XMLHttpRequest cannot load http://mid.com:4001/access-control-allow-origin-wildcard.
    Request header field x-foo is not allowed by Access-Control-Allow-Headers in preflight response.
    

    DNTリクエストヘッダについて
    Safariステルスモードなどの一部のブラウザでは、要求にDNTヘッダが追加されますが、ブラウザはpreflightを開始しません.このリクエストヘッダはブラウザが追加したものであるため、これについても知るべきである.従って、応答ヘッダにAccess-Control-Allow-Headersを含める必要はなく、W 3 C Recommendationを参照して、以下の条件を満たすとpreflightをスキップすることができる.
    For request method there either is a method cache match or it is a simple method and the force preflight flag is unset. For every header of author request headers there either is a header cache match for the field name or it is a simple header.
    注意:すべてのAuthor Headerが単純ヘッダであればスキップできます.ここでのDNTは単純ヘッダではありませんが、User-Agent Headerに属します.CORSがリダイレクトされた後、この状況は複雑になることに注意し、リダイレクトCORSのドメイン間要求については、より詳細な議論がある.