2014년 1월 9일 목요일

[JSP] 접속된 클라이언트의 아이피 확인하는 방법

접속하는 클라이언트의 아이피를 확인 하려면 HttpServletRequest 객체에서 가져와서 확인하면 된다. 

request.getRemoteAddr() ;


그러나 프록시나 Load Balancer 같은것을 겨쳐 오게 되는 경우 위의 방법으로는 정확한 아이피를 가져 오지 못하게 된다. 


그래서 다음과 같이 메소드를 구현해서 사용 하는 것이 편리하다. 



public String getClientIP(HttpServletRequest request) {

    String ip = request.getHeader("X-FORWARDED-FOR"); 
   
    if (ip == null || ip.length() == 0) {
        ip = request.getHeader("Proxy-Client-IP");
    }

    if (ip == null || ip.length() == 0) {
        ip = request.getHeader("WL-Proxy-Client-IP");  // 웹로직
    }

    if (ip == null || ip.length() == 0) {
        ip = request.getRemoteAddr() ;
    }
   
    return ip;

}



** localhost에서 테스트 하는 경우 0:0:0:0:0:0:0:1 값으로 넘어 오는 경우가 있다.

이 값은 IPv6 에서 IPv4의 127.0.0.1 과 같은 값이다.
Tomcat으로  개발시 이게 문제가 되는 경우 vm arguments에  -Djava.net.preferIPv4Stack=true 값을 넣어 주면 된다.


댓글 12개:

  1. 답글
    1. 도움이 되었다니 저도 기쁩니다.. 처음으로 댓글을 달아 주셨네요. ^^

      삭제
  2. 좋은정보감사합니다. 블로그에 담아둘게요~

    답글삭제
  3. 완전 감사합니다!! 덕분에 문제 해결됐어욘 ^_^

    답글삭제
  4. 저도 감사합니다~

    답글삭제
  5. 정말 좋은내용 감사합니다. 혹시 하나만 여쭤봐도될까요?
    ip가 127.0.0.1 이런식으로 나오는데 이것은 local인거같은데 지금 사용하고있는 ip를 출력하고 싶은데 어떤식으로 해야할지 모르겠네요,,

    답글삭제
    답글
    1. 127.0.0.1 은 localhost가 맞습니다. 해당 정보는 브라우져가 주는 값으로 서버 설정으로 처리 하지는 못할 것 같습니다. 단, 브라우져에서 접속시 URL에 실제 아이피를 넣어서 접속하시면 해당 아이피가 나올것으로 예상됩니다.

      삭제
  6. 안녕하세요~좋은 정보감사합니다 ^^
    근데 로컬 이클립스에 적용한 후 개발서버(centos7)에 배포해서
    테스트 해봤는데요~~클라이언트ip가 안찍히고 이상한 ip가 찍히는데... 혹시 어디를 확인해야되는지 아시는지요?
    - 로컬 window7 테스트 완료
    - 개발서버 centos7 클라이언트ip가 아닌 다른 ip

    답글삭제
    답글
    1. 만약 내 컴퓨터의 IP가 아닌 다른 IP가 찍힌다면 로컬에서 개발서버로 접속하는 사이에 공유기 같은 다른 네트워크 대역으로 변환해주는 장비가 있을 겁니다.

      삭제