this Bugzilla thread (および also )からわかるように、Firefoxは常にPOSTリクエストでOriginヘッダーを送信しません。- RFC は、特定の未定義の「プライバシーに敏感な」コンテキストでは送信されるべきではないと述べています。Mozillaはそれらのコンテキストを定義しています here 。
これらがFirefoxがOriginヘッダーを送信しない唯一の状況であるかどうかを知りたいのですが。私が知る限り、クロスオリジンPOSTリクエストでは送信しません(ChromeおよびInternet Explorerはそうします))が、私はできますドキュメンテーションでそれを確認します。それは私が欠けているどこかに列挙されていますか?
仕様が必要とする限り、上記の質問はいくつかの回答に分割する必要があります:
null
としてシリアル化される値に設定する必要がある場合これについて(仕様とは異なる)Firefoxに必要なものが列挙されているとは思えません。しかし、spec要件を列挙する限り、ここでは、詳細を2つに分けて示します。
質問に対する答えブラウザーがOriginヘッダーを送信する必要があるのはいつですか?は次のとおりです:Origin
ヘッダーは、Fetch仕様で定義されているリクエストに対してのみ送信されます- CORSリクエスト :
CORSリクエストは、
Origin
ヘッダーを含むHTTPリクエストです。Origin
ヘッダーもメソッドがGET
でもHEAD
でもないすべてのリクエストに含まれているため、CORSプロトコルに参加しているとは確実に識別できません。
Fetch仕様の実際のステートメント は、メソッドがOrigin
でもGET
でもないすべてのリクエストに対してHEAD
ヘッダーを送信するようブラウザーに要求します:
CORSフラグが設定されているか、httpRequestのメソッドが
GET
でもHEAD
でもない場合、Origin
/httpRequestのOriginをhttpRequestのヘッダーリストにシリアル化してUTF-8でエンコードして追加します。
そのため、ブラウザはallOrigin
リクエストに対してPOST
を送信する必要があります。これには、同じ起源のPOST
s(Fetchの定義により)実際には「CORSリクエスト」です(たとえそれらが同じ起源であっても)。
注:上記は、2016-12の仕様に加えられた 変更により、Fetch仕様が現在どのように要件を定義するかを説明しています-09 。それまでは、要件は異なりました。
Origin
は送信されませんでしたOrigin
はクロスオリジンに送信されませんでしたPOST <form>
から(CORSなしで)そのため、質問で説明されているFirefoxの動作は、仕様以前に必要なものに準拠していますが、仕様現在必要なものには準拠していないと思います。
ブラウザーがOrigin
ヘッダーを送信する必要がある他のケースは、「CORSフラグ」を設定してリクエストが作成された場合で、HTTP(S)リクエストは exceptリクエストモードがnavigate
、websocket
、same-Origin
、またはno-cors
の場合 。
XHRalwaysは、モードをcors
に設定します。ただし、Fetch APIでは、これらのリクエストモードは、fetch(…)
メソッドのinit-object引数のmode
フィールドで設定できるものです。
fetch("http://example.com", { mode: 'no-cors' }) // no Origin will be sent
それに加えて、 a crossorigin
属性 (aka“ CORS設定属性)を含む要素の場合、HTML仕様ではブラウザで設定する必要がありますcors
への要求モード(およびOrigin
ヘッダーを送信するため)。
それ以外の場合、リクエストを開始するURLを持つ属性を持つ要素(<script src>
、スタイルシート、画像、メディア要素)の場合、リクエストのモードはデフォルトでno-cors
になり、Origin
ヘッダーは送信されません。
以上が、ブラウザーがOrigin
ヘッダーを送信する条件の詳細です。
答えの次の部分は、Origin値がいつnull
に設定されるかについてです。
null
としてシリアル化される値に設定する必要がある場合ブラウザーがOrigin
ヘッダーを送信する必要がある場合の要件とは別に、ブラウザーがOriginをnull
に設定する必要がある場合の要件は次の仕様で定義されています。
HTML仕様では opaque Origin という用語を使用しており、次のように述べています。
シリアライゼーションなしで再作成できる内部値(ASCII Originのシリアライゼーションごとに「null」としてシリアライズされます)。意味のある操作は等価性のテストのみです。
つまり、HTML仕様で不透明なOriginと記述されているところならどこでも、それをnull
に変換できます。
次の場合、HTML仕様では、ブラウザに不透明なOriginまたは一意のOriginを設定する必要があります。
img
要素を含む)video
およびaudio
要素を含む)data:
URLから生成された任意のドキュメントiframe
with the sandbox
attribute that does not include the value allow-same-Origin
createDocument()
などを使用してプログラムで作成されたドキュメントFetch仕様では、ブラウザにOriginを「グローバルに一意の識別子」(基本的には「不透明なOrigin」と同じ意味であり、基本的にはnull
…を意味する)に設定する必要があります。
次の場合、URL仕様ではブラウザに不透明なOriginを設定する必要があります。
ただし、ブラウザが内部的に不透明なOrigin(基本的にはnull
)を設定したからといって、必ずしもブラウザがOrigin
ヘッダーを送信するわけではないことを理解することが重要です。したがって、ブラウザがOrigin
ヘッダーを送信する必要がある場合の詳細については、この回答の最初の部分を参照してください。