なぜ Origin が必要なのでしょう?
重要性: 5
恐らくご存知の通り、HTTP ヘッダには Referer
があります。これは通常、ネットワークリクエストを開始したページの URL が含まれています。
例えば、http://javascript.info/some/url
から http://google.com
を取得しようとすると、そのヘッダは次のようになります。:
Accept: */*
Accept-Charset: utf-8
Accept-Encoding: gzip,deflate,sdch
Connection: keep-alive
Host: google.com
Origin: http://javascript.info
Referer: http://javascript.info/some/url
ご覧の通り、Referer
と Origin
両方が存在します。
ここで質問です:
Referer
がより多くの情報を持っているのに、なぜOrigin
が必要なのでしょうか。Referer
やOrigin
がない、あるいはそれが正しくない可能性はありますか?
Origin
は必要です。なぜなら、Referer
はない場合があるからです。例えば、HTTPS で HTTP のページを fetch
するとき(よりセキュアな場所からセキュアでない場所へアクセスするとき)、Referer
はありません。
コンテンツセキュリティポリシー(Content Security Policy: CSP) は Referer
を送信するのを禁止する可能性があります。
後ほど分かりますが、fetch
にも Referer
の送信を防いだり、それを変更することを許可する(同じサイト内で)オプションがあります。
仕様によると、Referer
はオプションの HTTP ヘッダです。
Referer
は信頼できないため、Origin
が発明されました。ブラウザはクロスオリジンリクエストのために、正しい Origin
を保証します。