localhost와 127.0.0.1은 같은가? 루프백과 OSI 7계층으로 이해하기

결론부터: 보통은 같다, 하지만 항상 같지는 않다.
둘은 계층이 다른 개념이다.


1. 개념 층위가 다르다

localhost   →  호스트명 (이름)   →  Layer 7 (응용 계층)에서 해석
127.0.0.1   →  IP 주소 (숫자)   →  Layer 3 (네트워크 계층)에서 처리

localhost는 문자열 이름이고, 127.0.0.1은 그 이름이 보통 가리키는 주소다.
이름 → 주소로 변환하는 단계가 하나 더 있다는 게 핵심이다.


2. localhost 해석 경로

DNS 서버까지 가지 않는다. OS가 먼저 로컬 파일을 확인한다.

프로그램이 "localhost" 요청
        │
        ▼
  /etc/hosts (또는 C:\Windows\System32\drivers\etc\hosts)
  ┌─────────────────────────────────┐
  │  127.0.0.1   localhost          │  ← 여기서 해석됨
  │  ::1         localhost          │  ← IPv6도 함께 등록된 경우
  └─────────────────────────────────┘
        │
        ▼
  IP 주소 확정 → 소켓 연결

/etc/hosts를 수정하면 localhost가 다른 IP를 가리키게 할 수 있다.
localhost → 192.168.1.100 도 가능하다. (그러면 완전히 달라진다)


3. OSI 7계층에서 루프백의 위치

127.0.0.1로 패킷을 보내면 물리 네트워크 카드까지 내려가지 않는다.
네트워크 계층(L3)에서 자기 자신에게 돌려보낸다.

  [ 송신 측 ]                        [ 수신 측 ]
  7. 응용    → "localhost" 해석      7. 응용    ← 데이터 수신
  6. 표현    → 데이터 인코딩         6. 표현
  5. 세션    → 연결 관리             5. 세션
  4. 전송    → TCP/UDP 포트          4. 전송
  3. 네트워크 → 127.0.0.1 확인       3. 네트워크
              ↓                                ↑
              └──────── 루프백 (lo) ───────────┘
                    (여기서 반환, L2/L1 없음)

  2. 데이터 링크  ← 도달하지 않음
  1. 물리         ← 도달하지 않음

루프백 인터페이스(lo)는 가상 인터페이스로, 패킷이 OS 커널 안에서 순환한다.
실제 네트워크 카드(NIC)를 거치지 않으므로 외부로 절대 나가지 않는다.


4. 언제 localhost ≠ 127.0.0.1 이 되는가?

케이스 1: IPv6 환경

/etc/hosts
  127.0.0.1   localhost   ← IPv4
  ::1         localhost   ← IPv6

OS가 IPv6를 우선하면:
  localhost → ::1  (IPv6 루프백)
  127.0.0.1 → IPv4 루프백
  → 서버가 IPv4로만 열려 있으면 localhost로 접속이 안 될 수 있다

케이스 2: /etc/hosts 수정

127.0.0.1   localhost      ← 기본값
127.0.0.1   myapp.local    ← 커스텀 추가
192.168.1.5 localhost      ← 이렇게 바꾸면 localhost는 다른 IP

케이스 3: 서버 바인딩

서버가 127.0.0.1 에만 바인딩
  → localhost 접속: 가능 (127.0.0.1로 해석되면)
  → 외부 IP로 접속: 불가

서버가 0.0.0.0 에 바인딩
  → 모든 인터페이스 허용 (127.0.0.1도, 외부 IP도 가능)

5. 자주 쓰이는 특수 IP 주소

루프백 & 자기 자신

주소의미
127.0.0.1IPv4 루프백 (자기 자신)
127.x.x.x127.0.0.0/8 전체가 루프백 대역
::1IPv6 루프백

바인딩 & 라우팅 특수값

주소의미
0.0.0.0모든 인터페이스에 바인딩 (서버 리슨 시)
255.255.255.255브로드캐스트 (같은 네트워크 전체)

사설 IP 대역 (외부 인터넷으로 나가지 않음)

대역범위주로 쓰이는 곳
10.0.0.0/810.x.x.x기업 내부망
172.16.0.0/12172.16.x.x ~ 172.31.x.xDocker 기본 네트워크
192.168.0.0/16192.168.x.x가정용 공유기

링크-로컬 (자동 할당)

주소의미
169.254.x.xDHCP 실패 시 OS가 자동 할당 (APIPA)
fe80::/10IPv6 링크-로컬

6. 실무 요약

개발할 때 자주 만나는 상황:

  서버 시작 시
    0.0.0.0:3000  → 모든 IP로 접근 가능 (외부 포함)
    127.0.0.1:3000 → 이 머신에서만 접근 가능

  localhost로 접속이 안 될 때 확인할 것
    1. /etc/hosts 에서 localhost → 어떤 IP?
    2. 서버가 IPv4 바인딩인데 OS가 ::1(IPv6)로 해석?
    3. ping 127.0.0.1 vs ping localhost 결과 비교

정리

localhost  = 이름 (hosts 파일에서 해석, L7)
127.0.0.1  = 주소 (루프백 인터페이스, L3)

둘이 같은 이유:  기본 /etc/hosts가 127.0.0.1 → localhost 로 매핑
둘이 달라지는 이유:  IPv6 우선, hosts 파일 수정, 서버 바인딩 방식

루프백의 핵심은 L3에서 반환되어 L1/L2에 도달하지 않는다는 것이다.
패킷이 물리 카드 밖으로 나가지 않기 때문에 네트워크 없이도 소켓 통신이 가능하다.