社内のslackでこのXの投稿が話題になっていました。
ということで調べてみたら面白かったのでさらっと共有します。
手元のMac (Sonoma) で試してみる
localhostにhttpサーバーをたちあげ、各種ブラウザで test.localhsotでアクセスできるか試してみました。
- Chrome、Firefox、Chronium、curlはlocalhostにサブドメインをつけてアクセス可能でした
- Safariは名前解決ができないとエラーになりました
- http以外のプロトコルを利用するping/ssh コマンドも試してみましたが、これらはアクセス不能(名前解決しにいってる)でした
ということで、OSではなくアプリケーション側でlocalhostとそのサブドメインはDNS(/etc/hostsも)を参照しない動作をしているようでした。
Chronium系かとおもったのですが、curlもそうでした。ただSafariはちがうんですよね。
なぜ?
ちょっと調べてみたところ、chroniumで10年前の2015年くらいに話題になっていました。
stackoverflow Chrome がローカルホストのサブドメインのホストファイルを無視する
Chroniumのバグ報告 .localhostはhostsファイルを使用しません
結局意図した変更ということで /etc/hostsや、DNSの問い合わせを偽造して、localhostの通信を外部にされたくないという意図と理解しました。
いまどき、HTTPSが標準なので偽造しても証明書エラーになるから意味ないのでは? という気もしますが、2015年当時だとhttpsをデフォルトにするという強制はまだなかったはずなので安全側に倒したということなんでしょう。
RFC6761 の 6.3. Domain Name Reservation Considerations for “localhost.” にも名前解決させないようにするという記載があります。
でも、そうなるとOSレベルで実装するのがただしくて、pingやsshで名前解決をしてしまうのもRFC違反ということになります。
ちょっとモヤモヤする結果なのですが、なかなか歴史のある現象でしたので書いてみました。
ではでは。