localhost 의 동작 원리

김형섭 (Matthew)·2024년 6월 5일
162
post-thumbnail

Why

거의 매일 사용하시지만, 동작되는 이유를 모른채 사용하는 IP주소가 있습니다.
127.0.0.1 즉, localhost 말 입니다.

localhost 가 뭐예요?

내 PC에서 다른 서버가 아닌, 바로 나 자신을 가리키는 주소 입니다.

엄밀하게는 localhost 라는 글자 자체가
OS의 기본 로컬 라우팅 테이블에 부팅과 동시에 등재되는데요.

localhost 는 호스트명일 뿐이고, 실제로는 IP주소를 사용합니다.
고정적으로 127.0.0.1 의 주소를 갖습니다. (맥/윈도/리눅스 모두 동일)

내 PC에서 localhost 로 데이터를 보내면,
외부로 나가지 않고 내 PC로 요청이 다시 들어오는 주소죠.

실제로 네트워크 계층까지 내려가지 않고, 지연시간이 거의 없어 엄청 빠른 장점이 있습니다.

localhost 사용해 보셨죠?

엔지니어라면 당연히 사용해 보셨을 것입니다.

그냥 브라우저나, 터미널에서 localhost 라고 지정 하기만 하면 나한테 요청이 들어오니까요.
내가 내 PC에서 서버를 띄우고, 다시 브라우저로 내 PC에 띄운 서버로 접속하고..
이런 거 개발 도중에 수도 없이 하시는거죠.

그런데 어떻게 이게 가능할까요?
그냥 되는 걸까요?

무언가 조치가 되어 있겠죠.
오늘 그걸 알아볼거예요.

localhost 가 나로 다시 돌아온다는 것을 이해하려면,
먼저 Network Interface 를 알아야 합니다.

Network Interface

PC에서 인터넷 혹은 통신을 하려면 뭐가 필요하죠?

네, WifiLan Card 가 필요합니다.
이런 장치를 네트워크 인터페이스라고 합니다. 줄여서 NI 라고 하고요.

장치를 OS에서 인식하면, 시스템에 장치마다 대응하는 NI 를 각각 만듭니다.
NI1NI2번.. 이런식으로요.

터미널이나 커맨드창에서 ifconfig , ipconfig /all 등의 명령어를 사용해 보셨을 거에요.

뭐가 주르륵 나오실 겁니다.
네, 이런걸 네트워크 인터페이스라고 합니다.

NI는 왜 있는건가요?

OS에서 네트워크를 사용하기 위해 장치를 구분하기 위해서 존재합니다.

원래는 뭔가를 네트워크로 보내려면, 어떤 NI로 데이터를 보낼지 딱 정해야 해요.
그런데 IP주소만 딱 보면 어떤 NI를 사용하면 될지 PC가 알고 있어요.

그래서, 여러분은 그동안 딱히 신경쓰지 않아도 알아서 통신이 된 것이죠.

예를 들면

  • 192.168.0.0/16 대역으로 나가려면 NI2
  • 127.0.0.0/8 대역으로 나가려면 NI0
  • 0.0.0.0/0 그외 모든 대역은 NI1

위처럼 나가고자 하는 목적지 IP주소에 따라 어떤 NI를 사용해야 하는지 OS에서 관리하며, 이것을 네트워크 라우팅 테이블 이라고 합니다.

이처럼 하나의 PC에 여러개의 통신 장비가 있더라도,
대역을 통해 망을 구분 할 수 있죠.

그래서 로컬 네트워크와 인터넷을 구분 할수도 있고, 여러가지 조합이 가능해 집니다.
그런데, 여러 NI 중에서도 Loopback NI 라는게 있습니다.

위에서 NI0 번 이죠.

Loopback NI

이것은 모든 PC에 OS만 설치하면 기본으로 제공 하는 가상의 장치 입니다.
실제로 WIFILAN이 없어도 존재 합니다.

이 장치는 IP주소 중 127.0.0.0/8 범위의 요청을 담당하죠.

127.0.0.0/8 대역은 IP주소를 정할때부터 애초에 로컬용으로 예약된 대역 입니다.
127.0.0.1 은 그 중 첫번째 IP로, 나 자신을 가리킵니다.

그러니까 이 장치는 결국 내가 보내는 내 요청을 받고, 다시 나에게 응답을 돌려주는 통신 장비가 되는 것이고,
내 입이자 내 귀 입니다. 혼잣말 처럼요.

그리고, 가상의 장치이므로, 물리적인 통신 과정이 생략되어 매우 빠르게 동작 하게 됩니다.

결국, 이 Loopback NI 가 있기 때문에 우리가 localhost 를 사용할수 있는 것입니다.

이제 Loopback NI를 아셨으니 패킷의 흐름을 한번 따라가 보아요.

localhost 의 간단한 패킷의 흐름

  • 앱에서 데이터 전송
    • 웹 브라우저로 http://127.0.0.1로 요청을 보내요.
    • 이 요청은 TCP/IP 스택을 통해 패킷으로 나가려고 하겠죠?
  • TCP/IP 스택에서 IP주소를 보고 루프백 NI로 갑니다.
    • 목적지 주소 127.0.0.1을 확인했으니,이제 패킷을 외부로 보내지 않고 로컬로 다시 보냅니다.
  • 로컬로 패킷 전달
    • 패킷은 다시 TCP/IP 스택 계층으로 전달되고, 올바른 포트로 전달됩니다.
  • 서버 앱 요청 수신
    • 로컬 서버 앱은 이 요청을 수신하고, 적절한 응답을 생성하여 다시 루프백 인터페이스로 보냅니다.
    • 이 앱은 우리가 만든 node.js 앱이나 기타 앱들이 되겠죠?
  • 응답 패킷의 루프백 경로
    • 응답 패킷도 동일한 과정을 거쳐 결국, 최종적으로 요청했던 앱인 로컬 브라우저로 전달됩니다.

마무리

매일 같이 사용하지만, 자세히 원리는 몰라도 되는 기술이 많습니다.

그러나, 원리를 알면 트러블슈팅이 쉬운 케이스 있는데, 오늘 말씀드린 Loopback NI가 바로 그것 입니다.

사실 Loopback127.0.0.1 뿐만 아니라 다른 IP도 할당할수 있는데요.

그러면 지금은 거의 쓰지 않지만 Software 로 구현한 L4 Router 를 만들때 사용되곤 했습니다.

  • localhost 가 먹통이라구요?
  • 127.0.0.1 이 대체 뭐냐구요?
  • 패킷이 나한테 돌아오는 이유가 궁금하다구요?

오늘 글로 해결하셨기를 바랍니다.
다음에도 좋은글로 찾아뵙겠습니다.

아임웹 CTO 매튜 드림.

profile
CTO at Imweb, 20년차 개발 장인, 전) 플레이오토 CTO/창업자

15개의 댓글

comment-user-thumbnail
2024년 6월 6일

웹을 개발하는 개발자는 어느 정도의 네트워크 지식이 필요한 법이죠!

1개의 답글
comment-user-thumbnail
2024년 6월 7일

좋은 지식 감사합니다

1개의 답글
comment-user-thumbnail
2024년 6월 7일

폭발적인 반응에 감사합니다.
이 글이, 이번주 velog 트렌딩 1위를 기록 했네요.

좋은 반응에 감사하며, 후속편을 준비했습니다.

localhost 를 외부에서 접속하게 할 방법이 있습니다.
https://velog.io/@480/localhost-%EB%A5%BC-%EC%99%B8%EB%B6%80%EC%97%90%EC%84%9C-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0

감사합니다!

답글 달기
comment-user-thumbnail
2024년 6월 8일

잘 봤습니다! 좋은 글 감사합니다.
선생님은 해당 지식을 어떻게 공부하셨나요?

1개의 답글
comment-user-thumbnail
2024년 6월 9일

좋은 지식 감사합니다! 너무나 당연하게 여겨왔던 것들을 이유를 알 수 있어서 좋았습니다!

1개의 답글
comment-user-thumbnail
2024년 6월 10일

Hi

답글 달기
comment-user-thumbnail
2024년 6월 12일

글 잘 읽고갑니다 감사합니다!

1개의 답글
comment-user-thumbnail
2024년 6월 19일

생각치 못한 궁금증이었는데 알려주셔서 감사합니다!

1개의 답글