localhostとは?ループバック、127.0.0.1と::1
localhostは通常、リクエストを送っているマシン自身を指します。よく知られたアドレスは、IPv4の127.0.0.1とIPv6の::1です。これらへの通信は、家庭用ルーターを経由してインターネットに出ていくのではなく、そのマシンのネットワークスタックの中で処理されます。そのため、localhostでのテストでわかるのは「サービスがローカルで動くかどうか」という限られた点だけです。
ループバックアドレスの範囲
IPv4では127.0.0.0/8のブロック全体がループバック用に予約されていますが、例ではほぼ必ず127.0.0.1が使われます。IPv6には::1/128という特別なアドレスがあります。これらの役割はRFC 1122とRFC 4291に記載されています。localhostという名前は、通常はローカルのシステム設定によってこれらのアドレスに解決されます。アプリケーションによってIPv4とIPv6のどちらを先に試すかが異なるため、片方で成功してもう片方で失敗しても、ネットワーク全体が壊れているとは限りません。
ローカルWebサーバーの例
開発者が127.0.0.1:8000で待ち受けるアプリケーションを起動し、同じコンピューターでhttp://localhost:8000を開くとします。これなら、アプリケーションをほかの機器に公開せずにテストできて便利です。同じWi-Fiにつながったスマートフォンでlocalhost:8000を開くと、スマートフォンは開発者のコンピューターではなく自分自身に接続しようとします。スマートフォンからアプリケーションにアクセスするには、サービスが適切なネットワークインターフェースで待ち受け、ファイアウォールが接続を許可し、スマートフォン側でコンピューターのLANアドレスを使う必要があります。適切な保護をせずに、開発用サーバーを広くインターネットに公開してはいけません。
待ち受けアドレスと外部からのアクセス
127.0.0.1や::1にだけバインドされたサービスには、ほかの機器から直接アクセスできません。IPv4で0.0.0.0にバインドすると、一般には該当するすべてのIPv4インターフェースで待ち受けることになりますが、それでも外部からアクセスできるとは限りません。ファイアウォール、コンテナ、NAT、プロバイダーのルールが経路を遮っていることがあるからです。IPv6で同様の動作になるかは、アプリケーションとシステムの設定によります。インターネット側からのポートチェックでは、ループバックにしかバインドされていないサービスがローカルで正常に動いているかは確認できません。まずローカルでテストし、その後でネットワークの境界ごとに個別にテストしましょう。
コンテナやサーバーでよくある間違い
コンテナの中やリモートのサーバー上では、localhostは手元のノートパソコンではなく、そのコンテナやサーバー自身を指します。そのため、localhostを指すデータベースの接続文字列は、ローカルでの開発中は動いても、データベースが別のマシンにある環境へデプロイした後で失敗することがあります。原因を調べるときは、クライアントがどこで動いているかを特定してから、接続先のホスト名、ポート、サービスが待ち受けているアドレスを確認します。外部への露出を検討せずに、localhostをパブリックIPに置き換えてはいけません。内部の通信には、プライベートなネットワークアドレスや、サービス専用のホスト名を使うのが適していることが多いでしょう。