IP 주소의 기본 개념
인터넷 프로토콜(Internet Protocol)은 현재 버전 4(IPv4)에서 버전 6(IPv6)으로 전환되는 과정에 있습니다. 인터넷에 직접 연결되는 기기가 급증하면서 IPv4가 제공하는 주소 수만으로는 수요를 감당할 수 없게 되었기 때문입니다.
IPv4 주소란?
IPv4 주소는 32비트로 구성되며, 8비트씩 묶인 네 개의 그룹(옥텟, octet)으로 표현됩니다. 각 옥텟은 0~255 사이의 십진수 값을 가지며, 점(.)으로 구분하는 '도트 데시멀(dotted decimal)' 형식을 사용합니다.
예시: 192.168.1.1
CIDR 표기법이 적용된 IPv4 주소는 192.168.1.1/24처럼 표기합니다. 여기서 /24는 앞의 세 옥텟이 네트워크를 식별하고 마지막 옥텟이 노드(호스트)를 식별한다는 의미입니다.
IPv6 주소란?
IPv6 주소는 128비트 길이를 가지며 16진수 표기법을 사용합니다. 주소의 각 자리는 0~f 값의 4비트를 나타내며, 전체 128비트는 콜론(:)으로 구분된 8개 그룹(각 16비트)으로 나뉩니다.
예시: 2001:db8:abcd:100::1/64
모든 IPv6 주소는 CIDR 표기법을 사용하여, 선행 비트 중 몇 비트가 네트워크 식별에 사용되고 나머지 비트가 호스트/인터페이스 식별에 사용되는지를 결정합니다.
ipaddress 모듈 소개
Python 표준 라이브러리에는 IPv4 및 IPv6 주소와 네트워크를 생성·조작·연산할 수 있는 ipaddress 모듈이 포함되어 있습니다. 별도의 외부 라이브러리 설치 없이 바로 사용할 수 있다는 것이 큰 장점입니다.
이 모듈은 IP 주소, 네트워크, 인터페이스를 편리하게 만들 수 있도록 다음과 같은 팩토리 함수를 제공합니다.
ip_address()
인자로 전달된 IP 주소에 따라 IPv4Address 또는 IPv6Address 객체를 반환합니다. IPv4와 IPv6 주소 모두 지원합니다.
>>> import ipaddress
>>> ipaddress.ip_address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.ip_address('2001:ab7::')
IPv6Address('2001:ab7::')
ip_network()
인자로 전달된 IP 주소에 따라 IPv4Network 또는 IPv6Network 객체를 반환합니다.
>>> ipaddress.ip_network('192.168.100.0/24')
IPv4Network('192.168.100.0/24')
>>> ipaddress.ip_network('2001:db8:abcd:100::/64')
IPv6Network('2001:db8:abcd:100::/64')ip_interface()
인자로 전달된 IP 주소에 따라 IPv4Interface 또는 IPv6Interface 객체를 반환합니다.
>>> ipaddress.ip_interface('192.168.100.10/24')
IPv4Interface('192.168.100.10/24')
>>> ipaddress.ip_interface('2001:db8:abcd:100::1/64')
IPv6Interface('2001:db8:abcd:100::1/64')주요 클래스 살펴보기
ipaddress 모듈은 다음과 같은 핵심 클래스를 정의합니다.
IPv4Address(address)
이 생성자는 IPv4 주소 객체를 반환합니다. 유효한 IPv4 주소는 아래 세 가지 형태로 지정할 수 있습니다.
- 0~255 범위의 네 개의 십진수 정수를 점으로 구분한 문자열 (예: 192.168.0.1)
- 이진수로 변환했을 때 32비트가 되는 정수
- 길이가 4인 bytes 객체에 패킹된 정수 (최상위 옥텟이 먼저 오는 순서)
>>> ipaddress.IPv4Address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.IPv4Address(3162581505)
IPv4Address('188.129.42.1')
>>> ipaddress.IPv4Address(b'\xC0\xA8\x00\x01')
IPv4Address('192.168.0.1')IPv6Address()
IPv6 주소 객체를 생성합니다. 유효한 IPv6 주소는 다음과 같이 구성됩니다.
- 네 자리 16진수 숫자 여덟 그룹으로 이루어진 문자열. 각 그룹은 16비트를 나타내며 콜론으로 구분됩니다.
- 128비트 안에 표현 가능한 정수
- 길이가 16인 bytes 객체에 빅엔디안(big-endian) 방식으로 패킹된 정수
>>> ipaddress.IPv6Address('2001:db8::1000')
IPv6Address('2001:db8::1000')
>>> ipaddress.IPv6Address('::abc:7:def')
IPv6Address('::abc:7:def')version 속성
객체에 해당하는 IP 버전 번호를 반환합니다. IPv4는 4, IPv6는 6을 출력합니다.
>>> add = ipaddress.IPv4Address('192.168.0.1')
>>> add.version
4
>>> ip = ipaddress.IPv6Address('2001:db8::1000')
>>> ip.version
6마무리
ipaddress 모듈은 IP 주소 검증, 서브넷 계산, 네트워크 범위 확인 등을 표준 라이브러리만으로 처리할 수 있는 강력한 도구입니다. 네트워크 관련 자동화 스크립트나 백엔드 개발에서 IP를 다룰 일이 있다면 적극적으로 활용해 보시기 바랍니다.