PHPINFO

PHP - 실제 클라이언트 IP주소 가져오기 본문

PHP

PHP - 실제 클라이언트 IP주소 가져오기

2017. 10. 24. 23:44
반응형

PHP개발을 하다보면, 부정사용을 방지하는 목적 등을 위해 사용자의 IP를 체크하는 경우가 있습니다.

보통 아래와 같이 사용하게 된다.

<?php

$ip = $_SERVER['REMOTE_ADDR'];

 

하지만 경우에 따라서는 사용자의 IP주소를 올바르게 가져오지 못하는 경우가 있는데요, 예를 들면 사용자가 프록시 서버를 경유해 특정 웹사이트로 접근하면 프록시 서버에 의해 사용자의 실제 IP주소를 숨길 수 있기 때문입니다.

 

그런데 이러한 경우에도, 다른 방법을 통해 실제 사용자의 IP주소를 알아낼 수 있습니다.

웹사이트에 접근할 때, 여러 가지 헤더정보를 넘겨 주게 되는데, 거기에 원래(실제) 사용자의 IP주소도 같이 넘겨 받게 됩니다. 그 메소드가 "X-Forwarded-For"이고, PHP에서는 "HTTP_X_FORWARDED_FOR" 변수에 저장됩니다.

 

그러므로 HTTP_X_FORWARDED_FOR 변수로 비교 체크하여 불량IP주소를 어느정도 걸러낼 수 있습니다.

 

PHP 환경변수값을 불러오는 getenv() 를 이용하는 방법

<?php

function getRealClientIp() {
    $ipaddress = '';
    if (getenv('HTTP_CLIENT_IP')) {
        $ipaddress = getenv('HTTP_CLIENT_IP');
    } else if(getenv('HTTP_X_FORWARDED_FOR')) {
        $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
    } else if(getenv('HTTP_X_FORWARDED')) {
        $ipaddress = getenv('HTTP_X_FORWARDED');
    } else if(getenv('HTTP_FORWARDED_FOR')) {
        $ipaddress = getenv('HTTP_FORWARDED_FOR');
    } else if(getenv('HTTP_FORWARDED')) {
        $ipaddress = getenv('HTTP_FORWARDED');
    } else if(getenv('REMOTE_ADDR')) {
        $ipaddress = getenv('REMOTE_ADDR');
    } else {
        $ipaddress = '알수없음';
    }
    return $ipaddress;
}

 

웹서버(아파치, nginx 등)를 통해 생성된 값들을 가지고 있는 $_SERVER 배열 변수를 이용하는 방법

<?php

function getRealClientIp() {
    $ipaddress = '';
    if ($_SERVER['HTTP_CLIENT_IP']) {
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    } else if($_SERVER['HTTP_X_FORWARDED_FOR']) {
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else if($_SERVER['HTTP_X_FORWARDED']) {
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    } else if($_SERVER['HTTP_FORWARDED_FOR']) {
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    } else if($_SERVER['HTTP_FORWARDED']) {
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    } else if($_SERVER['REMOTE_ADDR']) {
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    } else {
        $ipaddress = '알수없음';
    }
    return $ipaddress;
}

참고 : HTTP_X_FORWARDED_FOR 는 때로는 내부IP주소 또는 로컬IP주소를 표시하는 경우가 있고, 여러 IP주소일 경우에는 콤마(,)로 구분되어 표시됩니다.

Comments