「same-site」と「same-origin」を理解する
「same-site」と「same-origin」は頻繁に引用されますが、誤解されることもよくあります。例えば、ページ切り替えコンテキスト、 fetch()リクエスト、Cookies、開くポップアップ、埋め込みリソース、iframeで言及されています。
オリジン #
「オリジン」は、スキーム(プロトコルとも呼ばれ、 HTTPやHTTPSなど)、ホスト名、およびポート(指定されている場合)の組み合わせです。たとえば、URLがhttps://www.example.com:443/foo場合、「origin」はhttps://www.example.com:443です。
「same-origin」と「cross-origin」 #
同じスキーム、ホスト名、ポートの組み合わせを持つWebサイトは、「同一オリジン」と見なされます。それ以外はすべて「オリジン間」と見なされます。
サイト #
.comや.orgなどのトップレベルドメイン(TLD)は、ルートゾーンデータベースにリストされています。上記の例では、「サイト」はTLDとその直前のドメインの一部の組み合わせです。 https://www.example.com:443/foo / fooのURLが与えられた場合、「サイト」はexample.comです。
しかし、.co.jpや.github.ioなどのドメインの.jpまたは.io TLDを使用するだけでは、「サイト」を識別できるほど正確ではありません。また、特定のTLDの登録可能ドメインのレベルをアルゴリズム的に決定する方法はありません。そのため、「有効なTLD」(eTLD)のリストが作成されました。これらは、Public Suffix Listで定義されています。 eTLDのリストは、publicsuffix.org/listで管理されています。
サイト名全体はeTLD + 1として知られています。たとえば、URLがhttps://my-project.github.io場合、eTLDは.github.ioあり、eTLD + 1はmy-project.github.ioであり、これは「サイト」と見なされます。つまり、eTLD + 1は有効なTLDであり、その直前のドメインの一部です。
「same-site」と「cross-site」 #
同じeTLD + 1を持つWebサイトは、「same-site」と見なされます。異なるeTLD + 1を持つWebサイトは、「cross-site」です。
「スキームフル same-site」 #
「same-site」の定義は、HTTPが脆弱なチャネルとして使用されないように、 URL スキームをサイトの一部として考慮するように展開されています。ブラウザがこの解釈に移行すると、古い定義を指す場合は「スキームレス same-site」、より厳しい定義を指す場合は「スキームフル same-site」という表記を目にすることがあります。その場合、スキームが一致しないためhttp://www.example.comとhttps://www.example.comはcross-siteと見なされます。
リクエストが「same-site」、「same-origin」、「cross-site」のいずれであるかを確認する方法 #
ChromeはSec-Fetch-Siteheaderでリクエストを送信します。 2020年4月の時点から、 Sec-Fetch-Siteをサポートするブラウザがありません。これは、より大きなFetch Metadata RequestHeaders提案の一部です。headerには、次のいずれかの値が含まれます。
cross-sitesame-sitesame-originnone
Sec-Fetch-Siteの値を調べることで、リクエストが「same-site」、「same-origin」、「cross-site」のいずれであるかを判断できます(「schemeful-same-site」は Sec-Fetch-Site でキャプチャされません)。