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;

  }
}