PHP : X-FORWARDED-FOR(XFF) 사용방법 – APACHE – 1

 X-Forwarded-For(XFF) 란?

XFF는 HTTP Header 중 하나로 HTTP Server에 요청한 Client의 IP를 식별하기 위한 표준입니다.

웹 서버나 WAS 앞에 L4 같은 Load balancers 나 Proxy server, caching server 등의 장비가 있을 경우 웹서버는 Proxy server 나
장비IP에서 접속한 것으로 인식합니다.
그렇기 때문에 웹서버는 실제 클라이언트 IP가 아닌 앞단에 있는 Proxy서버 IP를 요청한 IP로 인식하고, Proxy장비 IP 로 웹로그를 남기게 됩니다.

클라이언트 IP ⟶ Proxy 서버 및 장비 ⟶ 웹 서버

이 때 웹프로그램에서는 X-Forwarded-For HTTP Hearder에 있는 클라이언트 IP를 찾아 실제 요청한 클라이언트 IP를 알 수 있고,
웹로그에도 실제 요청한 클라이언트 IP를 남길 수 있습니다.
X-Forwarded-For 는 다음과 같이 콤마를 구분자로 Client와 Proxy IP 가 들어가게 되므로 첫번째 IP 를 가져오면 클라이언트를 식별할 수있습니다.

X-Forwarded-For: client, proxy1, proxy2

Apache나 nginx에서 X-Forwarded-For를 사용하려면 따로 설정이 필요합니다.

  • Apache Web Server 에서 XFF 사용 방법

☞로그포맷
기본 로그포맷은 %h 로 리모트 Address 를 사용하므로 다음과 같이 %{X-Forwarded-For}i 를 사용하도록 수정합니다.



httpd.conf 파일 수정

수정 후, apache를 재시작합니다.

LogFormat 변경 후, Access.log 확인 (/var/log/nginx/access.log)



프록시 18.179.238.111 에서 실제 User IP인 219.xxx.xxx.xxx으로 변경

☞GetUserIP() 함수를 만들어 User의 IP를 얻어냅니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
 
function GetUserIP()
{
if (isset($_SERVER))
{
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
return $_SERVER["HTTP_X_FORWARDED_FOR"];
if (isset($_SERVER["HTTP_CLIENT_IP"]))
return $_SERVER["HTTP_CLIENT_IP"];
return $_SERVER["REMOTE_ADDR"];
}
if (getenv('HTTP_X_FORWARDED_FOR'))
return getenv('HTTP_X_FORWARDED_FOR');
if (getenv('HTTP_CLIENT_IP'))
return getenv('HTTP_CLIENT_IP');
return getenv('REMOTE_ADDR');
}
 
$text = GetUserIP();
echo "X_FORWARDED_FOR (Real IP Addr)";
echo "<br>";
echo "Connect Your IP Address : " .$text ;
echo "<br>";
 
echo "NOT X_FORWARDED_FOR (Proxy IP Addr)";
echo "<br>";
$ip = $_SERVER['REMOTE_ADDR'];
echo "Connect Your IP Address : " .$ip
 
?>

☞Apache – PHP – XFF 사용 결과



위 php파일 사용 예시

설정 중


출처 : 본인작성

Powered by Blogger.