스프링에서 사용자(client) IP 가져오기

2019. 1. 3. 17:02 JAVA/Java




스프링에서 사용자(client) IP 가져오기



클라이언트의 IP 주소는 HttpServletRequest에 있는 getRemoteAddr( ) 메서드를 이용하여 알아낼 수 있다. 그러나 Proxy, Caching server, Load Balancer 등을 거쳐올 경우 getRemoteAddr( ) 를 이용하여 IP 주소를 가지고 오지 못하게 된다.


이럴경우 별도의 처리를 해주어야 한다.



    private String getIp(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(">>>> Result : IP Address : "+ip);
 
        return ip;
 
    }
cs



위의 코드를 이용하면 IP를 가져올 수 있다. 그런데 실행을 하고 나서 IP 주소가 이상하다면?





보통 로컬에서 테스트를 하면 IP 주소가 0:0:0:0:0:0:0:1 이렇게 나오게 된다. 보통 우리가 알고 있는 IP 주소라 하면 192.168.1.1 이런 식으로 4개의 숫자로 표시된다. 이런 방식은 IPv4의 방식이고, 0:0:0:0:0:0:0:1 이렇게 표시되는 것이 IPv6의 표시 방식이다.


기본적으로 로컬의 IP 주소를 가져오면  IPv6 형식으로 IP 주소를 가져오게 되므로 별도의 처리를 해야 한다.




IPv4 형식으로 IP주소 가져오기



톰캣 사용자일 경우




STS나 이클립스를 실행시킨다. 그리고 상단 메뉴에서 [Run] - [Run Configurations] 를 선택한다.





왼쪽 메뉴에서 Tomcat Server at localhost 를 선택한다. 그리고 오른쪽 상단에서 (x)= Arguments 메뉴를 클릭한다.




다음으로 VM arguments 부분에 -Djava.net.preferIPv4Stack=true 를 추가하고 Apply를 클릭한다.





다시 소스 코드를 실행해 보면 IPv4 형식으로 IP 주소가 표시되는 것을 확인할 수 있다.



출처: http://all-record.tistory.com/168 [세상의 모든 기록]