@ 주제
클라이언트의 IP를 가져오기
@ 목적
클라이언트의 IP를 가져와 용도에 맞게 사용해본다.
@ 내용
클라이언트의 IP 가져오기 정리
- 관리자 페이지의경우 일반 사용자의 접근을 제한하기 위해
- 데이터베이스에 IP를 등록해놓고 interceptor에서 등록된 IP가 아닌경우 접근을 제한하게할 수 있다.
- 1. interceptor을 생성한다.
-> class를 생성하고 extends HandlerInterceptorAdapter해준다.
-> 접근을 제한할거니까 preHandle를 override해준다.
-> (preHandle은 클라이언트의 요청을컨트롤러에 전달하기전에 호출된다. )
- 2. 클라이언트의 IP값을 가져온다.
-> request.getRemoteAddr(); // 클라이언트의 ip를 얻을 수 있다.
-> * 로컬에서 테스트하면 return 0:0:0:0:0:0:0:1 하니까 정확하게 확인해보고 싶으면 아이피로 접근하던 개발에서 접근해서 확인하면된다.
- 3. 등록된 관리자들의 ip를 가져온 뒤 요청온 ip와 비교하여 관리자가 맞으면 접근가능하게. 관리자가 아니라면 접근불가페이지로 보낸다.
--
request.getRemoteAddr(); 요것만 사용해서 ip를 가져오면 된다고 알고있었는데
request.getHeader("X-Forwarded-For") 가 null인지를 먼저 확인해야하는걸 알았다.
X-Forwarded-For(XFF)는 HTTP Header 필드 중 하나이고..
웹 서버나 WAS 앞에 L4 같은 Load balancers 나 Proxy server, caching server 등의 장비가 있을 경우 웹서버는 Proxy server 나
장비IP에서 접속한 것으로 인식합니다.
그렇기 때문에 웹서버는 실제 클라이언트 IP가 아닌 앞단에 있는 Proxy서버 IP를 요청한 IP로 인식하고, Proxy장비 IP 로 웹로그를 남기게 됩니다.
그리고 XFF 는 사실상의 표준이지 정식 RFC 에 포함된게 아니므로 대개는 착실하게 저 헤더를 사용하지만 엉뚱한 헤더를 사용하는 제품들이 있다고합니다.
중에 하나인 WebLogic Connector(mod_wl) 는 저 헤더를 사용하지 않고 WL-Proxy-Client-IP 나 Proxy-Client-IP 같은 전혀 엉뚱한 헤더를 사용하므로 만약 만드는 웹 어플리케이션이
WebServer, WAS, L4, proxy 종류에 상관없이 client IP 를 잘 가져오기를 바란다면 다음과 같은 순서로 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();
}
--결론
클라이언트의 올바른 ip주소를 가져오려면 위와같이 실행해서 결과를 가져와야한다.
왜냐면 프록시들의 주소를 가져올 수 있기때문에~~ 그리고 was 환경마다 X-Forwarded-For를 엉뚱하게 사용하는게 있기때문에!!
'Java' 카테고리의 다른 글
directory 파일 목록 출력하기 (0) | 2020.08.25 |
---|---|
FILE 정보 확인해보기 (0) | 2020.08.25 |
File 정리 (0) | 2020.08.18 |
JAVA ) 직접 경험한 경력직 기술 면접 질문 모음 (0) | 2020.07.20 |
JAVA 언어의 장단점 (0) | 2020.07.13 |