IP 주소 10진수 변환기

IP 주소를 10진수, 16진수, 2진수, 8진수로 변환하거나, 이런 숫자를 입력해 IP 주소로 되돌립니다. 각 옥텟을 자릿값이 붙은 8비트로 그려 보여 주므로, IP 변환 계산 과정을 그대로 따라갈 수 있습니다.

WHATWG URL Standard와 inet_aton 파싱 · IPv6는 128비트로 정확히 계산 · 브라우저에서 실행

읽은 형식: 점으로 구분한 10진수

각 옥텟의 8비트와 자릿값198.51.100.77 = 3,325,256,781
옥텟128643216842116진수합계× 자릿값= 값
19811000110C6128+64+4+2 = 198× 256³16,777,2163,321,888,768
128+64+4+2 × 256³ = 3,321,888,768
51001100113332+16+2+1 = 51× 256²65,5363,342,336
32+16+2+1 × 256² = 3,342,336
100011001006464+32+4 = 100× 25625625,600
64+32+4 × 256 = 25,600
77010011014D64+8+4+1 = 77× 1177
64+8+4+1 × 1 = 77
합계3,325,256,781
= 3,325,256,781
예시

IP 주소를 입력하거나, 그 10진수·16진수·2진수·8진수 숫자를 입력해 IP 주소로 되돌립니다. 변환은 브라우저에서 이루어지며 아무것도 전송되지 않습니다.

IPv4 · 32비트

3325256781

198.51.100.77 주소를 32비트 숫자 하나로 · 문서용 주소 (RFC 5737)

같은 숫자를 코드로

SELECT INET_ATON('198.51.100.77');3325256781
SELECT '198.51.100.77'::inet - '0.0.0.0'::inet;3325256781
int(ipaddress.ip_address('198.51.100.77'))3325256781
ip2long('198.51.100.77')3325256781
점으로 구분한 10진수
10진수
16진수
옥텟별 2진수
8진수
옥텟별 16진수
옥텟별 8진수
브라우저에서(모두 198.51.100.77 주소를 엽니다)
역방향 DNS 이름
IPv6로(매핑)
IPv4 → IPv6

IP 주소를 10진수로 변환하려면 어떻게 하나요?

네 숫자에 각각 256³, 256², 256, 1을 곱해 더합니다: 192.168.1.1은 192 × 16,777,216 + 168 × 65,536 + 1 × 256 + 1 = 3,232,235,777입니다.

IPv4 주소는 8비트씩 네 조각으로 나눠 쓴 32비트 숫자 하나이므로, 점 표기와 10진수 표기는 같은 값입니다. MySQL 문서는 10.0.5.9 = 167773449를 예로 듭니다.

192.168.1.1을 숫자 하나로: 각 부분에 자릿값을 곱한 뒤 더합니다.
IP 주소 10진수 변환기가 각 옥텟의 비트와 자릿값을 더해 하나의 숫자를 만드는 과정을 보여 주는 화면IP 주소 10진수 변환기가 각 옥텟의 비트와 자릿값을 더해 하나의 숫자를 만드는 과정을 보여 주는 화면어떤 형식으로든 입력점으로 구분한 10진수, 10진수, 16진수, 2진수, 8진수, URL: 입력란이 모두 읽습니다.비트와 자릿값1인 비트마다 그 자릿값을 더합니다: 128 + 64 + 4 + 2 = 198.× 256³, 256², 256, 1각 옥텟에 가중치를 곱한 뒤 합계를 냅니다.모든 형식으로 출력16진수, 2진수, 8진수와 브라우저가 받아들이는 URL, 각각 복사 가능.숫자주소 전체를 32비트 숫자 하나로 보여 주며, 바로 복사할 수 있고 어떤 종류의 주소인지도 알려 줍니다.
198.51.100.77을 비트 단위로: 각 옥텟의 자릿값, 이어서 256³, 256², 256, 1을 곱해 더하면 3,325,256,781이 됩니다.

10진수를 IP 주소로 변환하려면 어떻게 하나요?

16,777,216으로 나누고, 그 나머지를 65,536으로, 다시 그 나머지를 256으로 나눕니다: 세 몫과 마지막 나머지가 네 숫자이므로, 3232235777은 192.168.1.1입니다.

변환기에 숫자를 입력하면 같은 계산을 하고, 16진수, 2진수, 8진수와 브라우저가 받아들이는 형식도 함께 보여 줍니다. 4,294,967,295보다 큰 숫자는 IPv4 주소가 아닙니다. 변환기는 이런 숫자를 IPv6 숫자로 읽고 그렇다고 알려 줍니다.

3,232,235,777을 나눗셈으로 192.168.1.1로 되돌립니다.

IP 주소를 2진수로 변환하려면 어떻게 하나요?

네 숫자를 각각 자릿값 128, 64, 32, 16, 8, 4, 2, 1의 8비트로 씁니다: 192는 128 + 64이므로 11000000이고, 192.168.1.1은 11000000.10101000.00000001.00000001입니다.

자릿값을 왼쪽부터 차례로 보며, 그 값이 들어가면 1을 쓰고 빼고, 들어가지 않으면 0을 씁니다. 168의 경우: 128은 들어감(40 남음), 64는 안 들어감, 32는 들어감(8 남음), 16은 안 들어감, 8은 들어감, 그래서 10101000입니다. 2진수에서 되돌릴 때는 1인 자리의 자릿값을 더합니다.

192.168.1.1의 각 옥텟을 128부터 1까지의 자릿값에 맞춰 본 모습.

IP 주소를 16진수로 변환하려면 어떻게 하나요?

각 옥텟의 8비트를 4비트씩 둘로 나눠 각각을 16진수 한 자리로 씁니다(옥텟 하나는 0x00부터 0xff, 즉 10진수 255까지): 192는 1100 0000, 곧 C0이므로 192.168.1.1은 0xC0A80101입니다.

16진수는 IPv6가 안에 든 IPv4 주소를 적는 방식이기도 합니다: ::ffff:c0a8:101은 192.168.1.1입니다. 브라우저는 16진수 숫자를 호스트로 받아들이므로 http://0xC0A80101/은 192.168.1.1을 엽니다.

16진수 한 자리는 4비트: 192.168.1.1은 C0 A8 01 01입니다.

http://3232235777이 192.168.1.1을 여는 이유는 무엇인가요?

브라우저는 숫자로만 된 호스트를 옛 inet_aton 형식(10진수 숫자 하나만 쓴 형식 포함) 중 어느 것으로 쓴 IPv4 주소로든 읽은 뒤, 점 표기 주소를 불러오기 때문입니다.

각 부분은 10진수(URL Standard), 0x가 붙은 16진수, 앞자리가 0인 8진수일 수 있으며, 부분이 네 개보다 적으면 마지막 부분이 남은 바이트를 채웁니다. 그래서 http://192.168.1/은 192.168.1.1이 아니라 192.168.0.1을 엽니다. ping과 curl도 같은 형식을 받아들입니다.

32비트를 넘는 숫자, 0으로 시작하는 부분 안의 8이나 9, 다섯 번째 부분은 거부됩니다.

주소창에 입력열리는 주소
http://3232235777/192.168.1.1
http://0xC0A80101/192.168.1.1
http://0300.0250.1.1/192.168.1.1
http://127.1/127.0.0.1
http://192.168.1/192.168.0.1
http://4294967296/거부
http://09/거부
http://192.0.2.1.5/거부
WHATWG URL 파서가 각 호스트를 어떻게 처리하는지.

IP 주소의 다른 표기가 보안에 왜 중요한가요?

주소를 텍스트로 비교하는 필터는 속을 수 있기 때문입니다: 2130706433, 0x7f.1, 127.1, ::ffff:127.0.0.1은 모두 127.0.0.1이므로, 필터는 문자열이 아니라 숫자 값을 비교해야 합니다.

OWASP는 이런 인코딩을 SSRF 방어를 우회하는 방법으로 꼽습니다. 실제로 이 버그가 들어간 채 배포된 라이브러리도 있습니다: npm 패키지 netmask와 ip, Python의 ipaddress, Go의 net 패키지는 모두 한때 앞자리 0이나 다른 표기를 잘못 읽었고, 이후 수정되었습니다.

엄격한 파서로 파싱하고, 숫자로 바꾼 다음, 범위를 비교하세요. 차단한 범위의 IPv4 매핑 주소도 함께 차단하세요.

deny 127.0.0.1

문자열로 비교

127.0.0.1차단됨

2130706433통과됨

0x7f.1통과됨

127.1통과됨

::ffff:127.0.0.1통과됨

숫자로 비교

127.0.0.12130706433 · 차단됨

21307064332130706433 · 차단됨

0x7f.12130706433 · 차단됨

127.12130706433 · 차단됨

::ffff:127.0.0.12130706433 · 차단됨

CVE-2021-28918netmask (npm)CVE-2021-29418netmask (npm)CVE-2021-29424Net::Netmask (Perl)CVE-2021-29921Python ipaddressCVE-2021-29923Go netCVE-2024-29415ip (npm)
규칙 하나와 루프백 주소의 다섯 가지 표기, 그리고 관련 보안 권고.

IPv6 주소를 10진수로 변환하려면 어떻게 하나요?

16비트 그룹 여덟 개로 같은 방법을 씁니다: 2001:db8::1은 42540766411282592856903984951653826561이며, 최대 39자리가 되는 숫자라 JavaScript에서는 BigInt가 필요합니다.

IPv6 주소는 2^128개입니다. JavaScript 숫자는 2^53 − 1까지만 정수를 정확히 담으므로, 일반 산술은 IPv6 값을 소리 없이 반올림합니다. Python의 int(ipaddress.ip_address(…))는 정확합니다.

2001:db8::1을 숫자 하나로 바꾼 값과, 일반 JavaScript 숫자로 다룬 결과.

코드와 데이터베이스에서 IP 주소를 숫자로 바꾸려면 어떻게 하나요?

플랫폼의 자체 함수를 부호 없는 타입과 함께 쓰세요: MySQL의 INET_ATON()을 INT UNSIGNED에, PostgreSQL의 inet 뺄셈, Python의 int(ipaddress.ip_address(…)), JavaScript에서는 시프트 뒤에 >>> 0입니다.

부호 있는 32비트 정수는 128.0.0.0 이상의 주소를 담을 수 없습니다: JavaScript의 <<는 192.168.1.1에 대해 -1062731519를 내고, PHP의 ip2long()은 32비트 빌드에서 음수가 됩니다. IPv6에는 MySQL에서 INET6_ATON()과 VARBINARY(16)을 씁니다.

› SELECT INET_ATON('192.168.1.1'), INET_NTOA(3232235777);
3232235777 | 192.168.1.1

MySQL 8.4

› SELECT '192.168.1.1'::inet - '0.0.0.0'::inet,
       '0.0.0.0'::inet + 3232235777;
3232235777 | 192.168.1.1

PostgreSQL 16

› import ipaddress
int(ipaddress.ip_address('192.168.1.1')), ipaddress.IPv4Address(3232235777)
(3232235777, IPv4Address('192.168.1.1'))

Python ipaddress

› '192.168.1.1'.split('.').reduce((n, o) => (n << 8) | +o, 0) >>> 0
3232235777

JavaScript

› echo ip2long('192.168.1.1'), ' ', long2ip(3232235777);
3232235777 192.168.1.1

PHP 8

데이터베이스 두 개와 언어 세 개에서 192.168.1.1을 숫자로 바꾸고 되돌리는 예.

자주 묻는 질문

192.168.1.1은 10진수로 얼마인가요?

3232235777입니다. 각 부분에 자릿값을 곱해 더합니다: 192 × 16,777,216 + 168 × 65,536 + 1 × 256 + 1 = 3,232,235,777. 같은 숫자는 16진수로 0xC0A80101, 2진수로 11000000.10101000.00000001.00000001입니다. 브라우저는 이 숫자를 호스트로도 받아들이므로, http://3232235777/은 http://192.168.1.1/과 같은 주소를 엽니다.

IPv4 주소의 가장 큰 10진수 값은 얼마인가요?

4,294,967,295이며, 255.255.255.255입니다. IPv4 주소는 32비트 숫자이므로 0(0.0.0.0)부터 4,294,967,295까지 2^32 = 4,294,967,296개가 있습니다. 더 큰 숫자는 IPv4 주소가 아닙니다: 브라우저는 http://4294967296/을 거부하고, 이 변환기는 그런 숫자를 128비트 IPv6 값으로 읽고 그렇다고 알려 줍니다.

3232235777을 IP 주소로 되돌리려면 어떻게 하나요?

16,777,216으로 나누면 첫째 부분은 192, 나머지는 11,010,305입니다. 그 나머지를 65,536으로 나누면 둘째 부분은 168, 나머지는 257입니다. 257을 256으로 나누면 셋째 부분은 1, 나머지는 1이며, 이것이 넷째 부분입니다. 답은 192.168.1.1입니다. 변환기에 숫자를 입력하면 각 옥텟의 비트도 함께 보여 줍니다.

IP 주소에서 010 같은 앞자리 0은 무슨 뜻인가요?

프로그램에 따라 다릅니다. 브라우저와 inet_aton은 앞자리가 0인 부분을 8진수로 읽으므로 192.0.2.010은 192.0.2.8이 되지만, 0을 무시하는 도구는 192.0.2.10으로 읽습니다. 두 가지 해석 때문에 요청이 IP 필터를 빠져나가는 버그가 있었던 뒤로, Python과 Go는 이제 이런 주소를 아예 거부합니다. IPv4 주소에는 절대 앞자리 0을 쓰지 마세요.

192.168.1이 192.168.0.1을 여는 이유는 무엇인가요?

부분이 세 개인 주소는 마지막 부분으로 마지막 16비트를 채우기 때문입니다. 192.168.1에서 마지막 1은 16비트 숫자 1, 즉 0.1이 되므로 주소는 192.168.0.1입니다. inet_aton과 브라우저는 짧은 형식을 이렇게 읽으며, 192.168.257이라면 192.168.1.1이 됩니다. PostgreSQL의 cidr 타입은 192.168.1을 다르게, 즉 네트워크 192.168.1.0/24로 읽습니다.

IP 주소를 손으로 2진수로 바꾸려면 어떻게 하나요?

네 숫자 각각에 대해 자릿값 128, 64, 32, 16, 8, 4, 2, 1을 차례로 보며, 그 자릿값이 들어가면 1을 쓰고 빼고, 들어가지 않으면 0을 씁니다. 168의 경우: 128은 들어감(40 남음), 64는 안 들어감, 32는 들어감(8 남음), 16은 안 들어감, 8은 들어감(0 남음), 그래서 10101000입니다. 8비트 그룹 네 개를 점으로 이으면 됩니다.

MySQL에서 IP 주소를 숫자로 저장하려면 어떻게 하나요?

INET_ATON('10.0.5.9')로 변환하면 167773449가 나오며, 이 결과를 INT UNSIGNED 열에 저장합니다: 부호 있는 INT는 127.255.255.255보다 큰 주소를 담을 수 없습니다. 숫자를 다시 텍스트로 바꿀 때는 INET_NTOA를 씁니다. IPv6는 128비트 값이 어떤 정수 타입에도 들어가지 않으므로 INET6_ATON과 VARBINARY(16) 열을 씁니다. 127.1 같은 짧은 형식에는 INET_ATON을 믿지 마세요.

JavaScript나 PHP에서 IP 숫자가 음수로 나오는 이유는 무엇인가요?

부호 있는 32비트 정수로 처리되었기 때문입니다. JavaScript의 << 연산자는 부호 있는 결과를 돌려주므로, 시프트로 만든 192.168.1.1은 -1062731519가 됩니다. >>> 0을 붙이면 3232235777이 나옵니다. PHP의 ip2long도 32비트 빌드에서는 똑같이 동작하며, sprintf('%u', …)로 부호 없는 값을 출력할 수 있습니다. 128.0.0.0 이상의 주소만 영향을 받기 때문에 이 버그는 눈에 띄지 않고 넘어가는 경우가 많습니다.

IPv6 주소도 10진수로 변환할 수 있나요?

네. IPv6 주소는 128비트 숫자이므로 2001:db8::1은 42540766411282592856903984951653826561이고, 가장 큰 값은 39자리입니다. 일반 JavaScript 숫자는 2^53을 넘으면 정밀도를 잃으므로 도구는 BigInt를 써야 하며, 일부 온라인 변환기는 마지막 자릿수를 틀리게 냅니다. Python의 int(ipaddress.ip_address('2001:db8::1'))는 정확한 값을 줍니다.

http://0x7f000001/은 127.0.0.1과 같나요?

네. 브라우저와 여러 명령줄 도구는 0x 뒤의 16진수 호스트를 32비트 숫자 하나로 읽으므로, 0x7f000001, 2130706433, 0x7f.1, 127.1은 모두 루프백 주소 127.0.0.1을 뜻합니다. 그래서 보안 필터는 텍스트가 아니라 숫자 값을 비교해야 하며, 이는 RFC 3986과 OWASP SSRF 치트 시트의 권고이기도 합니다.

부족한 점이 있습니까?기능 또는 새 도구 제안하기