X-Forwarded-For 에서 클라이언트 아이피 얻는 다양한 방법
참조URL: https://www.lesstif.com/software-architect/proxy-client-ip-x-forwarded-for-xff-http-header-20775886.html
개요
CDN -> LoadBalancer -> Server 로 구성된 아키텍처의 서버 내부에서 클라이언트의 아이피를 얻기 위해서는 X-Forwarded-For 헤더를 참조해야 한다. 이 때, 실제 아이피를 얻기 위한 다양한 방법을 살펴본다.
본문
X-Forwarded-For 헤더에 저장되는 아이피
X-Forwarded-For: client, proxy1, proxy2Javascript로 클라이언트 아이피 얻기
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}"HTTP_CLIENT_IP"와 "HTTP_X_FORWARDED_FOR"는 PHP나 ASP에서 실제 Client IP를 구할 때 사용하는 헤더라고 하는데, PHP에서 사용되는 방식을 보면 아래와 같고
<?
#include_once('./_common.php');
$ip;
function getRealClientIp() {
if (getenv('HTTP_CLIENT_IP')) {
$ip = getenv('HTTP_CLIENT_IP');
}
if(getenv('HTTP_X_FORWARDED_FOR')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
}
return $ip;
}
$ip = getRealClientIp();
echo $ip;
?>Apache Web Server 로그에 클라이언트 아이피 기록하기
아파치 웹 서버에서 엑세스 로그에 클라이언트 아이피를 기록하게 하기 위해서는 LogFormat 지시자에서 Remote Address 를 사용하는 대신 X-Forwarded-For를 사용하도록 수정해야 한다.
수정 전
LogFormat "%h %l %u %t "%r" %>s %b" common
수정 후
LogFormat "%{X-Forwarded-For}i %l %u %t "%r" %>s %b" commonNginx Web Server 로그에서 클라이언트 아이피 기록하기
nginx 는 --with-http_realip_module 옵션을 주고 컴파일해야 실제 ip 를 얻어올 수 있다. 배포판에 포함된 nginx 는 기본 컴파일 옵션일 것이라고 생각되며 다음 명령어로 지원 여부를 확인할 수 있다.
nginx -Vnginx 가 지원한다면 다음 설정을 nginx.conf 에 넣어주면 실제 ip 가 로그 파일에 기록되며 L4나 proxy 가 여러 개일 경우 set_real_ip_from 키워드 뒤에 IP 를 개행해서 적어주면 된다.
http {
set_real_ip_from 192.168.1.0/24; # proxy/L4 서버 IP
set_real_ip_from 192.168.2.1;
real_ip_header X-Forwarded-For; #proxy/L4 가 실제 IP 를 설정하는 HTTP HeaderApache Tomcat 의 Access log
tomcat 의 access log 는 XFF 헤더를 사용하지 않으므로 아래 밸브를 추가하고 Access Log 의 패턴을 수정한다.
<Valve className="org.apache.catalina.valves.RemoteIpValve" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%{x-forwarded-for}i %l %u %t "%r" %s %b %{User-Agent}i" />Last updated
Was this helpful?