오늘은 PHP를 사용하여 사이트에 방문한 사람의 IP주소 및 접속 정보와 사용자의 위치를 확인하는 방법에 대해서 알아보겠습니다
사용자의 아이피와 아이피 위치정보를 알아내는 방법
간단한 방법으로는 사이트 접속시 User-Agent가 담고 있는 세부 정보를 통해 조회하는 방법이 있습니다
PHP에서 이를 간단하게 사용할수 있도록 제공해주는 Ip Geolocation Api를 사용해보려고 합니다
User-Agent가 뭔데?
우리가 사용하는 인터넷에는 사용자 에이전트(User Agent)가 존재하는데 이 기능 속에는 사용 중인 OS 정보나 해상도 웹브라우저 버전 종류 등등 많은 정보를 담고 있습니다
구글에 user agent check라고 입력 후에 검색하면 현재 저의 에이전트가 노출되는 걸 확인할 수 있습니다
windows 10 x64 bit OS에다가 Chrome로 접속했다는 사실이 전부 포함되어 있습니다
사실 이러한 정보를 노출하지 않으려면 유저 에이전트를 스푸핑을 하는 방법도 있지만 이번 포스팅 취지에는 벗어나는 거 같아서 다음번에 다루도록 하겠습니다
사용자 에이전트(User-Agent)를 조금 더 자세히 보여주는 사이트들이 있는데 궁금하신 분들은 직접 들어가서 확인해보세요
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 사용하기
ipgeolocationAPI를 사용하기 위해 공식 홈페이지에서 회원가입을 먼저 진행해주세요
회원가입 후 볼 수 있는 대시보드 페이지입니다
사진 속에는 API Keys를 가려놓았지만 정상적으로 여러분들만의 API Keys가 보이는 게 정상입니다
이 API Keys는 나중에 사용해야 하므로 따로 옮겨 적어 두세요
본격적으로 ipgelocation api를 사용하기 위해 공식 홈페이지에서 제공하는 샘플 코드를 사용하려고 합니다
대시보드 - Documentation - ip-gelocation-api-php-sdk를 선택하여 아래 페이지로 이동하실수 있습니다
위 코드는 링크 본문에 나와있는 코드인데 가장 먼저 첫째줄 $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
간단하게 테이블에 데이터 삽입까지 모두 마쳤으며 이제 사이트 접속 시 접속한 사용자의 아이피 주소를 포함하여 각종 정보가 표기되는 걸 확인하실 수 있습니다
Latitude와 Longitudey부분에 위도와 경도가 표기되는걸 확인하실수 있으며 이를 구글맵에 입력 시 아이피 위치에 해당하는 주소가 나오게 됩니다
ISP에서 제공하는 아이피의 주소가 나오게 되며 아이피만으로는 ISP의 정보제공 없이는 실제 할당받아 사용하고 있는 사용자의 주소를 추적할 순 없습니다
예외로 구글에서 제공하는 Geolocation를 사용하여 ip의 주소가 아닌 사용자의 GPS를 통한 사용자의 실제 정확한 위치를 알 수 있는 방법도 있는데 이는 다음번에 다루도록 하겠습니다 허가 없이 불특정 사용자의 위치정보 및 아이피 수집은 개인정보상의 위반사항이며 수사당국에 의하여 체포되실 수 있습니다
Github
참고자료
https://e2xist.tistory.com/638
https://ipgeolocation.io/documentation/ip-geolocation-api-php-sdk.html
https://www.youtube.com/watch?v=JfvUhrNQmNY