proxy_사용시_client_real_ip_기록_설정

문서의 이전 판입니다!


Proxy 사용시 Client Real IP 기록 설정

앞단에 Proxy / WEB서버 또는 방화벽이나 L4를 통해서 서비스를 하게 될 경우 로그에 찍히는 Client IPrequest.getRemoteAddr() 에서 실제 사용자의 IP주소가 아니라 앞단의 중계서버 IP가 찍히게 되는 경우가 있다.

이런경우 아래와같이 server.xmlRemoteIpValve를 선언하여 처리해주도록 한다.

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true">

  <!-- [추가] 프록시 IP를 처리할 RemoteIpValve -->
  <Valve className="org.apache.catalina.valves.RemoteIpValve"
         internalProxies="192\.168\.0\.5"
         remoteIpHeader="x-forwarded-for"
         proxiesHeader="x-forwarded-by"
         protocolHeader="x-forwarded-proto" />

  <!-- [기존 유지] AccessLogValve (패턴의 %h 또는 %a가 실제 IP로 자동 교체됨) -->
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
         prefix="localhost_access_log" suffix=".txt"
         pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

internalProxies 에 앞단의 프록시 서버 아이피를 등록해주면 해당 아이피에서 요청하는 건에 대해서는 x-forwarded-for 값을 실제 IP값으로 치환해준다.

internalProxies 의 값은 정규식으로 인식하므로 아이피를 입력할때 192.168.0.5 라고 입력해도 되지만 이런경우 .은 아무글자로 치환된다는것을 염두해두도록 한다. 다만 아이피값은 다른 문자가 올수가 없으므로 단순히 192.168.0.5 라고 입력해도 동작에는 이상이 없을뿐이다.

  • 여러개의 개별 아이피를 지정할때
<!-- 192.168.0.5 또는 192.168.0.6 또는 10.0.0.10 -->
internalProxies="192.168.0.5|192.168.0.6|10.0.0.10"''
  • 특정 IP 대역(서브넷)을 지정할 때
<!-- 192.168.0.x 대역 전체 (192.168.0.0 ~ 192.168.0.255) -->
internalProxies="192.168.0.\d+"

<!-- 192.168.x.x C클래스 전체 대역 -->
internalProxies="192.168.\d+.\d+"
  • 여러 대역 및 개별 IP를 혼합할 때

원하는 패턴들을 파이프(|)로 이어 붙이면 됩니다.

<!-- 192.168.0.x 대역 전체 OR 10.0.0.x 대역 전체 OR 단일 IP 172.16.0.100 -->
internalProxies="192.168.0.\d+|10.0.0.\d+|172.16.0.100"
  • 연속된 대역 묶기 (응용)

그룹화 괄호()나 범위 지정[]을 쓰면 구문을 간결하게 만들 수 있습니다.

<!-- 192.168.0.x 대역과 192.168.1.x 대역을 동시에 지정할 때 -->
internalProxies="192.168.[0-1].\d+"
<!-- 또는 -->
internalProxies="192.168.(0|1).\d+"
  • proxy_사용시_client_real_ip_기록_설정.1788878084.txt.gz
  • 마지막으로 수정됨: 2026/09/08 14:34
  • 저자 koov