본문 바로가기

IT노트(구)/Java

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

request.getRemoteAddr()를 사용해서

클라이언트의 아이피를 100% 정확하게 얻을 수 있다면

이보다 좋은 일은 없을 것이다!

하지만 중간에 L4 스위치나 프록시 서버 등이 개입되면서

request.getRemoteAddr()의 내용은 변조되기 시작한다!

대신 추가적인 header가 생기면서(X-Forwarded-For, WL-Proxy-Client-IP 등)

원래의 정보는 거기에 저장이 된다!(따라서 그 헤더를 추출하면 클라이언트의 아이피를 정확하게 얻을 수 있다!)

아래와 같은 메소드를 구현하면

어떤 장비가 중간에 개입이 되든 정확한 클라이언트의 IP를 추출할 수 있다!(X-Forwared-For 헤더부터 검증한 뒤 점점 내려가는 구조이다!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}
cs


출처 :
http://stackoverflow.com/questions/4678797/how-do-i-get-the-remote-address-of-a-client-in-servlet