「same-site」と「same-origin」は頻繁に引用されていますが、用語は誤解されがちです。たとえば、ページ遷移、fetch()
リクエスト、Cookie、ポップアップの表示、埋め込みリソース、iframe のコンテキストで言及されています。
原点
「送信元」は、スキーム(HTTP や HTTPS などプロトコルとも呼ばれる)、ホスト名、ポート(指定されている場合)を組み合わせたものです。たとえば、URL が https://www.example.com:443/foo
の場合、「origin」は https://www.example.com:443
です。
「same-origin」と「cross-origin」
同じスキーム、ホスト名、ポートの組み合わせを持つウェブサイトは「同一オリジン」とみなされます。それ以外はすべて「クロスオリジン」と見なされます。
オリジン A | オリジン B | オリジン A とオリジン B が「同一オリジン」か「クロスオリジン」かの説明 |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | クロスオリジン: 異なるドメイン |
https://example.com:443 | クロスオリジン: 異なるサブドメイン | |
https://login.example.com:443 | クロスオリジン: 異なるサブドメイン | |
http://www.example.com:443 | クロスオリジン: さまざまなスキーム | |
https://www.example.com:80 | クロスオリジン: 異なるポート | |
https://www.example.com:443 | same-origin: 完全一致 | |
https://www.example.com | same-origin: 暗黙的なポート番号(443)に一致 |
サイト
.com
や .org
などのトップレベル ドメイン(TLD)は、ルートゾーン データベースにリストされています。上記の例では、「サイト」はスキーム、TLD、およびその直前のドメインの一部(ここでは TLD+1 と呼びます)を組み合わせたものです。たとえば、URL が https://www.example.com:443/foo
の場合、「サイト」は https://example.com
です。
パブリック サフィックス リストと eTLD
.co.jp
や .github.io
などを含むドメインの場合、.jp
や .io
を使用するだけでは「サイト」を特定できるほど詳細ではありません。特定の TLD の登録可能なドメインのレベルをアルゴリズムによって判断する方法はありません。そのため、パブリック サフィックス リストで定義されているパブリック サフィックスのリストを作成しました。このようなパブリック サフィックスは、有効な TLD(eTLD)とも呼ばれます。eTLD のリストは publicsuffix.org/list で管理されています。
eTLD を含むドメインの「サイト」部分を識別するには、.com
の例と同じ方法を適用します。たとえば https://www.project.github.io:443/foo
の場合、スキームは https
、eTLD は .github.io
、eTLD+1 は project.github.io
であるため、https://project.github.io
はこの URL の「サイト」とみなされます。
「same-site」と「cross-site」
スキームが同じで eTLD+1 も同じウェブサイトは「同一サイト」と見なされます。スキームや eTLD+1 が異なるウェブサイトは「クロスサイト」です。
オリジン A | オリジン B | オリジン A とオリジン B が「同一サイト」か「クロスサイト」かの説明 |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | クロスサイト: 異なるドメイン |
https://login.example.com:443 | same-site: 異なるサブドメインは関係なし | |
http://www.example.com:443 | クロスサイト: さまざまなスキーム | |
https://www.example.com:80 | same-site: 異なるポートは関係なし | |
https://www.example.com:443 | same-site: 完全一致 | |
https://www.example.com | same-site: ポートの指定は不要 |
「スキームのない同一サイト」
「same-site」の定義は、HTTP が脆弱なチャネルとして使用されることを防ぐために、URL スキームをサイトの一部として考えるように進化しました。スキーム比較のない以前の「同一サイト」のコンセプトは、「スキームレス同一サイト」と呼ばれるようになりました。たとえば、http://www.example.com
と https://www.example.com
は、eTLD+1 の部分のみが重要であり、スキームが考慮されないため、スキームのない同一サイトと見なされます。
オリジン A | オリジン B | オリジン A とオリジン B が「スキームのない同一サイト」かどうかの説明 |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | クロスサイト: 異なるドメイン |
https://login.example.com:443 | スキームのない同一サイト: 異なるサブドメインは関係なし | |
http://www.example.com:443 | スキームのない同一サイト: 異なるスキームは重要ではない | |
https://www.example.com:80 | スキームのない同一サイト: 異なるポートは関係ありません | |
https://www.example.com:443 | schemeless same-site: 完全一致 | |
https://www.example.com | スキームのない同一サイト: ポートは関係なし |
リクエストが「same-site」、「same-origin」、「cross-site」のいずれであるかを確認する方法
最新のブラウザ(Safari ではまもなくリリース)は、Sec-Fetch-Site
HTTP ヘッダーとともにリクエストを送信します。ヘッダーは次のいずれかの値を持ちます。
cross-site
same-site
same-origin
none
Sec-Fetch-Site
の値を調べると、リクエストが「same-site」、「same-origin」、「cross-site」のいずれであるかを判別できます。