1. 라이브러리
  2. IP 주소
  3. 특수 주소

업데이트됨 1개월 전

서버 로그, 라우팅 테이블, hosts 파일, 설정 파일 어디서나 0.0.0.0을 본 적이 있을 겁니다. 대부분의 IP 주소는 특정 장치를 가리킵니다. 하지만 이 주소는 아무것도 가리키지 않습니다—그리고 바로 그것이 이 주소를 유용하게 만드는 이유입니다.

이 주소의 의미는 전적으로 어디서 보느냐에 따라 달라집니다.

하나의 주소, 다섯 가지 의미

  • 서버 바인딩 주소로 사용될 때: "모든 네트워크 인터페이스에서 수신 대기"
  • 라우트 목적지로 사용될 때: "다른 경로가 없을 때 사용하는 경로" (기본 라우트)
  • 소스 주소로 사용될 때: "아직 IP가 없음" (DHCP 탐색)
  • hosts 파일의 목적지로 사용될 때: "아무 데도 가지 않음" (차단/무효화)
  • 주소 블록으로 사용될 때 (0.0.0.0/8): "예약됨—일반 용도로 사용 불가"

같은 숫자. 완전히 다른 의미.

0.0.0.0이 "어디서나"를 의미할 때

서버를 0.0.0.0에 바인딩한다는 것은 이렇게 말하는 것입니다: 나에게 닿을 수 있는 어디서든 연결을 받겠다.

여러분의 컴퓨터는 여러 개의 정체성을 가질 수 있습니다—로컬 네트워크에서는 192.168.1.100, VPN을 통해서는 10.0.0.50, 자기 자신과 통신할 때는 127.0.0.1. 0.0.0.0에 바인딩된 서버는 이 모든 주소에 응답합니다.

Server listening on 0.0.0.0:8080

이 서버는 컴퓨터가 가진 모든 IP 주소를 통해 포트 8080으로 접근할 수 있습니다.

127.0.0.1 대 0.0.0.0

개발자들이 자주 혼동하는 두 주소입니다. 이 둘은 정반대입니다.

127.0.0.1은 잠긴 방입니다. localhost로 향하는 트래픽은 컴퓨터 밖으로 나가지 않습니다. 같은 컴퓨터의 프로세스만 연결할 수 있습니다.

0.0.0.0은 모든 문을 엽니다. localhost도 들어올 수 있고, LAN도, VPN도, 잠재적으로 인터넷 전체도 접근 가능합니다.

127.0.0.1에 바인딩하면, 다른 장치는 여러분의 IP를 알아도 접근할 수 없습니다. 0.0.0.0에 바인딩하면, 네트워크 전체가 연결할 수 있습니다.

카페에서 생기는 문제

카페에서 개발 중이라고 상상해 보세요. 노트북에서 0.0.0.0에 바인딩된 개발 서버를 실행하고 있습니다. 비공개라고 생각합니다—그냥 localhost니까요, 맞죠?

틀렸습니다. 그 공공 Wi-Fi에 연결된 모든 사람이 여러분의 서비스에 접근할 수 있습니다. 로컬 IP 주소만 알면 됩니다. 개발 데이터베이스, API 엔드포인트, 디버그 패널—모두 낯선 사람들에게 노출됩니다.

이것은 이론적인 이야기가 아닙니다. 0.0.0.0 바인딩을 제대로 이해하지 못한 채 사용하면 자격 증명이 유출되고, 관리자 인터페이스가 노출되고, "그냥 로컬에서 테스트하고 있었을 뿐인데"로 시작되는 보안 사고가 발생합니다.

언제 무엇을 사용할까

로컬 개발? 127.0.0.1로 시작하세요. 다른 장치—스마트폰에서 노트북 서버에 접속하는 것처럼—에서 테스트해야 할 때만 0.0.0.0으로 전환하세요. 그리고 테스트 후에는 다시 돌아오세요.

프로덕션 서비스? 0.0.0.0에 바인딩한다면, 보안 장치를 갖추세요. 방화벽 규칙, 인증, 접근 제어. 바인딩 주소를 보안의 근거로 삼지 마세요.

데이터베이스? 대부분은 네트워크 접근을 막기 위해 기본적으로 127.0.0.1로 설정됩니다. 암호화와 인증 없이 0.0.0.0으로 변경하는 것은 재앙을 자초하는 일입니다.

0.0.0.0이 "기본 라우트"를 의미할 때

라우팅 테이블에서 0.0.0.0/0은 기본 라우트—최후의 수단으로 사용하는 경로입니다.

컴퓨터는 라우팅 테이블을 유지합니다: 트래픽을 어디로 보낼지에 대한 지도. 특정 네트워크에 대한 구체적인 라우트들이 있습니다. 하지만 특정 라우트가 일치하지 않을 때, 기본 라우트가 나머지 모든 것을 잡아냅니다.

Destination     Gateway         Interface
192.168.1.0/24  0.0.0.0         eth0
10.0.0.0/8      10.0.0.1        tun0
0.0.0.0/0       192.168.1.1     eth0

192.168.1.100으로 향하는 패킷? /24 라우트와 일치합니다. 로컬 네트워크. 10.5.20.1로 향하는 패킷? /8 라우트와 일치합니다. VPN 터널. 8.8.8.8로 향하는 패킷? 특정 라우트 없음. 0.0.0.0/0으로 폴백—기본 게이트웨이.

왜 /0인가요?

라우팅은 최장 접두사 일치를 사용합니다—가장 구체적인 라우트가 우선합니다. /24는 /8보다 구체적입니다. /8은 /0보다 구체적입니다.

/0은 "일치를 위해 중요한 비트가 0개"를 의미합니다. 모든 것과 일치합니다. 포괄 항목입니다.

가정 네트워크에서 기본 라우트는 라우터를 가리킵니다. 라우터는 ISP로 전달합니다. ISP는 백본으로 라우팅합니다. 기본 라우트는 고립된 네트워크가 더 넓은 인터넷과 연결되는 방법입니다.

0.0.0.0이 "아직 존재하지 않음"을 의미할 때

장치가 처음 네트워크에 참여할 때, 딜레마에 빠집니다. DHCP를 통해 IP 주소를 요청하려면 네트워크 패킷을 보내야 합니다. 하지만 패킷에는 소스 IP 주소가 필요합니다. 그런데 장치에는 아직 IP 주소가 없습니다.

해결책: 소스로 0.0.0.0을 사용합니다. "나는 주소가 없지만, 하나를 받기 위해 통신해야 합니다"라는 신호를 보냅니다.

DHCP 과정

  1. Discover: 클라이언트가 소스 0.0.0.0으로 브로드캐스트합니다. "DHCP 서버가 있나요?"
  2. Offer: 서버가 응답합니다. "X.X.X.X를 사용할 수 있습니다."
  3. Request: 클라이언트가 다시 브로드캐스트합니다. 여전히 0.0.0.0에서. "그 주소를 사용하겠습니다."
  4. Acknowledge: 서버가 확인합니다. "당신의 것입니다."

Discover와 Request 전반에 걸쳐, 클라이언트는 아직 주소가 할당되지 않았기 때문에 0.0.0.0을 사용합니다. ACK를 받으면, 클라이언트는 인터페이스를 설정하고 다시 주소가 필요할 때까지 0.0.0.0을 사용하지 않습니다.

왜 그냥 비워두지 않을까요?

IP 패킷은 헤더에 소스 및 목적지 주소가 필요합니다. 0.0.0.0을 사용하면 "아직 주소가 없음"을 알리면서도 유효한 헤더를 제공합니다. RFC 1122는 이 사용을 명시적으로 정의합니다.

0.0.0.0이 "아무 데도 가지 않음"을 의미할 때

아마 이해하지 못한 채 본 적이 있을 사용 사례가 있습니다: hosts 파일을 통한 주소 차단.

0.0.0.0 ads.trackingcompany.com
0.0.0.0 malware.badsite.net

이것이 작동하는 이유는 0.0.0.0이 목적지로서 라우팅될 수 없기 때문입니다. 브라우저가 ads.trackingcompany.com에 연결하려 할 때, hosts 파일이 이를 0.0.0.0으로 리디렉션합니다. 연결 시도는 아무 데도 가지 않고 즉시 실패합니다.

일부는 차단을 위해 127.0.0.1을 사용하기도 합니다. 차이점: 127.0.0.1은 자신의 컴퓨터(연결을 거부할 가능성이 높음)에 연결하는 반면, 0.0.0.0은 연결할 대상이 없기 때문에 더 빠르게 실패합니다. 둘 다 작동합니다. 0.0.0.0이 약간 더 효율적입니다.

이 기법은 DNS 기반 광고 차단기, 악성 코드 보호 목록, 자녀 보호 소프트웨어에 활용됩니다.

예약된 블록

0.0.0.0 자체를 넘어, 전체 /8 블록(0.0.0.0부터 0.255.255.255까지)은 IANA에 의해 예약되어 있습니다. 이 주소들은 "이 네트워크"—원격 네트워크가 아닌 로컬 세그먼트를 나타냅니다.

실제로는 0.0.0.0 자체를 제외하고 이 블록에서 다른 것을 거의 접하지 못할 것입니다. 예약은 0.0.0.0의 특별한 의미가 인근 주소에 의해 혼동되지 않도록 보장합니다.

자주 하는 질문

"서버에서 0.0.0.0이라고 나오는데 연결이 안 돼요!"

0.0.0.0에 바인딩하면 애플리케이션이 연결을 받을 의향이 있는 상태가 됩니다. 연결이 가능해지는 것은 아닙니다. 방화벽이 트래픽을 차단합니다. NAT는 포트 포워딩이 필요합니다. 클라우드 보안 그룹은 IP로 필터링합니다. 애플리케이션은 "응답하겠다"고 하지만, 인프라가 "요청이 서버에 닿지 않는다"고 할 수 있습니다.

"라우팅 테이블에서 0.0.0.0을 봤는데—문제가 있는 건가요?"

정상입니다. 기본 라우트(0.0.0.0/0)는 컴퓨터가 인터넷 트래픽을 어디로 보낼지 알게 해주는 방법입니다. 인터넷에 연결된 모든 장치에는 기본 라우트가 있습니다.

"0.0.0.0을 내 IP 주소로 할당할 수 있나요?"

아니요. 이것은 신호 전달과 설정을 위한 메타 주소이며, 영구적인 호스트 주소로는 사용되지 않습니다.

0.0.0.0에 관한 자주 묻는 질문

0.0.0.0은 localhost와 같은가요?

아니요—이 둘은 정반대입니다. localhost(127.0.0.1)는 연결을 자신의 컴퓨터로만 제한합니다. 0.0.0.0은 원격 장치를 포함한 모든 인터페이스에서 연결을 받습니다.

일부 애플리케이션이 기본적으로 0.0.0.0에 바인딩하는 이유는 무엇인가요?

유연성 때문입니다. 애플리케이션은 여러분의 네트워크 토폴로지를 알지 못합니다—어떤 인터페이스가 존재하는지, 어떤 IP가 변경될 수 있는지. 0.0.0.0에 바인딩하면 "어떤 설정에서도 작동"을 의미합니다. 하지만 이 유연성은 외부 보안 통제를 필요로 합니다.

인터넷에서의 트래픽이 0.0.0.0에 바인딩된 서비스에 도달할 수 있나요?

아무것도 차단하지 않는다면 가능합니다. 가정 네트워크에서는 라우터의 NAT가 포트 포워딩을 설정하지 않는 한 일반적으로 인바운드 연결을 차단합니다. 공인 IP를 가진 서버에서는 방화벽이 개입하지 않으면 0.0.0.0의 서비스가 직접 노출됩니다.

0.0.0.0/0과 0.0.0.0/8의 차이점은 무엇인가요?

라우팅에서 0.0.0.0/0은 "모든 주소"를 의미합니다—기본 라우트. 0.0.0.0/8은 예약된 주소 블록(0.0.0.0부터 0.255.255.255까지)으로, 정상적인 인터넷 트래픽에서는 나타나지 않아야 합니다.

출처

이 페이지가 도움이 되었나요?

😔
🤨
😃
0.0.0.0은 무엇을 의미하나요? • 라이브러리 • Connected