본문 바로가기
ETC/개발환경 설정

Java 요청 IP 확인 방법

by heekng 2021. 8. 29.
반응형

Java 요청 IP 확인 방법

HttpServletRequest객체에서 IP주소 받아오기


요청한 클라이언트의 IP주소는 HttpServletRequst 객체를 통해 받아올 수 있다.

protected String getClientIpAddr(HttpServletRequest req) {
        String ip = req.getHeader("X-Forwarded-For");

        log.info(">>>> X-FORWARDED-FOR : " + ip);

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getHeader("Proxy-Client-IP");
            log.info(">>>> Proxy-Client-IP : " + ip);
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getHeader("WL-Proxy-Client-IP");
            log.info(">>>> WL-Proxy-Client-IP : " + ip);
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getHeader("HTTP_CLIENT_IP");
            log.info(">>>> HTTP_CLIENT_IP : " + ip);
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getHeader("HTTP_X_FORWARDED_FOR");
            log.info(">>>> HTTP_X_FORWARDED_FOR : " + ip);
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getRemoteAddr();
        }

        log.info(">>>> Result : IP Address : "+ip);

        return ip;
    }
참고문서
Proxy(프락시) 환경에서 client IP 를 얻기 위한 X-Forwarded-For(XFF) http header
XFF 는 HTTP Header 중 하나로 HTTP Server 에 요청한 clinet 의 IP 를 식별하기 위한 사실상의 표준이다. 웹 서버나 WAS 앞에 L4 같은 Load balancers 나 Proxy server( HAProxy), caching server( Varnish), HTTP 서버용 WAS Connector(웹로직 커넥터 - mod_wl, 톰캣 커넥터 - mod_jk 등) 등이 있을 경우 이런 제품들은 웹서버/WAS 에 HTTP 나 전용 프로토콜(AJP)로 요청을 보낸후에 받은 결과를 가공하여 클라이언트에 재전송하게 된다.
https://www.lesstif.com/software-architect/proxy-client-ip-x-forwarded-for-xff-http-header-20775886.html

Intellij에서 Ipv4 출력 설정

위 방법으로 print또는 log를 찍게 된다면 ipv6형식의 ip가 출력된다.

intellij기준 ipv4형식으로 출력을 원한다면 다음과 같이 설정한다.

  1. 톰캣(또는 사용자의 WAS) configuration의 VM options
  1. 설정 코드 추가
    -Djava.net.preferIPv4Stack=true
    -Djava.net.preferIPv4Addresses=true
  1. 재실행
반응형