백앤드 이야기/JAVA&Spring

[JAVA] 클라이언트단 IP 정보

한희성 2019. 6. 10.
반응형

특정 IP 만 허용하도록 로직을 짤 경우가 있다.


이때 웹서버 앞단에 L4 스위치 또는 프록시 서버 등이 있다면 로컬의 IP 가 아닌 스위치 또는 프록시 서버의 IP 를 가지고오게된다.


이렇게 장비들이 앞단에 있을경우 클라이언트 IP 정보를 request Header에 정보를 담아 요청하게 된다. 이에 따른 소스는 아래와 같다.


private String getRealIpAddress(HttpServletRequest request) {

        String ipAddress = request.getHeader("X-Forwarded-For");

        

if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {

ipAddress = request.getHeader("Proxy-Client-IP");

        }

        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {

        ipAddress = request.getHeader("WL-Proxy-Client-IP");

        }

        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {

        ipAddress = request.getHeader("HTTP_CLIENT_IP");

        }

        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {

        ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");

        }

        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {

        ipAddress = request.getRemoteAddr();

        }

        

        log.info("point1 {} "+ ipAddress);

        if(ipAddress.contains(",")) {

            String [] tmp = ipAddress.split(",");

            ipAddress =  tmp[0].trim();

        }

        log.info("point2 {} "+ ipAddress);

        

        if ("0:0:0:0:0:0:0:1".equals(ipAddress)) {

                InetAddress localIp = null;

try {

localIp = InetAddress.getLocalHost();

} catch (UnknownHostException e) {

log.error("{}", e);

}

ipAddress = localIp.getHostAddress();

        }


        return ipAddress;

    } 


반응형

댓글

💲 추천 글