본문 바로가기

개발공부/웹개발

[자바] ip주소 구하기 & (0:0:0:0:0:0:0:1 일때 해결방법)

😏 자바에서 IP주소를 구하는 방법

 String ip = request.getRemoteAddr()


🤧하지만 이것만 쓰면 안된다~!

보통 보안 문제로 방화벽등을 거쳐 요청이나 응답이 가공되어 나가고 들어오기 때문에

getRemoteAddr()만 쓸경우 프록시 서버나 엉뚱한 ip를 얻을 수 있게됩니다.

 

이 문제를 해결하기 위해 등장한 것이  X-Forwarded-For 헤더

developer.mozilla.org/ko/docs/Web/HTTP/Headers/X-Forwarded-For

 

X-Forwarded-For - HTTP | MDN

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

developer.mozilla.org

:  HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는클라이언트의 원 IP 주소를 식별하는 표준 헤더로 쓰이며,

실제 접속 IP를 찾아 낼 수 있다.

 

 

 

🎈 그래서 이 헤더에 값이 있는지 없는지 확인한 후 없으면 getRemoteAddr() 를 쓰면된다.

근데 또 다른 헤더를 사용하는 것들도 있기 때문에 헤더마다 값 있는지 확인해서 실제 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;
}

🌟 이클립스로 로컬에서 돌려봤더니 IP주소가 0:0:0:0:0:0:0:1가 찍히더라

이건 IPV6의 주소를 가져와서 그렇다.

IPV4로 보면 익숙한 127.0.0.1가 맞음.

 

이클립스에서 톰캣실행시 세팅해주면 IPV6로 가져온다 

 

메뉴RUN > Run Configurations > Arguments >에서 -Djava.net.preferIPv4Stack=true 추가해주면됨