結論から言うね:127.0.0.1は「固定のループバックIP」、localhostは「名前(ホスト名)で、解決結果がIPv4/IPv6やhosts設定で変わる」、ここが違いの芯。
- 127.0.0.1:名前解決なし。IPv4のループバック直指定。
- localhost:名前解決あり。/etc/hosts(Windowsならhosts)でIPv4/IPv6どっちにもなり得る。
- ズレる瞬間:hosts改変、IPv6優先、名前解決が壊れてる、FW/セキュリティ周り。
- 迷ったら:「確実に自分のPC内だけ」なら127.0.0.1、「読みやすさ」ならlocalhost。
127.0.0.1って、何者なの(固定の住所)
127.0.0.1はIPv4のループバックアドレスで、127.0.0.0/8(127.*)は丸ごとループバック用に予約されている。
だから、ここに投げた通信は外に出ない。出ないのよ。自分のOSのネットワークスタックの中でぐるっと回って終わり。
名前解決がいらないのもポイントで、DNSとかhostsとか、そういう「途中の寄り道」をしない。
でね、こういうのって「言葉で聞くと当たり前」なんだけど、トラブルの現場だと当たり前が消えるの。
アプリがつながらない→ログ見る→いやコード変えてない→え?ってなる。
そのとき、127.0.0.1はだいたい裏切らない。強い。
IPv6の相方:IPv6で同じ役割なのが ::1。これは覚えておくと後で助かるやつ。
短く言うと、127.0.0.1=IPv4、::1=IPv6。うん、それだけ。
localhostって、何者なの(ただの名前、でも厄介)
localhostはホスト名(名前)で、OSがそれをIPアドレスに変換してから通信する。
この「変換」がね、平常時は静かに動くんだけど、壊れると地味に痛い。
だって「localhostにアクセスしてるのに繋がらない」って、感覚的に納得しづらいじゃん。
どこで変換するの:多くの環境だとまず hosts ファイルを見る。
Unix系(Linux/macOS)なら /etc/hosts、Windowsなら C:\Windows\System32\drivers\etc\hosts。
ここ、編集できちゃう。できちゃうのが怖い。
典型例はこんな感じ:
127.0.0.1 localhost
::1 localhost
この2行があると、localhostはIPv4にもIPv6にも行ける状態になる。
そしてアプリやOSの設定次第で、先に::1(IPv6)を掴みに行くことがある。
これが「localhostなのに挙動が違う」の正体の一つ。
えっと、ここ大事。
localhostは「いつも127.0.0.1」じゃない。ここで事故る。
違いが表に出る瞬間(だいたいここで揉める)
localhostと127.0.0.1は普段ほぼ同じに見えるが、hosts設定・IPv6優先・名前解決障害があると挙動が分かれる。
で、分かれた時に限って、めっちゃ時間吸われる。ほんとに。
1) hostsが書き換わってる
localhostが別IPに向くようにされてたら、アプリはそこに行く。
たとえば極端に 192.168.1.100 localhost みたいな。
127.0.0.1は関係ない。相変わらず自分の中でループ。
2) IPv6が優先される
localhostが ::1 に解決されると、IPv6で接続するアプリはそっちへ行く。
サーバー側がIPv4にしかバインドしてないと、はい、繋がらない。
静かに失敗するやつ。嫌い。
3) 名前解決が死んでる(または遅い)
「localhostの解決」って軽そうに見えるけど、環境によっては名前解決の経路が変なことになる。
hosts優先のはずが、何かが噛んで、変に待つ…みたいな。
127.0.0.1はそこをすっ飛ばす。
4) FW/セキュリティ設定の癖
稀だけど、ルールが「ホスト名ベース」だったり「IPv6だけ別扱い」だったりで、localhostと127.0.0.1で結果がズレる。
Windows Defender Firewallとか、企業端末のEDRとか、ああいうの。
会社PCは特に、ね。うん。
| 観点 | 127.0.0.1 | localhost |
|---|---|---|
| 種類 | IPv4アドレス(ループバック) | ホスト名(別名) |
| 名前解決 | 不要(直指定) | 必要(hostsやDNSの仕組みを通る) |
| IPv4/IPv6 | IPv4のみ | IPv4にもIPv6にもなり得る(例:127.0.0.1 / ::1) |
| 設定変更の影響 | 基本、影響を受けにくい | hosts編集や環境設定で行き先が変わる |
| テストの確実性 | 「ローカル内だけ」を固定したい時に強い | 読みやすいけど、環境差でブレることがある |
「localhost=127.0.0.1」は普段は正しい。でも、IPv6とhostsが絡むと、平気で外れる。
分かってる人ほどハマる:開発・検証での地味な落とし穴
開発やデバッグでは、「どのアドレスにバインドしてるか(listenしてるか)」が勝負になる。
ブラウザやcurlがどっちで繋ぎにいくかより、サーバー側がどっちを受けてるか。
ここ、見落とすと溶ける。
たとえば:サーバーが 127.0.0.1 にだけバインドしてるのに、クライアントはlocalhostで ::1 を引いた。
結果、繋がらない。
「え?同じマシンなのに?」って顔になる。なるのよ。
あと、テストのときは「絶対にローカルから出したくない通信」がある。
社内のプロキシ設定とか、VPNとか、たまに変なルートに連れてかれるのが怖いから。
そういう時、127.0.0.1って、気持ちが落ち着く。
公式寄りの道具としては:Windowsなら「メモ帳を管理者で開いてhosts編集」みたいな手順になるし、macOS/Linuxなら /etc/hosts を触ることになる。
ただね、ここを触るときは、ほんと、慎重に。
一文字ズレると、地味に広範囲が死ぬ。
If This Then That:どの人がどっちを選ぶとラクか(分衆)
用途で迷う人、多い。疑っていい。疑うのは正しい。
私も最初「どっちでも同じでしょ」派だったし、まあ…痛い目みた。
- 外食族(ノートPCを持ち歩き/カフェWi‑Fi多め):環境がコロコロ変わるから、切り分けの最初は
127.0.0.1を打つ人が多い。名前解決の揺れをまず消す、って感じ。 - 夜勤・深夜作業(頭が回ってない日):「読める」ほうが救いになるから普段は
localhost、でも繋がらない時だけ127.0.0.1に切り替えて原因を炙る。眠いときに抽象は敵。 - 親子でPC共有(家族の誰かが設定いじりがち):hostsが変に触られてる可能性がゼロじゃないから、怪しい日は
127.0.0.1で確認してから落ち着いて見る。家庭内の「誰が何した問題」、あるある。 - 銀髪(長年の経験で「まず確実な方」派):確認作業は
127.0.0.1で固めて、運用やドキュメントはlocalhostに寄せる。読む人の目も守る、みたいな。
読みやすさはlocalhost、確実性は127.0.0.1。迷ったら「今は切り分け中か?」で決める。
最後に:変な沼に落ちないための合言葉
localhostはホスト名、127.0.0.1はIPv4ループバック、そしてIPv6のループバックは::1。
この3つを頭の棚に並べておくと、トラブル時に戻ってこれる。
戻ってこれるだけで、だいぶ違う。
で、ここから比慘大會ね:「localhostで繋がらなくて半日溶けた」話、持ってる人いるでしょ。
IPv6だった? hostsだった? それとも会社PCのセキュリティが謎に強かった?
自分だけじゃないって分かると、ちょっと回復するから…そっと置いてって。🙂
