오늘은 평소에 궁금했던, 다소 기본적인 내용을 다뤄볼 거예요
우리가 스프링 프로젝트를 실행한 후 인터넷 브라우저에 localhost:8080으로 요청을 보내면 해당 요청이 내가 실행한 스프링 서버로 들어오게 됩니다
과연 어떤 과정을 거쳐 나의 서버로 전달되는지 알아보겠습니다

루프백 주소를 어떻게 처리하냐를 중심으로 글을 전개합니다
브라우저에서 사용자가 localhost:8080을 입력하면,
브라우저는 먼저 localhost라는 이름을 IP 주소로 변환해야 합니다.
이를 보통의 경우에는 DNS(Domain Name System) 시스템을 통해 해결할 수 있습니다.
DNS는 도메인 이름을 IP 주소로 변환해주는 시스템이지만,
localhost는 로컬 시스템에서 특별하게 다뤄집니다.
따라서 DNS 서버에 의존하지 않고, 로컬 호스트 파일을 먼저 확인합니다.
운영 체제는 localhost를 IP 주소 127.0.0.1로 변환하기 위해 hosts 파일을 사용합니다. 이 파일은 운영 체제에 직접 설정된 이름과 IP 주소 매핑을 포함하고 있습니다. 예를 들어, 다음과 같은 항목이 포함되어 있습니다:
127.0.0.1 localhost
Windows에서는 C:\Windows\System32\drivers\etc\hosts에 localhost가 127.0.0.1로 정의되어 있습니다.
Linux/macOS에서는 /etc/hosts에 localhost가 127.0.0.1로 정의되어 있습니다.
이 설정은 localhost라는 이름이 항상 127.0.0.1이라는 루프백 IP 주소와 매핑되도록 보장합니다.
hosts 파일은 DNS 서버보다 우선적으로 조회되기 때문에,
로컬에서만 사용되는 주소(localhost)는 이 파일에서 처리됩니다.
따라서 DNS 서버를 거치지 않고 바로 내부의 host 파일을 거쳐 요청이 이루어지기 때문에 네트워크에 연결되어 있지 않아도 됩니다.
IP 주소 127.0.0.1은 루프백 주소로, 이는 외부 네트워크 장치 없이도 내 컴퓨터의 네트워크 스택을 통해 연결될 수 있게 해주는 특별한 주소입니다. 루프백 주소는 내부 통신을 위한 용도로, 외부 네트워크와의 연결 없이도 로컬에서만 네트워크 서비스를 주고받을 수 있게 해줍니다. 이 주소를 사용하면, 컴퓨터의 네트워크 인터페이스 카드(NIC)를 거치지 않고, 로컬 시스템 내에서만 데이터를 전송하고 받을 수 있게 됩니다.
루프백 주소(127.0.0.1 또는 ::1)는 네트워크를 통과하지 않고 컴퓨터 내부에서 데이터 통신을 처리합니다. OSI 모델의 각 계층에서 루프백 주소가 어떻게 처리되는지 상세히 살펴보면 다음과 같습니다.
애플리케이션 계층
소프트웨어(예: 웹 브라우저, 서버, 클라이언트)가 요청(예: HTTP 요청)을 생성합니다.
데이터는 사용하려는 프로토콜(TCP/UDP)을 설정하고 OS에 전달됩니다.
전송 계층
TCP 또는 UDP 프로토콜을 사용해 데이터를 세그먼트 단위로 분리하거나 재조립합니다.
전송 계층은 포트를 기반으로 소프트웨어 간 통신을 설정하며, 요청이 루프백 주소로 전송되므로 외부 연결을 시도하지 않습니다.
네트워크 계층
데이터를 패킷으로 캡슐화하며, 발신지 IP와 수신지 IP 주소를 확인합니다.
루프백 주소(127.0.0.1 또는 ::1)는 OS에 특별히 예약된 IP로, 네트워크 인터페이스(NIC)를 우회하고 내부 네트워크 스택에서 처리됩니다.
따라서, 이 계층에서 외부 라우팅으로 전송하지 않습니다.
데이터 링크 계층
일반적인 통신에서는 이 계층에서 MAC 주소와 NIC를 통해 물리적 전송을 준비하지만, 루프백 주소의 경우 데이터 링크 계층으로 내려가지 않고 OS 내부에서 바로 상위 계층으로 응답을 돌려줍니다.
물리 계층
루프백 주소는 물리 계층으로 도달하지 않습니다. 데이터가 네트워크를 통해 전송되지 않고, 내부적으로 처리되기 때문입니다.
루프백 주소(127.0.0.1 또는 ::1)는 네트워크 계층에서 특별히 처리됩니다. 이 단계에서는 외부 네트워크로 데이터를 전송하지 않고, 컴퓨터 내부에서만 패킷을 전달하기 위해 설정된 프로세스가 수행됩니다.
IP 주소 확인 및 패킷 생성
발신지 IP와 수신지 IP가 할당됩니다.
발신지 IP: 요청을 보낸 로컬 머신의 IP 주소 (일반적으로 127.0.0.1 또는 ::1)
수신지 IP: 응용 프로그램이 지정한 목적지 주소 (127.0.0.1 또는 ::1)
이 IP 주소는 루프백 주소로 예약되어 있으므로 라우팅 과정이 달라집니다.
라우팅 테이블 확인
네트워크 계층은 라우팅 테이블을 조회해 수신지 IP에 맞는 경로를 결정합니다.
127.0.0.1 및 ::1은 기본적으로 로컬 호스트(Localhost)로 매핑되며, 패킷을 외부 네트워크로 전달하지 않도록 설정됩니다.
라우팅 테이블은 루프백 주소에 대한 엔트리를 포함하며, 이 엔트리는 데이터가 컴퓨터 내부에서만 처리되도록 지정합니다.
패킷 전달
네트워크 계층은 이 패킷을 루프백 인터페이스(가상 네트워크 인터페이스)로 전달합니다.
루프백 인터페이스는 NIC와 달리 물리적 하드웨어가 아니라 운영체제에서 제공하는 소프트웨어 인터페이스입니다.
운영체제는 루프백 인터페이스를 통해 패킷을 다시 상위 계층(전송 계층)으로 전달합니다.
NIC를 우회
루프백 주소로 설정된 패킷은 네트워크 카드(NIC)로 전달되지 않고, 시스템 내부에서 전송이 종료됩니다.
데이터 링크 계층과 물리 계층으로 내려가지 않으므로 네트워크 트래픽이 발생하지 않습니다.
| 특징 | 루프백 인터페이스 | 네트워크 인터페이스 카드(NIC) |
|---|---|---|
| 정의 | 컴퓨터 내부에서 네트워크 프로토콜 테스트를 위한 가상 인터페이스. | 컴퓨터를 외부 네트워크에 연결하는 물리적 또는 가상 장치. |
| 사용 목적 | 내부 통신, 테스트, 디버깅, 로컬 호스트 간 데이터 송수신. | 외부 네트워크와의 데이터 송수신 및 인터넷 연결. |
| IP 주소 범위 | IPv4: 127.0.0.0/8 (주로 127.0.0.1)IPv6: ::1 | 실제 네트워크 제공자(ISP)나 DHCP 서버에서 할당된 IP 주소. |
| 물리적 존재 여부 | 없음 (운영체제에서 소프트웨어로 구현). | 유선(이더넷) 또는 무선(Wi-Fi) 연결을 위한 물리적 장치. |
| 데이터 흐름 | 데이터가 외부로 나가지 않고 시스템 내부에서만 처리. | 데이터를 네트워크를 통해 외부 장치로 송수신. |
| OSI 모델 역할 | 전송 계층 및 네트워크 계층에서만 동작, 데이터 링크 계층 이하로 내려가지 않음. | OSI 전 계층을 통과하며, 실제 데이터 송수신은 물리 계층에서 이루어짐. |
| 속도 | 내부 처리이므로 매우 빠름. | 네트워크 속도(유선/무선)에 따라 다름. |
| 응용 사례 | - 로컬 서버 개발 및 테스트 (예: 웹 서버 localhost).- 네트워크 구성 확인 (핑 테스트). | - 외부 인터넷 연결. - LAN/WAN 연결. - 클라이언트-서버 간 통신. |
| 구현 방식 | 운영체제가 제공하는 가상 인터페이스. | 하드웨어 장치 및 드라이버로 구현. |
| MAC 주소 | 없음 (물리적 주소 필요하지 않음). | 물리적 NIC에 고유한 MAC 주소가 있음. |
| 고장 여부 | 소프트웨어로 구현되므로 고장 가능성이 거의 없음. | 하드웨어 고장 가능성 존재 (포트 손상, 전원 문제 등). |
| 트래픽 제어 | 외부 네트워크와 독립적이므로 트래픽 제어 필요 없음. | QoS, 대역폭 제한 등 트래픽 관리 필요. |
글을 작성하다 보니 루프백 인터페이스가 어떻게 동작하는지에 대해 너무 모호하게 다가와서 해당 부분을 추가해 봅니다
루프백 인터페이스는 물리적 네트워크 장치나 다른 시스템과 연결되지 않고, 로컬 시스템 내에서만 데이터가 송수신되는 논리적이고 가상의 네트워크 인터페이스입니다.
'인터페이스'라는 용어가 네트워크에서 통신을 위한 물리적 연결 지점을 의미하는 경우가 많지만, 루프백 인터페이스는 이러한 물리적 연결 없이 자기 자신과의 연결 포인트를 제공합니다.
즉, 루프백 인터페이스는 외부 네트워크와의 상호작용 없이 컴퓨터 내부에서만 통신할 수 있는 가상적 연결 포인트입니다. 이로 인해 시스템은 물리적 네트워크를 거치지 않고, 빠르고 안정적으로 데이터를 송수신할 수 있습니다. 루프백 인터페이스는 보통 127.0.0.1(IPv4)이나 ::1(IPv6) 주소로 지정되며, 이를 통해 시스템은 네트워크 기능을 테스트하거나 디버깅할 수 있습니다.
결국 루프백 인터페이스는 시스템 내부에서 자기 자신과의 통신을 위해 설계된 연결 포인트로, 외부와의 상호작용 없이 독립적으로 동작하면서도, 네트워크 프로토콜을 통한 데이터를 안전하게 처리할 수 있는 중요한 역할을 수행합니다.
내부 네트워크 인터페이스를 통해 들어오는 요청은 스프링 부트 애플리케이션이 임베디드 서버(예: Tomcat)에서 수신합니다.
스프링 부트는 자동으로 포트 8080을 기본으로 설정하며,
해당 포트를 리스닝(listen)하여 HTTP 요청을 받습니다.
예를 들어, localhost:8080으로 들어오는 요청은 스프링 애플리케이션의 컨트롤러(Controller)에서 처리됩니다.
이 컨트롤러는 요청에 대한 핸들러 메서드를 정의하여, 요청에 맞는 처리를 수행하고 응답을 생성합니다.
브라우저가 요청을 보내면,
스프링 애플리케이션에서 해당 요청을 매핑된 URL과 일치하는 컨트롤러 메서드로 전달합니다.
예를 들어, @RequestMapping("/home")으로 정의된 메서드는 /home 경로로 들어오는 요청을 처리합니다.
이때, 스프링은 서블릿 컨테이너(기본적으로 Tomcat)를 사용하여 요청을 받아들이고 처리하는데,
Tomcat은 요청을 스프링의 DispatcherServlet에 전달합니다. DispatcherServlet은 요청을 해당하는 핸들러로 분배하고,
최종적으로 HTTP 응답을 생성하여 브라우저에 반환합니다.
스프링 애플리케이션은 처리한 데이터를 HTML, JSON, XML 등 다양한 형식으로 변환하여 응답을 보냅니다. 이 응답은 다시 루프백 인터페이스를 통해 브라우저로 돌아가고, 사용자는 결과를 확인할 수 있습니다.
사실 제가 가장 알고 싶었던 건 루프백 주소를 어떻게 처리하느냐? 라서 해당 부분에 글이 집중되어 있습니다!
아직 네트워크에서 공부할 것이 많다는 것을 느끼며... 🥲