Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


Proxy하에서의 Client IP얻기
 
프록시상황하의 HttpServletRequest의 getRemoteAddr()메소드는 클라이언트의 proxy ip만을 리턴하게 되는데 실제 내부아이피의 내용을 얻어올수 있는 스크립트를 인용한다. ( 2003/11/06 ) 176
Written by ienvyou - 최지웅
1 of 1
 


이제 조금 짬이 나게 되어 글을 하나씩 하나씩 올릴 수 있을 것 같네요.  보통 나온 결과에 의하며
프로젝트의 성공확률은 30%라고 하는데 제가 속한 프로젝트가 그 영역에 포함될지를 의심하여
일을 하고 있습니다.
밤을 새우지 않아도 할 수 있는 일을 기획, 추진력등의 문제점으로 말미암아 개발자들을 너무 
혹사시키지 않나하는 의구심이 들어서 이바닥의 회의를 느낄때도 있네요..^^

각설하고 자~ 이번 아티클은 또 플젝시에 나타났던 문제점을 해결하기 위하여 사용했던 방안을 
쓰게 됩니다. 언제나 그랬듯 동기부터 써 나가도록 한다.

▶ 발생원인

놀새~가 속해있는 프로젝트는 XX라는 회사의 상담업무를 맡는 Call Center의 시스템을 구축하는 
것이었습니다. 요구는 호스트와의 통신 및 로컬컴퓨터의 IP를 이용하여 모든 프로그램을 처리하게
되어있는데 문제는 프록시하의 IP를 java의 HttpServletRequest의 getRemoteAddr()이라는 메소드가
단순히 프록시 IP만을 리턴하고 있다는 문제였습니다.

반드시 공통모듈로의 로그인시에 해당하는 컴퓨터의 IP를 얻어내야 하는 문제점이었겠죠?

▶ 잔머리 굴리기

자~ 이걸 어떻게 해결을 해야 할까요? 이글을 읽는 님께서도 한번 생각을 해보셔야 하지 않을까 합니다.

음..프록시 상황하의 IP체크라~ 백날 죽어라 request를 날려도 그 성능좋은 proxy server가 헤더를
가로채기를 하는데 말이죠..
처음으로 간단하게 제가 생각한 방법은 이렇습니다.

자바를 하니 당연히 signed applet을 두어 클라이언트의 InetAddress를 얻어내 local address를 얻어낸후
File permission을 주어 hidden파일로 설정을 하여 다음로그인시 ip를 해당 파일로부터 읽어낸후 web으로
쏘아주는 방법이겠죠.
이런 방법은 S-Networks란 회사에서 쓰였던 방법이었는데 좀더 쉽게 할 수 없을까 하는 잔머리를 
굴리기 시작을 했지요.

VBScript?, JScript? 흠.asp를 포함하여 사용하자니 서버는 IBMHttpWebServer를 
사용하고 있어서 조금 곤란한 상황이고~
또한 shtml에서 해당 하는 IP를 스크립트로 읽어낼 수 있는 방법이 있었는데 WAS와의 plug-in설정에
shtml에 대한 부분을 허용하지 않아 아래와 같은 secure script를 사용할 수 없다는 것이 문제였습니다.

// This part gets the IP
var ip = '<!--#echo var="REMOTE_ADDR"-->';

// This part is for an alert box
alert("Your IP address is "+ip);

위의 내용을 shtml로 설정한 후 일반 apache webserver에서 작동을 시키면 정확하게 얻어낼 수 
있었습니다.

흠. 우선 IE와 잘 연동이 될 수있으며 brower parser가 인식을 할 수 있어야 하는것이죠.

이때 생각이 아~뛰바 Netscape은 자바 API를 제공을 하고 실행까지 시켜주기때문에 쉽게
알아낼수 있는데 갑자기 IE가 미워보이는 게 아니겠습니까?

결국 JScript API를 뒤져서 ActiveX를 이용한 프록시하의 client ip를 얻어내는데 성공을 하였습니다.
그런데 문제는 서명이 안된 이유로 IE의 보안수준이 낮게 설정되어 있어야 한다는 것이죠.

아니면 서명을 하여 실행을 시키던지요.

우선 해당 프록시하의 클라이언트 아이피주소를 얻어낼 수 있는 스크립트를 적어보도록 하겠습니다.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <head>
        <title></title>

        <script>
           function test() {
                alert(document.formbar.txtIPAddr.value);
           }
     </script>

<script FOR="foo" EVENT="OnCompleted(hResult, pErrorObject, pAsyncContext)" LANGUAGE="JScript">
     document.formbar.txtIPAddr.value=unescape(IPAddr);
</script>
  <script FOR="foo" EVENT="OnObjectReady(objObject, objAsyncContext)" LANGUAGE="JScript">

  if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
   {
       if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined")
             IPAddr = objObject.IPAddress(0);
  }
     </script>

    </head>
    <body>
        <p>
            <FONT color="red"><span ID="info"></FONT>
            <object classid="CLSID:76A64158-CB41-11D1-8B02-00600806D9B6" id="locator" VIEWASTEXT>
            </object>
            <object classid="CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223" id="foo">
            </object>

            <script LANGUAGE="JScript">
                    var service = locator.ConnectServer();
                    var IPAddr ;
                    service.Security_.ImpersonationLevel=3;
                    service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
                </script>
        </p>


<form method="POST" action="" id="formfoo" name="formbar">
	<input type="hidden"  name="txtIPAddr">
    <input type='button' onclick='test()' value='test'>
</form>


	</body>
</html>

테스트해보시기 바랍니다. 참조문서 : WMI HTML Script reference page
 
1
References
 
WMI HTML Script reference page
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD