Valve
- request processing pipeline에 특정 기능을 수행하기 위해 추가될 수 있는 컴포넌트
- introduced with Tomcat 4
- Valve는 서블릿의 필터 개념을 서버와 가상호스트 레벨로 확장시킨 개념
- 웹엔진, 가상호스트, 컨텍스트 (Engine, Host, Context) 순서로 Valve 코드를 실행시키게 되며,
필터와 Valve가 모두 설정되어 있는 경우에는 Valve의 설정 모두 적용된 이후에 필터가 적용되게 된다.
AccessLog
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
Tomcat Layer에 AccessLog 설정 시 이용
pattern 값은 원하는 형태로 변경하여 사용
관련 attribute 정보 : https://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Access_Log_Valve/Attributes
다만, 아래의 RemoteIp 설정이 적용된 경우에는
%{org.apache.catalina.AccessLog.RemoteAddr}r 값을 통해서 %h (Remote host name)를 가져올 수 있다.
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".log"
pattern="%{org.apache.catalina.AccessLog.RemoteAddr}r %l %u %t "%r" %s %b" />
RemoteIp
<Valve className="org.apache.catalina.valves.RemoteIpValve"
internalProxies="192\.168\.0\.10|192\.168\.0\.11"
remoteIpHeader="x-forwarded-for"
proxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto" />
요청 헤더(예: "X-Forwarded-For")에서 proxy 또는 loadbalancer가 제공하는 IP 주소를 걸러
요청에 대한 명백한 클라이언트 원격 IP 주소를 찾는다
또 다른 기능은 요청 헤더(예: "X-Forwarded-Proto")를 통해 proxy 또는 loadbalancer에 의해 제시된 scheme(http/https) 및 서버 포트를 대체
https://tomcat.apache.org/tomcat-8.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html
사전 nginx 설정
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
internalProxies
proxy 또는 loadbalancer IP 주소
처리 과정
$remoteIpHeader(기본값 x-forwarded-for)라는 Http 헤더에서 이전 proxy 또는 loadbalancer가 전달한 쉼표로 구분된 IP 및 호스트 이름 목록을 반복
- 값은 오른쪽에서 왼쪽 순서로 처리
- 목록의 각 IP/호스트에 대해
- internalProxies 목록과 일치하면 제거
- trustedProxies 목록과 일치하면 ip/host가 생성된 proxy 헤더에 추가됩니다.
- 그렇지 않은 경우 IP/호스트가 remoteIp로 선언되고 탐색 중지