@ 주제 

클라이언트의 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

+ Recent posts