Dev

[WEB] 로그인 클라이언트 IP 를 정확하게 알기 (XFF)

VIPeveloper 2023. 9. 1. 13:07
728x90
반응형

문제 인식

기본적으로 HttpServletRequest 를 이용하여 객체 내 함수로 클라이언트 IP를 가져올 수 있다.

기본 클라이언트 IP 를 가져오는 방법은 아래와 같다.

import javax.servlet.http.HttpServletRequest;

request.getRemoteAddr();

하지만 이 코드를 실 운영에서 이용할 경우 문제가 있다.

 

대부분의 회사에서는 보안 관련 방화벽이나 클라우드로 운영하는 경우가 많은데, 이 경우 클라이언트의 원 IP주소를 가져올 수 없다.

클라이언트가 요청을 하면 Web Server에서 프록시나 로드 밸런서를 통해 WAS에 요청하기 때문에 프록시나 로드 밸런서의 IP 주소를 반환하게 된다. 그래서 원 IP를 못가져오는 현상이 발생한다.

 

해결

아래와 같이 샘플코드 형식으로 작성하면 클라이언트IP를 가져올 수 있다.

public static String getClientIP(HttpServletRequest request) {
    String ip = request.getHeader("X-Forwarded-For");
    logger.info("> X-FORWARDED-FOR : " + ip);

    if (ip == null) {
        ip = request.getHeader("Proxy-Client-IP");
        logger.info("> Proxy-Client-IP : " + ip);
    }
    if (ip == null) {
        ip = request.getHeader("WL-Proxy-Client-IP");
        logger.info(">  WL-Proxy-Client-IP : " + ip);
    }
    if (ip == null) {
        ip = request.getHeader("HTTP_CLIENT_IP");
        logger.info("> HTTP_CLIENT_IP : " + ip);
    }
    if (ip == null) {
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        logger.info("> HTTP_X_FORWARDED_FOR : " + ip);
    }
    if (ip == null) {
        ip = request.getRemoteAddr();
        logger.info("> getRemoteAddr : "+ip);
    }
    logger.info("> Result : IP Address : "+ip);

    return ip;
}

X-Forwarded-For (XFF) 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 원 IP 주소를 식별하는 표준 헤더로 쓰이고 있다.

그래서 프록시나 로드밸런스 등을 사용할 경우 Apache/Nginx에서 설정이 되어있다는 가정하에 클라이언트의 실제 접속 IP를 가져올 수 있다.

 
728x90
반응형