nickjoIT

Java - Client IP 가져오기 본문

PROGRAMING/JAVA

Java - Client IP 가져오기

nickjo 2018. 9. 12. 13:58

관리자 ID일 경우 로그인 할 때 사외 IP로 접근 시에 로그인이 되지 않도록 해둔 로직이 있었는데, 어느 순간부터 사내에 있는 PC로 접근했는데도 로그인이 되지 않는 일이 발생했습니다. 문제를 찾아보니 웹 서버에 접근할 때 L4(Load balancing)이나 Proxy 서버 등을 사용할 때 request.getRemoteAddr(); 로 IP를 가져오면 Client IP가 아니라 L4나 Proxy 서버의 IP를 가져오는 것을 알 수 있었습니다. 이런 장비들의 경우 Client IP를 Header에다가 남겨둔다고 합니다. 따라서, Client IP를 가져오기 위해서는 다음과 같은 로직을 사용해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import javax.servlet.http.HttpServletRequest;
 
public class IPTraceUtils {
 
public static String getRemoteAddr(HttpServletRequest request) {
        String ip = null;
        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.getHeader("X-Real-IP"); 
        }
        if (ip  null || ip.length()  0 || "unknown".equalsIgnoreCase(ip)) { 
            ip = request.getHeader("X-RealIP"); 
        }
        if (ip  null || ip.length()  0 || "unknown".equalsIgnoreCase(ip)) { 
            ip = request.getHeader("REMOTE_ADDR");
        }
        if (ip  null || ip.length()  0 || "unknown".equalsIgnoreCase(ip)) { 
            ip = request.getRemoteAddr(); 
        }
return ip;
    }
}
cs

이런식으로 해주면 본래 Client의 IP를 가져올 수 있습니다. 여기서 getHeader의 문자들은 각 기기들이 주로 Client IP를 남기는 Header의 이름입니다. 아마도 저 정도면 거의 모든 Proxy 환경이나 L4에 대응이 가능할 겁니다. 더 자세한 정보나, 다른 언어에서 IP를 가져오고 싶은 경우에는 아래 링크를 확인하시기 바랍니다.


[참고]

http://karismamun.tistory.com/41

'PROGRAMING > JAVA' 카테고리의 다른 글

스트림(stream)  (0) 2016.03.12
람다식  (0) 2016.03.09
지네릭스(Generics)  (0) 2016.03.08
컬렉션 프레임워크란 무엇인가  (0) 2016.02.18
String과 StringBuffer의 차이점  (0) 2016.02.18
Comments