DevUtils
기술 가이드
네트워크 & 프로토콜5분 읽기

IPv4 주소 고갈과 IPv6 전환, NAT 및 공인/사설 IP의 동작 원리

32비트 IPv4와 128비트 IPv6의 차이, CIDR 서브넷 마스킹, 사설 IP 대역(RFC 1918), NAT 주소 변환, 리버스 프록시 IP 스푸핑 방어 및 WebRTC IP 누출을 다룹니다.

실시간 온라인 도구 바로가기

내 IP 주소 확인

서버 전송 없이 100% 브라우저 로컬에서 안전하게 직접 테스트하고 검증해보세요.

도구 실행하기

IP 주소 체계의 본질: 32비트 IPv4 vs 128비트 IPv6

인터넷 프로토콜(IP)은 전 세계 분산 네트워크에서 패킷이 목적지 장비까지 라우팅될 수 있도록 컴퓨터에 부여하는 네트워크 계층 식별자입니다. 1981년 RFC 791로 정의된 IPv4는 32비트 이진수로 구성되어 있으며, 점으로 구분된 4개의 10진수 옥텟(192.0.2.1)으로 표기합니다. IPv4가 수용할 수 있는 주소의 이론상 총합은 약 43억 개(2^32)에 불과하며, 2011년에 IANA의 공인 IPv4 주소 풀은 공식적으로 완전 고갈되었습니다.

스마트폰, 클라우드 가상 머신, IoT 장비의 폭발적 증가에 대응하여 IETF가 표준화한 차세대 규격이 IPv6(RFC 8200)입니다. 주소 길이를 128비트로 대폭 확장하여 콜론으로 구분된 8개의 16진수 그룹(2001:0db8:85a3:0000:0000:8a2e:0370:7334)으로 표기하며, 약 3.4 × 10^38개(2^128)라는 사실상 무한대에 가까운 주소를 제공합니다.

서브넷팅과 CIDR(Classless Inter-Domain Routing) 표기법

현대 네트워크는 IP 주소 낭비를 줄이기 위해 CIDR 표기법(RFC 4632)을 사용합니다. IP 주소 뒤에 슬래시(/)와 접두사 길이를 붙여, 상위 몇 비트가 네트워크 주소이고 하위 몇 비트가 개별 호스트 주소인지를 나타냅니다:

  • /24 서브넷 (256개 주소): 소규모 사무실이나 가정용 공유기 대역 (192.168.1.0/24). 상위 24비트가 고정 네트워크이고, 하위 8비트가 호스트입니다 (네트워크 주소와 브로드캐스트 주소를 뺀 254개 사용 가능).
  • /16 서브넷 (65,536개 주소): AWS VPC나 대규모 사내망 클러스터 대역 (10.0.0.0/16).
  • /32 표기법: 단 하나의 고유 호스트 IP 자체를 가리킵니다.

공인 IP vs 사설 IP(RFC 1918)와 NAT(Network Address Translation)

IPv4 고갈 속도를 늦추기 위해 RFC 1918 표준은 외부 인터넷과 직접 라우팅되지 않는 3대 사설 IP(Private IP) 대역을 지정했습니다:

  • 10.0.0.0/8 (10.0.0.0 ~ 10.255.255.255)
  • 172.16.0.0/12 (172.16.0.0 ~ 172.31.255.255)
  • 192.168.0.0/16 (192.168.0.0 ~ 192.168.255.255)

가정이나 회사 내부에서는 수백 대의 장비가 사설 IP를 쓰지만, 인터넷으로 나갈 때는 공유기나 NAT 게이트웨이가 패킷 헤더의 사설 IP/포트를 단 하나의 공인 IP(Public IP)로 동적 변환(PAT)하여 전송합니다.

웹 서버가 실제 클라이언트 IP를 감지하는 방법과 스푸핑 위험

Cloudflare 같은 CDN이나 로드 밸런서(ALB) 뒤에 위치한 백엔드 웹 서버는 소켓 수준에서 오직 리버스 프록시의 IP만 보게 됩니다.

프록시는 원래 사용자의 공인 IP를 X-Forwarded-For: client, proxy1 또는 CF-Connecting-IP 같은 HTTP 요청 헤더에 실어 보냅니다. 하지만 백엔드 서버가 신뢰할 수 있는 프록시 대역인지 검증하지 않고 헤더 값을 그대로 신뢰하면, 공격자가 악의적으로 조작한 가짜 헤더를 주입하여 IP 기반 차단이나 접근 제어를 우회하는 IP 스푸핑 공격에 노출됩니다.

요청이 우리 프록시를 거쳐 왔더라도 X-Forwarded-For의 맨 앞 값은 클라이언트가 보낸 그대로입니다. 각 프록시는 자신이 본 IP를 뒤에 덧붙일 뿐이므로, 목록을 오른쪽부터 읽어 우리 프록시가 아닌 첫 번째 IP를 사용해야 합니다.

JAVASCRIPTDevUtils Code Reference
// 프록시 환경에서 클라이언트 실제 IP를 안전하게 추출하는 로직
export function getTrustedClientIp(req, trustedProxySubnets) {
    const directSocketIp = req.socket.remoteAddress;

    // 신뢰할 수 있는 우리 리버스 프록시에서 온 요청일 때만 헤더를 참조
    if (!isIpInSubnet(directSocketIp, trustedProxySubnets)) {
        return directSocketIp;
    }

    // 프록시는 X-Forwarded-For 뒤쪽에 IP를 덧붙이므로, 앞쪽 값은 클라이언트가
    // 임의로 넣을 수 있습니다. 오른쪽부터 읽어 우리 프록시가 아닌 첫 IP를 반환합니다.
    const hops = (req.headers['x-forwarded-for'] || '')
        .split(',')
        .map((ip) => ip.trim())
        .filter(Boolean);
    for (let i = hops.length - 1; i >= 0; i--) {
        if (!isIpInSubnet(hops[i], trustedProxySubnets)) {
            return hops[i];
        }
    }
    return directSocketIp;
}

WebRTC 사설 IP 누출과 브라우저 개인정보 보호

브라우저 P2P 영상/음성 통신 표준인 WebRTC는 NAT 환경을 뚫기 위해 STUN 프로토콜을 사용해 네트워크 후보(ICE Candidate)를 수집합니다. 과거 이 과정에서 VPN을 켜두었더라도 사용자의 실제 로컬 사설 IP(심지어 실제 ISP 공인 IP)가 웹사이트 자바스크립트로 유출되는 취약점이 있었습니다. 최신 브라우저는 mDNS 식별자를 통해 이를 방어합니다. 내 IP와 네트워크 상태는 DevUtils My IP 도구에서 실시간으로 점검할 수 있습니다.

태그:네트워크IPv4IPv6NAT보안
실시간 온라인 도구 바로가기

내 IP 주소 확인

사용자의 공인 IP 주소 및 위치, 통신사 정보 실시간 확인 도구.

도구 실행하기