ウェブを閲覧する際、私たちはしばしばサブドメインを使用してサービスの内容を区別します。例えば:
- music.youtube.com/ → YouTube Musicにアクセス
- youtube.com → https://www.youtube.com/ → YouTubeにアクセス
明らかに、ドメイン名がyoutube.comであるため、これら2つのドメインはYouTubeによって所有されていることがすぐにわかります。そのため、中のコンテンツを信頼して安心して閲覧できます。では、2つのドメインが同じ所有者に属しているかどうかを判断するにはどうすればよいでしょうか?URLにyoutube.comの文字列が含まれているかどうかで判断するのでしょうか?
明らかに、これは有効な区別方法ではありません。例えば:
- youtube.kalan.dev
- youtube.com.kalan.dev
これらの2つのサブドメインは、youtubeという文字列を含んでいますが、すぐにわかりますが、これらはYouTubeが所有するドメインではありません。
したがって、サブドメインの判別方法は右から左に探していくべきであり、左から右ではありません。ソフトウェアエンジニアにとっては、サブドメインを判別するのは簡単ですが、ドメインの動作メカニズムを理解していない人々にとっては、サブドメインを使用したフィッシングは罠に陥りやすいものです。
次の問題は、右から左に何個の部分を探すべきかということですか?blog.kalan.dev
という例を考えましょう。ドメイン名はkalan.dev
であり、次のようにコードを書くことができます:
const host = 'blog.kalan.dev'.split('.').reverse().slice(0, 2).reverse().join('.')
しかし、これは正しい書き方ではありません。例えば:
- ebay:www.ebay.co.uk
- google:www.google.co.uk
先ほどの書き方で見ると、co.ukはドメイン名であり、www.ebayとwww.googleはサブドメインであり、したがって2つのウェブサイトは.co.ukに属しているということになるでしょうか?明らかに、このような区別は間違っています。ebayはebayであり、googleはgoogleであり、これら2つのドメインはまったく異なる会社によって所有されています。これは、国コードトップレベルドメインが二次ドメインと組み合わさる場合、それらも独立したドメイン名として使用されるためです。したがって、ここでは正しい解析方法は、google.co.uk
とebay.co.uk
を2つの独立したホストとして扱い、所有者もまったく異なるということです。
TLD(トップレベルドメイン)
トップレベルドメイン(TLD)について話しましょう。例えば、.io
、.dev
1、.org
などのサフィックスは、ICANNが管理しており、誰でも独自のドメインを申請できます。例えば、私のkalan.dev
は.dev
をサフィックスとして使用したドメインです。
ccTLD(国コードトップレベルドメイン)
地域に応じて使用できる対応するトップレベルドメインもあります。例えば、.tw
や.jp
です。注意すべきは、一部の国コードが他のセカンドレベルドメインと組み合わさると、それらも独立したドメインを形成する場合があるということです。例えば:
これら2つのウェブサイトでは、momoshop.com.twとbooks.com.twがドメイン名であり、www.momoshop.com.twとwww.books.com.twがそれぞれのサブドメインです。
eTLD(有効トップレベルドメイン)
上記の例からわかるように、一部のトップレベルドメインはセカンドレベルドメインと組み合わさってドメイン名を形成することができます(例:kalan.dev
)。一方、他のトップレベルドメインは2つのドメインが結合してトップレベルドメインを形成します(.com.tw
)。ブラウザはこれをどのように解析するのでしょうか?その背後にある概念は、広範なPublic Suffix List(PSL)リストを維持することです。リストに記載されているドメイン名は、有効なトップレベルドメイン(eTLD)と呼ばれます。リストはこちらで入手できます。
もう1つの一般的な用語は、eTLD+1です。これは、有効なトップレベルドメイン+セカンドレベルドメインがドメインを形成することを意味します。この例では、.com.tw
が有効なトップレベルドメインであり、momoshopがセカンドレベルドメインです。
SameSiteがフロントエンドアプリケーションに与える影響
ドメインの動作メカニズムがフロントエンドにとって最も重要な意味を持つのは、SameSite2の判定です。2つのウェブサイトがSameSiteであるかどうかを知りたいですが、SameSiteの場合、ウェブサイトのCookieが共有される(特別なヘッダーが設定されていない場合)からです。
したがって、2つのウェブサイトのURL、kalan.hacker.com
とjack.hacker.com
がSameSiteであるかどうかを教えてください。最初に思い浮かぶのは、これら2つのURLはhacker.com
のサブドメインのように見えますが、先ほどの例と説明を読んだ後は、hacker.com
がpublic suffix listに含まれているかどうかを確認する必要があります。
CookieとSameSiteに関する議論に興味がある場合は、以前に書いた記事CookieとCORSの再考も参考にしてください。
GitHubを例に挙げる
GitHubでは、リポジトリの設定によって無料でxxx.github.io
のドメインを生成することができます。例えば、私の古いブログ:kjj6198.github.io/blog
です。このような場合、xxx.github.io
のCookieが相互にアクセスできないようにしたくありません。このタイプのアプリケーションでは、各xxx.github.io
が.github.io
のサブドメインではなく、独立したドメインであることを望んでいます。eTLDを使用することで、この問題を効果的に解決できます。また、public suffix listを確認すると、.github.io
が存在することも確認できます。
Public Suffix Listは誰が申請できますか?
publicsuffixの公式ドキュメントを見る限り、公式のガイドラインに従ってPRを送るだけで申請できます。ただし、全体のプロセスは時間がかかるようで、過去のPRを見る限り、すべて手動で審査されているようです。
ブラウザのアドレスバーについて
私のblog.kalan.dev
は、FirefoxとEdgeのアドレスバー上で上記のように表示されます。上の画像はFirefoxの表示で、下の画像はEdgeの表示です。
違いに気づきましたか?Edgeでは、blog
のテキストの色がkalan.dev
と同じ色ですが、Firefoxではblog
のテキストが少し薄くなっています。Firefoxのアドレスバーは、ドメイン名の色を強調しますが、EdgeとChromeはドメイン部分(サブドメインを含む)も強調します。この例では、Firefoxのアドレスバーを使用すると、blog
がkalan.devのサブドメインであることがすぐにわかります。
この違いは非常に小さいですが、eTLDが含まれている場合、Firefoxのアドレスバーの機能は非常に便利です。例えば、.github.io
がeTLDであるため、kjj6198.github.io
全体がドメインとなります。
次回、誰かが2つのドメインがSameSiteであるかどうか尋ねた場合は、Firefoxを開いてURLを入力し、強調表示される部分が同じかどうかを確認すると良いでしょう。同じ場合、私たちは自信を持ってSameSiteであると言えます!