web-dev-qa-db-ja.com

Chrome Originヘッダーをsame-Originリクエストに追加する

ローカルで実行しているサーバーにAJAXリクエストをPOSTしています。つまり、.

xhr.open("POST", "http://localhost:9000/context/request");
xhr.addHeader(someCustomHeaders);
xhr.send(someData);

このJavaScriptが実行されているページは、localhost:9000からも提供されています。つまり、これは完全に同じ元のリクエストのように見えます。

ただし、なんらかの理由で、Google Chrome=は常に結果のリクエストにOriginヘッダーを設定するため、サーバーはCORSリクエストであるという誤った仮定に基づいてリクエストをブロックします。

これはFirefoxでは発生しません。

また、FirefoxもChrome=もOPTIONSプリフライトリクエストを送信していないため、混乱を招きます。Originヘッダーとカスタムヘッダーがサーバーで許可されていることを確認するために、最初のプリフライトなしでOriginヘッダーを設定するのはなぜですか。

このケースで何が起こっているのか誰か知っていますか? CORS仕様を誤解していますか?

18
jan groth

ChromeとSafariは、同一の元のPOST/PUT/DELETEリクエストにOriginヘッダーを含めます(同じ元のGETリクエストにはOriginヘッダーがありません)。 Firefoxは、同一オリジンリクエストにOriginヘッダーを含めません。ブラウザーは、同じ起源の要求でCORS応答ヘッダーを期待しないため、CORSヘッダーがあるかどうかに関係なく、同じ起源の要求に対する応答がユーザーに送信されます。

Hostヘッダーを確認することをお勧めします。Originヘッダーのドメインと一致する場合は、リクエストをCORSとして処理しないでください。ヘッダーは次のようになります。

Host: example.com
Origin: http://example.com

Originにはスキーム(http/https)、ドメイン、およびポートが含まれ、Hostにはドメインとポートのみが含まれることに注意してください。

28
monsur

RFC 6454-によると、Web Origin Concept-Originの存在same-Originリクエストを含むすべてのHTTPリクエストに対して実際に合法です:

http://tools.ietf.org/html/rfc6454#section-7.

「ユーザーエージェントは、HTTPリクエストにOriginヘッダーフィールドを含めることができます。」

14