[PHP] 웹페이지 방문자의 IP 주소를 확인하는 방법
PHP 에서 웹페이지 방문자의 IP 주소를 확인하는 방법은 생각보다 간단했습니다.
일단 PHP 서버단에서 제공하는 $_SERVER
라는 슈퍼 글로벌 배열에서 원하는 정보를 가져오면 되는 아주 간단한 문제였습니다.
$_SERVER
이 $_SERVER
배열은 생각보다 유용한 정보를 많이 담고 있는데, 그 중에서 아래의 변수들을 확인함으로써 방문자의 IP 주소를 확인 할 수 있습니다.
HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
REMOTE_ADDR
HTTP_CLIENT_IP
이름부터 아주 직관적으로 웹사이트 방문자(Client)의 IP 주소를 담고 있는 변수이지만, 신뢰 할 수 없는 헤더(HTTP)를 가지고 있으며, 사용자가 프록시 서버 등을 통해 직접 조작할 수 있기에 굳이 사용할 이유가 없습니다.
저 같은 경우에는 이 변수 자체가 선언조차 안되어 있어서, 과감히 사용자 IP 확인 작업에서 제외했습니다.
HTTP_X_FORWARDED_FOR
두 번째는 HTTP_X_FORWARDED_FOR
변수입니다. 사용자가 웹서버에 접속 할 때 프록시를 거치는 경우, 사용자의 실제 IP 가 담기는 변수입니다. 만약 이 변수에 콤마(,
)로 구분된 여러 개의 IP 주소가 들어가 있다면, 가장 처음에 위치한 IP 주소가 진짜 클라이언트의 IP 주소일 확률이 높습니다.
하지만 HTTP_CLIENT_IP
처럼, 신뢰할 수 없는 헤더(HTTP)를 통해 전달되는 정보라는 점에 주의해야 합니다.
저 같은 경우 HTTP_CLIENT_IP
와 마찬가지로 선언조차 안되어 있더라구요. 그래서 IP 확인 작업에서 역시나 과감하게 제외했습니다.
REMOTE_ADDR
마지막으로 REMOTE_ADDR
입니다. 이 변수에는 PHP 환경에서 웹서버에 요청을 보낸 실제 클라이언트의 IP 주소가 담깁니다.
하지만 만약 사용자가 프록시를 통해 웹서버에 요청을 보낼 경우 가장 마지막의 프록시 서버 IP 주소가 저장되므로, 이 경우 실제 사용자의 IP 주소를 정확하게 확인하기는 어렵습니다.
그럼에도 불구하고 해당 정보는 TCP/IP 핸드셰이크1 과정에서 확정되기 때문에 위변조가 어렵다는 장점을 가지고 있습니다.
가 사용하고 있는 서버에서는 HTTP_CLIENT_IP
, HTTP_X_FORWARDED_FOR
정보는 제공하지 않지만, REMOTE_ADDR
정보는 잘 제공해주고 있기 때문에 아래와 같이 사용자의 IP 주소를 확인하여 사용하기로 했습니다. 저는 아주 라이트한 유저이기 때문에 대략적인 IP 주소만 있으면 되지, 그게 실제 IP 인지 프록시 서버의 IP 주소인지는 크게 중요하지 않았습니다.
솔직히 위 내용 다 필요없고 내가 가벼운 마음으로 웹사이트를 만들고 있는데, 해당 웹사이트에 접속한 사람의 IP 주소가 필요하다면 아래와 같이 해당 정보를 가져와 사용하면 됩니다.
$clientIP = $_SERVER['REMOTE_ADDR']
끝.
참고자료
- $_SERVER, PHP.net
- 인터넷 상에서 두 컴퓨터(서버와 클라이언트)가 서로 통신할 준비가 되었음을 확인하고 연결을 수립하는 과정 ↩