Springboot API 호출하는 Client IP 수집하기

 

Summry

본 문서에서는 API를 호출하는 Client의 IP Address를 수집하는 방법을 정리한다.

send me email if you have any questions.


예제 코드

public static String getClientIpAddr(HttpServletRequest request) {
    String ip = request.getHeader("X-Forwarded-For");

    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      ip = request.getHeader("Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      ip = request.getHeader("HTTP_CLIENT_IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      ip = request.getHeader("HTTP_X_FORWARDED_FOR");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      ip = request.getRemoteAddr();
    }
    return ip;
  }

request.getRemoteAddr() 를 사용해서 클라이언트의 아이피를 얻을 수 있는데, 중간에 L4 스위치나 프록시 서버 등이 개입되면서 request.getRemoteAddr()의 내용은 변조될 수 있다.
정확한 IP 주소를 추출하기 위해서는 X-Forwarded-For, WL-Proxy-Client-IP 등의 추가되는 header를 모두 살펴보아야 한다.

  • 원래의 정보는 X-Forwarded-For, WL-Proxy-Client-IP 등 추가되는 header에 저장되기 때문

그렇게 차례 차례 검증하면서 내려가면 어떤 장비가 중간에 개입이 되든 정확한 클라이언트의 IP를 추출할 수 있다.

Reference

request.getRemoteAddr()로도 정확한 클라이언트 IP가 추출이 되지 않을 때 해결 방법 - sungmo738
[SpringBoot & Nginx] 클라이언트 IP 수집하기 - Playdev