Proxy 환경에서  request.getRemoteAddr() 사용시 127.0.0.1만 리턴되는 문제
nginx 프록시 웹서버와 Tomcat을 연동하여 사용중인 환경에서 request.getRemoteAddr() 사용시 모든 클라이언트의 IP가 127.0.0.1로 리턴되는 문제가 있었습니다.

엄밀히 따지자면 최초에는 "엇 왜 다 127.0.0.1이 나오지?" 라고 생각하다가 이번에 버전을 업그레이드 시킨 톰캣문제인가 싶어서 Servlet API를 보니 마지막에 클라이언트 또는 마지막 프록시가 보낸 요청의 IP를 리턴한다는 사실을 알게되었습니다. 이때 "아차 nginX가 있구나." 라고 생각했죠.




해결 방법
구글링을 프록시를 사용하는 경우에는 getRemoteAddr()를 사용하지 않고 다음의 몇 가지 헤더값으로 IP를 판단해야 된다고 하는데 WAS 종류마다 사용하는 헤더값이 조금씩 다를 수 있다고 합니다. 

저의 웹 서버 환경에서는 HTTP_X_FORWARDED_FOR 헤더를 사용해서 해결했습니다만 개인의 환경에 따라 다를 수 있으니 IP를 구하는 메서드로 따로 빼두고 다음의 소스를 사용하여 헤더값을 하나하나 검사하면 좋을 것 같습니다. 
String ip = request.getHeader("X-Forwarded-For");
 
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {                    
     ip = request.getHeader("Proxy-Client-IP");
}
 
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
     ip = request.getHeader("WL-Proxy-Client-IP");
}
 
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
     ip = request.getHeader("HTTP_CLIENT_IP");
}
 
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
     ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
 
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
     ip = request.getRemoteAddr();
}
cs

 

 

NginX 설정
만약 위의 방어코드로도 IP가 나오지 않는다면 이때는 중간 PROXY 서버에서 설정을 바꿔주어야 합니다. nginX의 경우에는 다음과 같이 설정해 주면 됩니다. 다음과 같이 설정해주면 위의 소스중 X-Forwarded-For 헤더만 사용하면 되겠네요.

vim /etc/nginx/nginx.conf
http {
set_real_ip_from  127.0.0.1; #proxy 또는 L4 서버의 IP
set_real_ip_from  192.168.0.1;  #proxy 서버가 여러개인 경우 다음줄에 추가 가능.            
real_ip_header      X-Forwarded-For; #IP 헤더 세팅 설정
cs



참고 사이트
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,