단북

주소 체계와 네트워크

개별 주소를 네트워크 단위로 묶는 방법(CIDR·서브넷), 주소가 호스트가 아니라 인터페이스에 속한다는 것, IPv4 고갈을 NAT와 IPv6로 버티는 방법을 다룹니다.

이 레슨에서는 개별 주소를 네트워크 단위로 묶는 방법(CIDR·서브넷), 주소가 호스트가 아니라 인터페이스에 속한다는 점, 그리고 IPv4 주소 고갈을 NAT와 IPv6로 대응하는 방식을 다룹니다. 비트 계산이 나오지만, 프론트엔드 입장에서 중요한 것은 “같은 IP 뒤에 여러 사용자가 있을 수 있다”, “localhost가 무엇인가” 같은 결론입니다.

네트워크 prefix와 CIDR

같은 네트워크에 속한 주소들은 앞부분(prefix)이 같고 특정 비트 위치부터 달라집니다. 같은 블록 안의 컴퓨터끼리는 라우터를 거치지 않고 직접 통신할 수 있습니다.

네트워크를 표기할 때는 prefix와 그 길이를 함께 적습니다. 예를 들어 198.51.100.0/24에서 /24는 “앞 24비트가 네트워크를 나타내는 부분”이라는 뜻이고, 남은 8비트가 그 네트워크 안의 개별 호스트를 구분하는 데 쓰입니다. 이 표기법을 CIDR(Classless Inter-Domain Routing)이라고 합니다.

  • prefix가 길수록 호스트 비트가 적습니다 → 작은 네트워크
  • prefix가 짧을수록 호스트 비트가 많습니다 → 큰 네트워크
  • 사용 가능한 호스트 수 ≈ 2^(호스트 비트) − 2 (맨 앞·맨 뒤 주소는 네트워크 주소·브로드캐스트용으로 예약)

서브넷 마스크는 같은 정보를 다른 방식으로 적은 것으로, 네트워크 부분을 1, 호스트 부분을 0으로 채웁니다. /24255.255.255.0에 해당합니다.

prefix서브넷 마스크호스트 비트전체 주소 수
/24255.255.255.08256 (2⁸)
/16255.255.0.01665,536 (2¹⁶)
/14255.252.0.018262,144 (2¹⁸) ≈ 25만
/8255.0.0.02416,777,216 (2²⁴)

Stanford 대학의 171.64.0.0/14 네트워크엔 약 몇 개의 주소가 있을까?

주소는 호스트가 아니라 인터페이스에 속한다

지금까지 “주소는 컴퓨터(호스트)의 것”처럼 설명했지만, 더 정확히는 주소는 인터페이스(interface)에 속합니다. 한 컴퓨터가 여러 인터페이스를 가질 수 있고, 각 인터페이스는 0개 이상의 주소를 가질 수 있습니다. 인터페이스는 네트워크에 연결되는 통로 하나하나를 가리킵니다.

  • 유선 이더넷, 와이파이, 루프백(loopback), VPN 터널, 가상 머신용 가상 인터페이스 등이 모두 별개의 인터페이스입니다.
  • 루프백 인터페이스는 거의 항상 127.0.0.1(= localhost)이며, 같은 컴퓨터 안의 프로그램끼리 통신하는 데 쓰입니다. 개발 서버를 localhost:3000으로 띄울 때 이 인터페이스를 거칩니다 — 네트워크 카드를 통하지 않고 OS 내부에서 처리되므로 외부에서는 접근할 수 없습니다.
  • 현재 인터페이스와 주소는 Linux에서 ip addr show, macOS에서 ifconfig로 확인합니다.

개발 서버를 localhost 대신 0.0.0.0으로 띄우면 모든 인터페이스에서 접근을 받겠다는 뜻이 되어, 같은 네트워크의 다른 기기(예: 휴대폰)에서 내 PC의 개발 서버에 접속할 수 있습니다. 모바일 화면을 실기기에서 확인할 때 자주 쓰는 방법입니다.

라우터는 서로 다른 두 IP 네트워크를 잇는 장치(게이트웨이)로, 보통 인터페이스를 2개 이상 가집니다. 로컬 네트워크의 컴퓨터들은 “바깥으로 나가는 기본 출구”인 default gateway를 알고 있어, 자기 네트워크 밖으로 향하는 트래픽을 그쪽으로 보냅니다. 집의 공유기는 ISP 쪽 인터페이스(WAN)와 집 안 쪽 인터페이스(LAN)를 가진 작은 라우터입니다.

NAT와 사설 IP — 주소 고갈에 대한 임시방편

IPv4 주소는 약 40억 개뿐인데, 사람은 그보다 많고 한 사람이 여러 기기를 씁니다. 그래서 ISP는 가정·사무실마다 보통 공인 IP 하나만 할당합니다. 집 안의 여러 기기는 사설 IP(RFC 1918에서 정한 대역, 흔히 192.168.x.x)를 받고, 인터넷 바깥에서는 모두 그 하나의 공인 IP를 쓰는 것처럼 보입니다.

이를 가능하게 하는 것이 NAT(Network Address Translation) 입니다. 공유기가 안팎으로 오가는 트래픽의 주소·포트를 바꿔 쓰면서, 어떤 내부 기기의 어떤 연결인지 매핑 테이블로 관리합니다.

사설(내부)              공인(외부)
192.168.0.11:51000  →   203.0.113.7:40001
192.168.0.12:49500  →   203.0.113.7:40002
192.168.0.11:51200  →   203.0.113.7:40003

여기서 프론트엔드 관점의 결론이 하나 나옵니다. 공인 IP 하나 뒤에 여러 사용자가 있을 수 있다는 것입니다. 따라서 IP 주소로 사용자를 세거나 식별하면 안 됩니다(같은 회사·학교·가정의 사용자들이 한 IP로 보일 수 있음). 사용자 구분은 IP가 아니라 로그인 정보나 세션 쿠키 같은 애플리케이션 계층 수단으로 해야 합니다. 또 IP 기반 요청 제한(rate limit)을 걸면 같은 NAT 뒤의 여러 사용자가 함께 막힐 수 있다는 점도 주의해야 합니다.

“사설(private)“은 비밀이라는 뜻이 아니라 로컬에서만 유효하다는 뜻입니다. 전 세계 수많은 사람이 각자 다른 NAT 뒤에서 똑같은 192.168.0.1을 쓰고 있습니다. 또한 NAT는 외부에서 내부로 먼저 연결하기 어렵게 만들어, 일반 사용자가 집에서 서버를 운영하기 까다롭게 합니다(앞 레슨에서 호스팅 서비스를 쓰는 이유 중 하나).

IPv6 — 근본적인 해결책

IPv6는 주소 길이를 128비트로 늘려 주소 고갈 문제를 근본적으로 해결합니다(IPv5는 실험적 버전으로 끝나서 4 다음이 6입니다). 가장 작은 표준 할당 단위인 /64 하나만으로도 전체 IPv4 주소 공간보다 많은 주소를 담을 수 있습니다.

표기는 16진수 블록을 콜론으로 구분하며, 0이 연속되는 부분은 ::로 줄여 쓸 수 있습니다(예: 2607:f8b0::1). 주소가 충분하므로 NAT 없이 모든 기기가 고유한 공인 주소를 가질 수 있습니다.

IP 주소를 다루는 코드(특히 접속 로그, IP 기반 분석·차단 로직)를 작성한다면 “IP는 32비트 dotted quad”라는 가정을 버려야 합니다. IPv6 주소는 형식이 전혀 다르고, 이미 상당한 비중의 트래픽이 IPv6로 들어옵니다. 정규식이나 파싱 로직이 IPv4만 가정하면 실제 사용자 일부를 놓치게 됩니다.

이 레슨을 다 읽으셨나요?

완료 표시는 이 브라우저에 저장됩니다.