앞단에 Proxy / WEB서버 또는 방화벽이나 L4를 통해서 서비스를 하게 될 경우 로그에 찍히는 Client IP나 request.getRemoteAddr() 에서 실제 사용자의 IP주소가 아니라 앞단의 중계서버 IP가 찍히게 되는 경우가 있다.
이런경우 아래와같이 server.xml에 RemoteIpValve를 선언하여 처리해주도록 한다.
<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 "%r" %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"
<!-- 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+"
원하는 패턴들을 파이프(|)로 이어 붙이면 됩니다.
<!-- 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+"