エンジニア初心者向け:localhostと127.0.0.1の違いは開発現場でどう影響する?

Published on: | Last updated:

結論から言うね: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。
Type 1(Flowchart):localhost と 127.0.0.1 を使い分ける流れ
Type 1(Flowchart):localhost と 127.0.0.1 を使い分ける流れ

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。うん、それだけ。

Type 2(Infocard):ズレが出る「あるある」4枚
Type 2(Infocard):ズレが出る「あるある」4枚

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」じゃない。ここで事故る。

Type 3(Multi-view Diagram):同じ「localhost」でも行き先が分岐する
Type 3(Multi-view Diagram):同じ「localhost」でも行き先が分岐する

違いが表に出る瞬間(だいたいここで揉める)

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は特に、ね。うん。

comparison:localhost と 127.0.0.1 の違い(ここだけ押さえればOK)
観点 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 を触ることになる。

ただね、ここを触るときは、ほんと、慎重に。

一文字ズレると、地味に広範囲が死ぬ。

Type 4(Comparison Chart):localhost vs 127.0.0.1(使う場面の気持ち)
Type 4(Comparison Chart):localhost vs 127.0.0.1(使う場面の気持ち)

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つを頭の棚に並べておくと、トラブル時に戻ってこれる。

戻ってこれるだけで、だいぶ違う。

Type 5(Two-column):よくある誤解 vs 実際
Type 5(Two-column):よくある誤解 vs 実際

で、ここから比慘大會ね:「localhostで繋がらなくて半日溶けた」話、持ってる人いるでしょ。

IPv6だった? hostsだった? それとも会社PCのセキュリティが謎に強かった?

自分だけじゃないって分かると、ちょっと回復するから…そっと置いてって。🙂

Related to this topic:

Comments