WEB/PHP

PHP REMOTE_ADDR로 사용자의 ip가 ipv4인지 ipv6인지 확인하는 방법

Ezcode 2022. 6. 29. 15:08

 

기존 흔히 알고 있는 ipv4 주소 체계가 고갈되는 문제로 인해

기존 32비트였던 ip주소 체계에서 -> 128비트의 무제한에 가까운 주소체계가 할당되고 있는데

이것이 ipv6 주소.

 

 

ipv6주소는 16진수로 0000: 형태로 총 8개의 구조로 연결되고

앞부분 4개는 네트워크 주소, 뒷부분 4개는 인터페이스 주소라고 한다.

 

 

대충 쉽게 말해 12년도쯤 한국에 할당된 ipv4가 112,231,936개라 하는데

인터넷에 접속되는 컴퓨터의 증가로 주소가 모자르기 때문에 더 많은 주소 체계인 ipv6주소를 할당하고 있다는 이야기

(실제 ipv6주소는 할당 가능한 수치가 340,282,366,920,938,463,463,374,607,431,768,211,456개라고 한다 +_+;)

 

 

작업중 특정 대상에 따른 ip주소를 수집하고 있었는데

ipv6주소 역시 수집함과 동시에 ipv4주소와 ipv6주소의 분리 및 확인이 필요하여

간단하게 사용할 함수를 기록해 둔다.

 

<?php
function chk_real_ip(){   
	if(!empty($_SERVER['HTTP_CLIENT_IP']) && getenv('HTTP_CLIENT_IP')){   
    	return $_SERVER['HTTP_CLIENT_IP'];   
    }   
    elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && getenv('HTTP_X_FORWARDED_FOR')){   
        return $_SERVER['HTTP_X_FORWARDED_FOR'];   
    }   
    elseif(!empty($_SERVER['REMOTE_HOST']) && getenv('REMOTE_HOST')){   
        return $_SERVER['REMOTE_HOST'];   
    }   
    elseif(!empty($_SERVER['REMOTE_ADDR']) && getenv('REMOTE_ADDR')){   
        return $_SERVER['REMOTE_ADDR'];   
    }   
    return false;   
}

function chk_ipv6() {
    $ip = chk_real_ip();
    if(!preg_match("/^([0-9a-f\.\/:]+)$/",strtolower($ip))) {
        return false;
    }

    if(substr_count($ip,":") < 2) {
        return false;
    }

    $part = preg_split("/[:\/]/", $ip);
    foreach($part as $i) {
        if(strlen($i) > 4) {
            return false;
        }
    }
    return true;
 }

 if(chk_ipv6() === true){
    echo "접속하신 주소는 ipv6주소";
 } else {
    echo "접속하신 주소는 ipv4주소";
 }
 ?>

 

ps. 오랫만에 티스토리를 다시 시작하려고 하는데

스킨이 많이 없어졌네..ㅠ_ㅠ