ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 실제 Client IP 구하기
    STUDY/백엔드 2021. 6. 25. 17:31

     

    클라이언트 IP → Proxy 서버 및 장비 → 웹 서버

     

    웹 서버나 WAS 앞에 L4같은 Load Balancer나 Proxy 서버, caching 서버 등의 장비가 있을 경우 웹서버는 Proxy 서버나 장비 IP에서 접속한 것으로 인식한다. 때문에 실제 Client IP가 아닌 앞단에 있는 Proxy 서버 IP를 요청 IP로 인식한다.

    이러한 이유 때문에 Client IP를 얻기 위해 사용하는 HttpServletRequest.getRemoteAddr()를 이용하면 실제 Client IP를 얻기 어렵다. Proxy 서버 IP가 아닌 실제 요청한 Client IP를 얻기 위해서는 HTTP 헤더에 있는 클라이언트의 IP를 찾아야 한다.

    * Load Balancer : 여러 대의 서버가 동작하고 있을 때, 하나의 서비스에서 발생하는 트래픽이 많을 때 여러 대의 서버가 서버의 로드율 증가, 부하량, 속도저하 등을 고려하여 적절하게 처리할 수 있도록 균등하게 트래픽을 분산시켜주는 역할을 한다.

     

    실제 Client IP를 구하기 위해 인터넷에 검색하면 아래와 같은 코드를 확인할 수 있다.

    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();
    }

     

    위 코드에서는 여러 헤더를 확인할 수 있는데, 

     

    이때 표준으로 사용하는 HTTP 헤더는 "X-Forwarded-For"이다. XFF 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 실제 IP 주소를 식별하는 사실상의 표준 헤더이다.

    X-Forwarded-For: <client>, <proxy1>, <proxy2>

     

    문법은 위와 같고, 지시자에 대한 설명은 아래와 같다.

    • <client> : 클라이언트 IP 주소
    • <proxy1>, <proxy2> : 하나의 요청이 여러 프록시들을 거치면, 각 프록시의 IP 주소들이 차례로 열거된다. 즉, 가장 오른쪽 IP 주소는 가장 마지막에 거친 프록시의 IP 주소이다.

     

    따라서 X-Forwarded-For 헤더는 콤마를 구분자로 Client와 Proxy IP 가 들어가게 되기 때문에 첫번째 IP 를 가져오면 실제 요청한 Client IP를 가져올 수 있게 된다.

     

    "Proxy-Client-IP"와 "WL-Proxy-Client-IP"는 WebLogic(WAS)의 web server 연계 모듈인 weblogic connector(mod_wl)에서 사용되는 헤더이다.

     

    "HTTP_CLIENT_IP"와 "HTTP_X_FORWARDED_FOR"는 PHP나 ASP에서 실제 Client IP를 구할 때 사용하는 헤더라고 하는데, PHP에서 사용되는 방식을 보면 아래와 같고

    function getRealClientIp() {
        ...
        if (getenv('HTTP_CLIENT_IP')) {
            ip = getenv('HTTP_CLIENT_IP');
        }
        if(getenv('HTTP_X_FORWARDED_FOR')) {
            ip = getenv('HTTP_X_FORWARDED_FOR');
        }
        ...
    }

     

    ASP에서 사용되는 방식은 아래와 같다.

    string ip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
    if(string.IsNullOrEmpty(ipaddr)) {
        ip = Request.ServerVariables["REMOTE_ADDR"];
    }

    * ASP : 마이크로소프트사에서 동적으로 웹 페이지들을 생성하기 위해 개발한 서버 측 스크립트 엔진이다.

     

     

    https://www.phpinfo.kr/entry/PHP-%EC%8B%A4%EC%A0%9C-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-IP%EC%A3%BC%EC%86%8C-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0

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

    https://www.lesstif.com/software-architect/proxy-client-ip-x-forwarded-for-xff-http-header-20775886.html

     

    'STUDY > 백엔드' 카테고리의 다른 글

    Spring Singleton vs Java static 기반 Singleton  (0) 2024.11.27
    Apache MPM  (0) 2022.01.13
    Java Bean Validation  (0) 2021.05.07
    @Transactional  (0) 2021.05.07
    람다 표현식  (0) 2021.05.06
Designed by Tistory.