request.getRemoteAddr()로도 정확한 클라이언트 IP가 추출이 되지 않을 때 해결 방법

-·2021년 3월 14일
1

request.getRemoteAddr()

를 사용해서 클라이언트의 아이피를 얻을수가있다... 고 하는데 안됨 이상한 IP가 뜬다.ㅜㅜ

그래서 처음에는 request.getRemoteHost() 이것도 있길래 이것도 써봄. 역시 안된다.

구글링하면서 찾은게 중간에 L4 스위치나 프록시 서버 등이 개입되면서

request.getRemoteAddr()의 내용은 변조되기 시작한다. 그래서 정확한 IP추출이 안된단다.

대신 추가적인 header가 생기면서(X-Forwarded-For, WL-Proxy-Client-IP 등) 원래의 정보는 거기에 저장이 된다.

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

추출 메서드 예시

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

출처: https://nine01223.tistory.com/302

좀 더 상세히?

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

내용을 간단하게 요약하면

웹 서버나 WAS 앞에 L4 같은 Load balancers 나 Proxy server(HAProxy), caching server(Varnish), HTTP 서버용 WAS Connector(웹로직 커넥터 - mod_wl, 톰캣 커넥터 - mod_jk 등) 등이 있을 경우

이런 제품들은 웹서버/WAS 에 HTTP 나 전용 프로토콜(AJP)로 요청을 보낸후에 받은 결과를 가공하여 클라이언트에 재전송하게 된다.

그래서 그냥 대충찾을려고하면 내가 원하는 클라이언트의 IP가 아닌 이상한게 나오게된다.

X-Forwarded-For, WL-Proxy-Client-IP, Proxy-Client-IP 요론헤더 들을 찾은뒤에 걸러서 타고가야된다.

profile
거북이는 오늘도 걷는다

0개의 댓글