IT/JAVA
프록시환경에서 clientIP 얻기
음료요정
2021. 12. 17. 18:26
클라이언트와 서버의 중간의 로드밸런서나 프록시를 거치면,
서버 접근 로그에는 로드밸런서나 프록시의 IP 주소를 담고있다.
클라이언트의 원 IP를 알기위해서는 X-Forwarded-For (XFF) 헤더가 표준으로 사용된다.
아래의 코드로 Util 소스에서 처리한다.
WebServer, WAS, L4, proxy 종류와 상관없이 clientIP를 가져오기 위해서는 다음과 같은 순서로 IP를 찾아야한다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
public class LogUtil {
private static Logger logger = LoggerFactory.getLogger(LogUtil.class);
/**
* @param request : HttpServletRequest
* @brief 클라이언트 IP 획득
*/
public static String getClientIP(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
logger.info(">X-Forwarded-For : {}", ip);
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
logger.info(">Proxy-Client-IP : {}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.info(">WL-Proxy-Client-IP : {}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
logger.info(">HTTP_CLIENT_IP : {}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
logger.info(">HTTP_X_FORWARDED_FOR : {}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
logger.info(">getRemoteAddr : {}", ip);
}
logger.info(">Result: IP Address : {}", ip);
if (ip.indexOf(",") > -1) {
ip = ip.split(",")[0];
}
return ip;
}
}