IT/PHP | CI

[PHP] $_SERVER['REMOTE_ADDR']의 함정: 실제 사용자 IP를 정확히 파악하는 기술

카제인나트륨. 2024. 9. 10. 16:54
728x90
반응형

$_SERVER["REMOTE_ADDR"]를 사용하여 사용자의 IP 주소를 얻는 것은 일반적으로 많이 사용되는 방법입니다. 하지만 이 방법에는 몇 가지 주의사항과 잠재적인 문제가 있을 수 있습니다.

 

문제점

 

1. 프록시 서버 또는 VPN 사용

일반적으로 $_SERVER["REMOTE_ADDR"]는 사용자의 실제 IP 주소를 반환하지만, 사용자가 프록시 서버나 VPN을 사용하는 경우 이 값은 사용자의 실제 IP 주소가 아닌 프록시 서버나 VPN의 IP 주소를 반환할 수 있습니다. 이로 인해 실제 사용자의 위치를 파악하기 어려울 수 있습니다.

 

 

2. 로드 밸런서 또는 리버스 프록시

웹 애플리케이션이 로드 밸런서나 리버스 프록시 뒤에 있는 경우 $_SERVER["REMOTE_ADDR"]는 종종 로드 밸런서나 프록시의 IP를 반환합니다. 이 경우 사용자의 실제 IP 주소를 얻으려면 HTTP 헤더에서 X-Forwarded-For를 확인해야 합니다.

 

 

3. X-Forwarded-For 헤더 사용

보다 정확한 사용자 IP 주소를 얻기 위해 X-Forwarded-For 헤더를 확인할 수 있습니다. 이 헤더는 프록시를 통과하는 동안의 모든 IP 주소를 포함할 수 있으므로 가장 왼쪽에 있는 IP 주소가 원래 클라이언트의 IP 주소입니다. 그러나 이 헤더는 조작될 수 있으므로 보안에 민감한 용도로 사용하기 전에 신중히 검증해야 합니다.

 

 

예제 코드

 

function getUserIP() {
    $client  = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote  = $_SERVER['REMOTE_ADDR'];

    if (filter_var($client, FILTER_VALIDATE_IP)) {
        $ip = $client;
    } elseif (filter_var($forward, FILTER_VALIDATE_IP)) {
        $ip = explode(',', $forward)[0];
    } else {
        $ip = $remote;
    }

    return $ip;
}

$user_ip = getUserIP();
echo "User IP Address: $user_ip";

 

이 함수는 다양한 소스에서 IP 주소를 검사하며, 유효한 IP 주소를 찾으면 반환합니다. X-Forwarded-For에서는 주로 첫 번째 IP 주소를 사용하는 것이 일반적입니다.

 

이러한 접근 방법은 사용자의 실제 IP 주소를 좀 더 정확히 추적하려는 경우 특히 유용합니다. 하지만, 보안 상의 이유로 사용자의 IP 주소를 로그나 데이터베이스에 저장할 때는 항상 주의해야 합니다. 또한 개인정보 보호법을 준수해야 합니다.

728x90
반응형