Technical NOTE
Tomcat Valve 기능에 대해 본문
Tomcat Valve는 Apache Tomcat의 핵심 기능 중 하나로, 특정 요청이나 응답에 대해 처리 로직을 추가하거나 필터링을 수행할 수 있도록 해주는 메커니즘입니다. Valve는 Tomcat의 request-response 사이클에서 필터와 유사하게 동작하지만, 컨텍스트(Context)와 호스트(Host)에 종속적으로 동작할 수 있는 점에서 더 강력하고 Tomcat 서버에 밀접하게 통합되어 있습니다.
Valves는 주로 로그 기록, 보안 처리, 요청 필터링 등의 용도로 사용되며, Tomcat의 server.xml 파일에 설정할 수 있습니다. Valve는 각 Host, Context, Engine 또는 Server 수준에서 설정이 가능하며, 이를 통해 Tomcat 서버의 각종 요청에 대한 세부적인 처리가 가능합니다.
Valve의 주요 특징
- 요청과 응답의 필터링:
- Valve는 특정 요청에 대해 접근 제어, 로깅, 필터링 등을 수행할 수 있으며, 이를 통해 불필요한 요청을 필터링하거나 추가적인 검사를 수행할 수 있습니다.
- Server, Engine, Host, Context 레벨에서 동작:
- Valve는 여러 레벨에서 동작할 수 있습니다.
server.xml
에 특정 엔진(Engine), 호스트(Host), 혹은 웹 애플리케이션(Context)에 대해 Valve를 정의할 수 있으며, 그에 따라 다른 수준에서 요청을 제어할 수 있습니다.
- Valve는 여러 레벨에서 동작할 수 있습니다.
- 다양한 사용 사례:
- 로그 기록, IP 차단, 인증, SSL 관련 처리 등 다양한 목적을 위해 사용됩니다.
Valve 동작 구조
Valve는 Chain(체인) 구조를 사용합니다. 여러 Valve가 체인 형태로 연결되어, 요청이 들어오면 첫 번째 Valve부터 순차적으로 다음 Valve로 요청을 넘기며, 최종적으로 Catalina(Tomcat의 코어)로 요청이 전달됩니다.
Valve는 org.apache.catalina.Valve
인터페이스를 구현하며, Tomcat이 시작될 때 server.xml
에 정의된 Valve를 읽어들이고 이 체인을 형성합니다.
Valve의 구성 요소
Tomcat의 Valve는 주로 다음과 같은 요소로 구성됩니다:
- Request:
- Valve는 요청을 가로채어 클라이언트로부터 들어오는 HTTP 요청을 처리합니다. 이 과정에서 추가적인 검사, 인증, 데이터 변환, 또는 보안 로직을 수행할 수 있습니다.
- Response:
- 요청에 대한 처리가 끝난 후 응답 단계에서도 Valve가 응답 내용을 가공하거나 로그를 기록할 수 있습니다.
- Pipeline:
- Tomcat의 내부 구조에서 요청 처리 파이프라인(Pipeline)에 Valve가 연결됩니다. 여러 개의 Valve가 함께 작동할 수 있으며, 각 Valve는 다음 Valve로 요청을 전달할지 여부를 결정할 수 있습니다.
Valve와 Filter의 차이점
- Filter는 Java Servlet 표준의 일부이며, 애플리케이션 레벨에서 동작합니다.
- Valve는 Tomcat 전용 기능으로, Tomcat 서버의 엔진(Engine), 호스트(Host), 컨텍스트(Context) 레벨에서 동작합니다.
- Filter는 주로 서블릿 컨테이너 내부에서 동작하는 반면, Valve는 Tomcat의 전체 요청 처리 사이클에서 동작합니다.
- Valve는 서버 전반의 설정에 더 밀접하게 통합되어 있어, 로그 처리, 보안 설정 등 특정 요청을 Tomcat 수준에서 직접 제어할 때 더 많이 사용됩니다.
대표적인 Valve 유형
Tomcat에서 기본적으로 제공하는 Valve에는 여러 종류가 있으며, 각기 다른 목적을 가지고 있습니다. 몇 가지 대표적인 Valve를 소개합니다:
1. AccessLogValve
- 주요 목적: 요청에 대한 액세스 로그를 기록합니다.
- 설명: 사용자의 요청 정보를 서버에 로그로 남깁니다. 이때, 로그 형식을 사용자 정의할 수 있으며, IP 주소, HTTP 메소드, 응답 코드 등을 포함한 다양한 정보를 기록할 수 있습니다.
- 설정 예시:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
2. RemoteAddrValve
- 주요 목적: 특정 IP 주소 또는 IP 범위를 기반으로 요청을 허용하거나 차단합니다.
- 설명: 보안 목적으로 특정 IP 주소에서 오는 요청을 필터링할 수 있습니다. 예를 들어, 사내 IP 주소만 허용하거나, 특정 악성 IP를 차단할 수 있습니다.
- 설정 예시:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.0.*" />
3. RemoteHostValve
- 주요 목적: 특정 호스트명을 기반으로 요청을 필터링합니다.
- 설명: RemoteAddrValve와 유사하지만, IP 주소가 아닌 호스트 이름을 기반으로 필터링을 수행합니다. 예를 들어 특정 도메인에서 오는 요청만 허용할 수 있습니다.
- 설정 예시:
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="*.mydomain.com" />
4. RequestDumperValve
- 주요 목적: 모든 HTTP 요청 및 응답의 헤더와 내용을 덤프하여 로그에 기록합니다.
- 설명: 주로 디버깅 용도로 사용되며, 요청과 응답에 포함된 모든 헤더, 파라미터, 상태 코드 등을 기록하여 문제가 발생했을 때 이를 쉽게 추적할 수 있습니다.
- 설정 예시:
<Valve className="org.apache.catalina.valves.RequestDumperValve" />
5. ErrorReportValve
- 주요 목적: Tomcat이 반환하는 오류 페이지를 커스터마이징할 수 있습니다.
- 설명: 기본적으로 Tomcat이 반환하는 에러 페이지 대신, 사용자 정의 에러 페이지를 설정할 수 있습니다. 이 Valve를 통해 에러 처리 방식을 수정하거나 로깅할 수 있습니다.
- 설정 예시:
<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />
Valve 설정 방법
Valves는 server.xml 파일의 , , 태그 안에 설정할 수 있습니다. Valve가 설정된 위치에 따라 적용 범위가 달라지며, 각각의 레벨에서 작동합니다.
예시: server.xml
에서 AccessLogValve
를 호스트에 설정하는 방법
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
이 설정은 localhost 호스트에 대한 모든 요청에 대해 액세스 로그를 기록합니다.
결론
Tomcat Valve는 Tomcat의 요청 처리 파이프라인에서 필터링, 로깅, 보안 제어 등 다양한 역할을 수행할 수 있는 강력한 기능입니다. Filter와 비교해 Tomcat 서버와 밀접하게 통합되어 있고, 엔진 또는 호스트 수준에서의 제어가 가능하여, 로그 기록, IP 필터링, 오류 처리 등 서버 관리에 유용하게 사용할 수 있습니다. 각 Valve는 특정한 목적을 위해 설계되어 있으며, 서버의 요구에 따라 적절히 설정하면 서버의 성능 및 보안을 강화할 수 있습니다.
'미들웨어 > Tomcat' 카테고리의 다른 글
Tomcat 10 버전과 9버전 비교 (0) | 2024.09.27 |
---|---|
Tomcat 10 버전에 대한 고찰 (5) | 2024.09.27 |
Tomcat 9 설치 #4 - JVM 옵션 설정 (0) | 2024.09.12 |
Tomcat 9 설치 #3 - Tomcat 9.0.93 설치 (0) | 2024.09.12 |
Tomcat 9 설치 #2 - Java 8 설치 (1) | 2024.09.05 |