본문 바로가기
개발/Web

[Web] XFF - Load balancers 혹은 Proxy 환경에서 Client IP 가져오기

by zuzuu 2022. 1. 20.
반응형

 

기존에는 request.getRemoteAddr(); 를 통해 Client의 IP를 가져왔는데 웹서버나 WAS 앞에 L4와 같은 Load balancers나 Proxy server, caching server등이 있는 경우는 원하는 결과를 얻지 못하는 것을 발견하였다.

이런 제품은 웹서버 혹은 WAS에 HTTP나 AJP 요청을 보낸 후 받은 결과를 가공하여 클라이언트에 재전송하기 때문에 위와 같은 현상이 발생한 것이다. ( 클라이언트  IP -> 로드밸런서, 프록시 장비 -> 웹서버 )

그래서 등장한 것이 XFF(X-Forwarded-For)이다!

 

XFF 에는 Client와 Proxy IP 가 콤마를 구분자로 들어가게 되어있는데 순서는 아래와 같기 때문에 첫번째 IP를 가져오면 Client의 IP를 획득할 수 있다. 

X-Forwarded-For: client, proxy1, proxy2

 

XFF는 표준이지만 정식  RFC에 포함된게 아니라 모든 제품이 XFF 헤더를 사용하는 것이 아니다. 

예를 들어 WebLogic Connector(mod_wl) 는 XFF 헤더를 사용하지 않고 WL-Proxy-Client-IP 나 Proxy-Client-IP 헤더를 사용한다. 

따라서 제품의 종류에 영향을 받지 않고 Client IP를 가져오고자 한다면 아래와 같이 작성해야 한다.

public String getClientIp(HttpServletRequest request) {
    String ip = null;

    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();
    }

    log.debug("Client IP : " + ip);

    return ip;
}

 

 

728x90
반응형

댓글