PHP를 사용하여 방문자 정보 아이피 위치 추적 사이트 만들기

오늘은 PHP를 사용하여 사이트에 방문한 사람의 IP주소 및 접속 정보와 사용자의 위치를 확인하는 방법에 대해서 알아보겠습니다

 

사용자의 아이피와 아이피 위치정보를 알아내는 방법

간단한 방법으로는 사이트 접속시 User-Agent가 담고 있는 세부 정보를 통해 조회하는 방법이 있습니다

PHP에서 이를 간단하게 사용할수 있도록 제공해주는 Ip Geolocation Api를 사용해보려고 합니다

 

 

User-Agent가 뭔데?

우리가 사용하는 인터넷에는 사용자 에이전트(User Agent)가 존재하는데 이 기능 속에는 사용 중인 OS 정보나 해상도 웹브라우저 버전 종류 등등 많은 정보를 담고 있습니다

 

 

구글에 user agent check라고 입력 후에 검색하면 현재 저의 에이전트가 노출되는 걸 확인할 수 있습니다

windows 10 x64 bit OS에다가 Chrome로 접속했다는 사실이 전부 포함되어 있습니다

사실 이러한 정보를 노출하지 않으려면 유저 에이전트를 스푸핑을 하는 방법도 있지만 이번 포스팅 취지에는 벗어나는 거 같아서 다음번에 다루도록 하겠습니다

 

 

사용자 에이전트(User-Agent)를 조금 더 자세히 보여주는 사이트들이 있는데 궁금하신 분들은 직접 들어가서 확인해보세요

 

 

 

Device Info - Web browser security, privacy, and troubleshooting tool.

"Unknown" only or blank sections require JavaScript enabled/allowed to be detected. User Agent: i A user agent string usually contains the device type, operating system name and version, browser name and version, engine name and version, engine details, an

www.deviceinfo.me

 

AmIUnique

 

amiunique.org

 

 

 

PHP 유저 아이피 조회 방법

 

ip_addres 변수를 임의로 선언한 다음에 해당 변수에 $SERVER['REMOTE_ADDR'];를 넣어줍니다

$SERVER['REMOTE_ADDR'];는 웹서버에 접속한 사용자의 IP 정보를 담고 있습니다

 

User-Agent 정보 중에 아이피 정보나 포트나 프로토콜 등의 기본적인 정보는 PHP의 $_SERVER API를 사용하여 알 수 있습니다

 

아래는 $_SERVER API를 통해 얻을 수 있는 정보들 목록입니다

$_SERVER['DOCUMENT_ROOT'] = 현재 사이트의 서버상 위치 //xampp/html
$_SERVER['HTTP_ACCEPT_ENCODING'] = 인코딩 방식 //gzip,deflate
$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 언어  //ko,en
$_SERVER['HTTP_USER_AGENT'] = 사용자 정보(User-agent) //Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
$_SERVER['REMOTE_ADDR'] = 접속한 사용자 IP //192.168.0.1
$_SERVER['SCRIPT_FILENAME'] = 실행되고 있는 위치와 파일명 //xampp/html.index.php
$_SERVER['SERVER_NAME'] = 도메인 //www.domain.com
$_SERVER['SERVER_PORT'] = 웹에서 사용되는 포트 //80
$_SERVER['SERVER_SOFTWARE'] = 서버에서 사용하는 프로그램 환경 //Apache/PHP 
$_SERVER['GATEWAY_INTERFACE'] = CGI 정보 //CGI/1.1
$_SERVER['SERVER_PROTOCOL'] = 서버 프로토콜 //HTTP/1.1
$_SERVER['APPL_PHYSICAL_PATH'] = 현재 사이트의 실제 파일 주소 //C:\xampp

 

 

 

코드 작성 - 접속 유형별 아이피 값 처리하기

웹 서버에서 만약 클라우드플레어를 사용 중이라면 $_SERVER["HTTP_CF_CONNECTING_IP"] 를 사용하여 아이피를 확인할 수 있습니다

프록시를 통해 사용자가 접속할 경우의 사용자 아이피를 확인하려면 $_SERVER['HTTP_X_FORWARDED_FOR'] 를 사용하면 됩니다

$_SERVER['REMOTE_ADDR'] - 사용자 아이피 확인
$_SERVER['HTTP_X_FORWARDED_FOR'] - 프록시 접속시 사용자의 아이피 확인
$_SERVER["HTTP_CF_CONNECTING_IP"] - 클라우드플레이어를 적용했을경우 아이피 확인

 

1
2
3
4
5
6
7
8
9
10
function getUserIpAddr() {
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
   } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
 
cs

REMOTE_ADDR로 처리하게 되면 나중에 Api에서 접속한 사용자 아이피 값을 넘겨줄 때 사용자가 프록시를 통해 접속하거나 서버에 클라우드플레어가 적용되었을 경우에는 이상한 값을 전달할 수 있으므로 세가 지경우를 if문을 통해 함수로 만들어줍니다

 

 

Ipgelocation Api 사용하기

 

IP Geolocation | IP Address Lookup Sign up

Sign up for IP Geolocation.

ipgeolocation.io

ipgeolocationAPI를 사용하기 위해 공식 홈페이지에서 회원가입을 먼저 진행해주세요

 

 

회원가입 후 볼 수 있는 대시보드 페이지입니다

사진 속에는 API Keys를 가려놓았지만 정상적으로 여러분들만의 API Keys가 보이는 게 정상입니다

이 API Keys는 나중에 사용해야 하므로 따로 옮겨 적어 두세요

 

 

본격적으로 ipgelocation api를 사용하기 위해 공식 홈페이지에서 제공하는 샘플 코드를 사용하려고 합니다

 

대시보드 - Documentation - ip-gelocation-api-php-sdk를 선택하여 아래 페이지로 이동하실수 있습니다

 

IP Geolocation API PHP SDK | PHP GeoIP

IP Geolocation PHP SDK and PHP GeoIP

ipgeolocation.io

 

위 코드는 링크 본문에 나와있는 코드인데 가장 먼저 첫째줄 $apiKey 변수에는 ipgelocation사이트 대시보드에 있는 apikey를 입력해줍니다

$ip변수에 해당하는 ip값은 유저에 따라 지속적으로 바뀌는 동적 데이터이니깐 $_SERVER['REMOTE_ADDR'];를 사용하여 지정해줄 수 있습니다

다만 위에서 말했다시피 유저가 프록시를 사용하거나 서버가 클라우드플레어가 적용되어있을수 있기 때문에 앞서 생성했던 getUserIpAddr() 함수를 넣어주세요

 

 

위와 같이 전체적인 코드를 수정 후에 웹에서 실행해보겠습니다

 

웹에서 보니깐 json 데이터가 표시되는 걸 확인하실 수 있습니다

데이터 내부에는 아이피 정보와 국가정보 위도 경도 정보 등이 담겨있는 걸 확인할 수 있습니다

 

다만 이렇게 보면 가독성이 떨어지기 때문에 html을 통해 테이블을 만들어  json데이터들을 보기 좋게 정리하려고 합니다

이 json데이터들을 html테이블로 어떻게 표기해주나 곰곰이 생각해보다가 ipgelocation api php 예제 소스를 참고하였습니다

 

대시보드 - Documentation - ip-gelocation-api-php-sdk 페이지 내에 하단에 나와있는 샘플코드 중 일부분입니다

해당 코드는 PHP에서 테이블을 생성하여 json데이터를 출력해주고 있는데요

php태그 중 echo에서 마침표. 은 여러 문자열을 연결할 때 사용합니다 그렇담 $decodedLocation['ip']를 php 그대로 가져와서 html에 넣어주면 똑같이 출력이 될꺼같다는 확신이 들어서 바로 사용해봤습니다

 

이런 식으로 html 테이블 td태그 안에 그대로 가져와서 입력 후 웹페이지에서 확인해보니 값이 정상적으로 출력되는 걸 확인할 수 있었습니다

 

이미지 클릭시 크게 보실수 있습니다

css를 제외한 최종적으로 모든 코드 내용입니다 

 

 <td class="text-left"><?php echo $decodedLocation['continent_name'].'('. $decodedLocation['continent_code']. ")" ?></td>

위 코드 중에서 일부분은 Aisa를 출력하는 continent_name변수와 AS를 출력하는 continent_code 변수를 마침표로 나누어 사이에 괄호를 넣어 출력하였습니다 

 

출력: Asia(AS)

 

<td class="text-left"><img src="<?php echo $decodedLocation['country_flag']?>" alt=""></td>

country_flag에는 국가 그림파일이 담긴 url주소를 담고 있는데요 img태그를 사용하여 url주소가 아닌 국가 그림파일이 바로 출력되도록 하였습니다

 

출력 : (대한민국 국기 이미지)

 

<td class="text-left"><?php echo $decodedLocation['time_zone']['name']?></td>

해당 부분은 중첩으로 이루어져 있는 time_zone안에 또 여러 변수중 name에 해당하는 부분을 가져왔습니다

 

출력: UTC +9

 

 

사용자의 User-Agent정보와 아이피주소 및 아이피의 위치정보가 포함되어있음

간단하게 테이블에 데이터 삽입까지 모두 마쳤으며 이제 사이트 접속 시 접속한 사용자의 아이피 주소를 포함하여 각종 정보가 표기되는 걸 확인하실 수 있습니다

 

 

구글맵에 위도와 경도를 입력후 나온 위치

Latitude와 Longitudey부분에 위도와 경도가 표기되는걸 확인하실수 있으며 이를 구글맵에 입력 시 아이피 위치에 해당하는 주소가 나오게 됩니다

ISP에서 제공하는 아이피의 주소가 나오게 되며 아이피만으로는 ISP의 정보제공 없이는 실제 할당받아 사용하고 있는 사용자의 주소를 추적할 순 없습니다 

 

 

 

예외로 구글에서 제공하는 Geolocation를 사용하여 ip의 주소가 아닌 사용자의 GPS를 통한 사용자의 실제 정확한 위치를 알 수 있는 방법도 있는데 이는 다음번에 다루도록 하겠습니다 허가 없이 불특정 사용자의 위치정보 및 아이피 수집은 개인정보상의 위반사항이며 수사당국에 의하여 체포되실 수 있습니다

 

 

Github

 

GitHub - Blue-B/user-agent

Contribute to Blue-B/user-agent development by creating an account on GitHub.

github.com

 

 

참고자료

https://e2xist.tistory.com/638

https://ipgeolocation.io/documentation/ip-geolocation-api-php-sdk.html

https://www.youtube.com/watch?v=JfvUhrNQmNY 

https://www.youtube.com/watch?v=AtYMkY4L1UU 

https://codepen.io/alassetter/pen/nBEVJx

Top