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
'IT노트(구) > Java' 카테고리의 다른 글
에러 해결 방법 - com.jcraft.jsch.JSchException: UnknownHostKey.. A key fingerprint is .. (0) | 2016.03.08 |
---|---|
web.xml에 등록하지 않고 listener 구현하기(WebListener 어노테이션 사용) (0) | 2016.02.16 |
jdk 1.4 이하에서 HttpURLConnection 타임아웃 설정 방법 (0) | 2016.01.23 |
HttpURLConnection에서 타임아웃 설정하는 방법 (0) | 2016.01.23 |
ResultSet을 ArrayList<HashMap>로 변환하는 방법 (0) | 2016.01.22 |