JSP 프로그래밍을 하다 보면 클라이언트의 아이피 주소를 가져와야 하는 코드를 분명히 작성하게 될 텐데요.
클라이언트의 IP주소를 가져오는 구문은 다음과 같습니다.
Request.getRemoteAddr()
Request 객체의 getRemoteAddr() 메서드를 호출합니다.
결과값을 찍어 보시면 어떠신가요?
만약 로컬 PC로 디버깅 상태로 테스트하셨다면 127.0.0.1 값을 반환 받으셨나요? 아마 특별한 경우가 아니라면 방금 말씀드린대로 기존 IP주소 체계인 IPv4 방식의 IP값을 반환할 것입니다.
그래서 IP주소 값을 검증할 필요가 있는 코드에서(해외IP 차단 등의 이유로) 위의 코드를 받아와 별도로 관리하고 있는 IP목록과 비교하는 루틴을 작성하였는데, 계속 오류를 발생시켰습니다. 무언가 형식에 맞지 않는 형태의 데이터가 넘어와서 인데요.
그래서 디버깅으로 확인해 보니, 왠걸 127.0.0.1 이 아닌, 0:0:0:0:0:0:0:1 값을 반환하는 것입니다. 즉 IPv6 의 형태의 값을 반환하였습니다.
(참고로 자신의 시스템(로컬호스트) IP 주소는 127.0.0.1(IPv4), 0:0:0:0:0:0:0:1(IPv6) 로 항상 표시되는데, 이는 공통된 규약 주소로 루프백 주소(Loopback Address)라고 합니다.)
IPv6는 IPv4의 주소 공간 한계로 할당할 수 있는 IP공간을 늘린 주소 체계를 가진 인터넷 프로토콜을 의미합니다.
IPv4는 32비트의 주소 공간을 사용하며, IPv6는 128비트의 주소 공간을 사용합니다.
IPv4의 32비트로 구분할 수 있는 공간은 대략 2^32 로 약 42억 개 정도인데, 아직은 어느정도 버틸 수 있을지 모르지만, 유비쿼터스 환경, 사물 인터넷 환경이 어느정도 자리잡게 되면 냉장고, TV, 전자렌지, 전화기 등 대부분의 전자제품에 네트워크 주소가 할당되게 된다면 아마 그 주소수는 수십억이 아니라 수십조 이상이 될 것으로 생각됩니다. IPv6는 2^128 개의 주소를 할당할 수 있는데, 기존 보다 2^96 개 더 많은 주소를 할당할 수 있다고 보시면 됩니다. 감이 오시는지요? 아마 수 경(조 다음) X 수 경 정도 이상은 될 것 같습니다..
0:0:0:0:0:0:0:1이라고 실제 Eclipse에서는 표시되지만(축약한 것), 사실 좀 더 정확한 표기는 0000:0000:0000:0000:0000:0000:0000:0001 이 맞습니다. (각 자리수는 16비트를 16진수로 표한한 것입니다.)
음 2015:ABCD:03E5:82A1:500B:0053:99CD:A80E 뭐 이런식으로 표기될 것입니다. (보기만해도 너무 복잡하네요. ㅎㅎ)
다시 문제로 돌아와보면 언젠가는 IPv6를 기준으로 코드를 개발해야 하겠지만,
아직은 IPv4를 사용하고 싶다!!
그러니 Request.getRemoteAddr()을 호출하였을 때, IPv4 (127.0.0.1 과 같은) 형태로 반환받고 싶다!
할 수도 있습니다. (저처럼요... ^^)
IPv4와 IPv6의 주소 반환 문제는 톰캣 WAS 서버에서의 설정된 값으로 시스템의 특정 서버 환경에 따라 달라집니다.
그렇기 때문에 만약 내 개발 서버의 환경에서 IPv6로 반환하고 있는데, IPv4로 반환받도록 하고 싶다면 톰캣 실행 시, 전달되는 JVM(Java Virtual Machine)의 환경 변수에 다음 설정 값을 추가해 주면 됩니다.
1) Eclipse 에서 환경 변수 설정 다이얼로그 띄우기
Run > Run Confiugrations
> 좌측 트리 메뉴에서 Apache Tomcat 서버 선택(E.g. Tomcat v7.0 Server at localhost)
> (x) = Arguments 탭 메뉴 선택
> VM Arguments (텍스트 박스 영역)
Arguments 텍스트 박스 가장 하단에 아래 코드를 추가하면 됩니다. 추가한 후 적용(Apply) 해주세요!!
"-Djava.net.preferIPv4Stack=true"
[Run Configurations 메뉴 선택 경로]
만약 Eclipse를 사용하지 않는다면 톰캣의 Catalina 파일을 직접 수정하여 이를 변경할 수 있습니다.
2) 톰캣 서버 환경 설정 파일에서 직접 변경하기
톰캣서버디렉토리경로(e.g. tomcat-7.0.50)\bin\catalina.bat 파일 열기
파일에서 set JAVA_OPTS 로 검색하면 바로 아래 다음과 같이 2곳의 Java 환경 설정 정보가 있는데,
:noJuliConfig
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%
:noJuliManager
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%
위의 2개의 설정 값에 각각 위의 파란색 박스 코드를 추가하여 줍니다.
:noJuliConfig
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -Djava.net.preferIPv4Stack=true
:noJuliManager
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER% -Djava.net.preferIPv4Stack=true
다시 톰캣을 재실행 후, 테스트해보면 IPv4로 값이 나오는 것을 확인하실 수 있습니다.
* Window 7 에서 톰캣 구동 시, Windows7 OS의 기본 IP 주소 타입이 IPv6 이기 때문에 발생하는 문제라고 하는데, 저는 계속해서 Windows7을 문제 없이 사용하다가 언제부터인가 갑자기 발생하였습니다. 윈도우의 어떤 업데이트 이후 발생한게 아닌가 의심은 되지만, 윈도우7이라고 항상 발생하는 것 같지는 않습니다.
'개발&컴퓨터 > JAVA & SPRING' 카테고리의 다른 글
CORS 크로스 도메인 이슈 (No 'Access-Control-Allow-Origin' header is present on the requested resource) (22) | 2015.05.11 |
---|---|
[JAVA] 숫자 또는 영문만 받기 (특수 문자 및 한글 입력 제한하기) (3) | 2015.01.28 |
getSqlMapClient VS getSqlMapClientTemplate in iBatis (2) | 2014.10.09 |
SynchronizedMap과 ConcurrentHashMap (4) | 2014.10.09 |
Maven 사용하는 스프링 프로젝트에서 'Plugin execution not covered by lifecycle configuration' 오류 발생할 때 해결법! (0) | 2014.08.07 |