「same-site」と「same-origin」を理解する

Eiji Kitamura
Eiji Kitamura

「same-site」と「same-origin」は頻繁に引用されていますが、用語は誤解されがちです。たとえば、ページ遷移、fetch() リクエスト、Cookie、ポップアップの表示、埋め込みリソース、iframe のコンテキストで言及されています。

原点

原点

「送信元」は、スキームHTTPHTTPS などプロトコルとも呼ばれる)、ホスト名ポート(指定されている場合)を組み合わせたものです。たとえば、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)に一致

サイト

サイト(TLD+1)

.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 の「サイト」とみなされます。

サイト(eTLD+1)

「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.comhttps://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」のいずれであるかを判別できます。