待受アドレスとは、サーバーアプリが「どのIPアドレス宛の通信を受け付けるか」を決める設定です。開発中の localhost と 0.0.0.0 の違いは、ここで重要になります。
一言でいうと
localhost は自分自身だけ、0.0.0.0 はその機器が持つ全IPv4アドレスで待ち受ける指定として使われます。
まず比較
| 表記 | 主な意味 | よく使う場面 |
|---|---|---|
localhost | 自分自身を指す名前 | 自分のPC内で開発サーバーを見る |
127.0.0.1 | IPv4のループバックアドレス | 自分自身への接続 |
::1 | IPv6のループバックアドレス | 自分自身への接続 |
0.0.0.0 | すべてのIPv4アドレスで待受 | 外部や別端末から接続したい時 |
localhostで起動する場合
開発サーバーが 127.0.0.1:3000 で待ち受けている場合、自分のPCからはアクセスできます。
curl http://localhost:3000
しかし、同じWi-Fi内のスマホや別PCからは接続できないことがあります。外部向けのネットワークインターフェースでは待ち受けていないためです。
0.0.0.0で起動する場合
0.0.0.0:3000 で待ち受けると、その機器が持つIPv4アドレス宛の通信を受け付ける設定になります。
npm run dev -- --host 0.0.0.0
実際のアクセスは、別端末から次のように行います。
http://192.168.1.20:3000
0.0.0.0 はアクセス先としてブラウザに入れるものではなく、サーバー側の待受指定として使うものです。
セキュリティ上の注意
0.0.0.0 で待ち受けると、同じネットワーク内の他の端末から見える可能性があります。開発用サーバー、管理画面、デバッグ用APIを不用意に公開しないようにします。
外部から接続できる形で起動する時は、ネットワーク範囲、認証、ファイアウォールを必ず確認します。
Dockerや仮想環境で混乱しやすい点
Dockerコンテナ内の localhost は、ホストPCではなくコンテナ自身を指します。
| 場面 | localhost が指すもの |
|---|---|
| ホストPCのブラウザ | ホストPC自身 |
| Dockerコンテナ内 | コンテナ自身 |
| 仮想マシン内 | 仮想マシン自身 |
そのため、コンテナ内からホストのサービスへ接続する時は、環境ごとの特別なホスト名やネットワーク設定が必要になる場合があります。
よくある誤解
| 誤解 | 実際 |
|---|---|
0.0.0.0 をブラウザで開く | 多くの場合、待受指定でありアクセス先ではありません |
| localhostで動けばスマホからも見える | localhostは自分自身なので見えないことがあります |
| 0.0.0.0は必ずインターネット公開 | LAN内公開に留まる場合もありますが、設定次第で危険です |
| Docker内のlocalhostはホストPC | コンテナ自身を指します |
まとめ
localhost と 127.0.0.1 は自分自身、0.0.0.0 は全IPv4アドレスで待ち受ける指定として理解します。開発サーバーを別端末から確認したい時は便利ですが、公開範囲と認証には注意が必要です。
参考リソース
- RFC 1122: Requirements for Internet Hosts
- IANA: IPv4 Special-Purpose Address Registry
- Docker: Networking overview