Technical NOTE

Tomcat Valve 기능에 대해 본문

미들웨어/Tomcat

Tomcat Valve 기능에 대해

테크니컬노트 2024. 9. 27. 13:29
반응형

Tomcat ValveApache Tomcat의 핵심 기능 중 하나로, 특정 요청이나 응답에 대해 처리 로직을 추가하거나 필터링을 수행할 수 있도록 해주는 메커니즘입니다. Valve는 Tomcat의 request-response 사이클에서 필터와 유사하게 동작하지만, 컨텍스트(Context)호스트(Host)에 종속적으로 동작할 수 있는 점에서 더 강력하고 Tomcat 서버에 밀접하게 통합되어 있습니다.

Valves는 주로 로그 기록, 보안 처리, 요청 필터링 등의 용도로 사용되며, Tomcat의 server.xml 파일에 설정할 수 있습니다. Valve는 각 Host, Context, Engine 또는 Server 수준에서 설정이 가능하며, 이를 통해 Tomcat 서버의 각종 요청에 대한 세부적인 처리가 가능합니다.

Valve의 주요 특징

  1. 요청과 응답의 필터링:
    • Valve는 특정 요청에 대해 접근 제어, 로깅, 필터링 등을 수행할 수 있으며, 이를 통해 불필요한 요청을 필터링하거나 추가적인 검사를 수행할 수 있습니다.
  2. Server, Engine, Host, Context 레벨에서 동작:
    • Valve는 여러 레벨에서 동작할 수 있습니다. server.xml에 특정 엔진(Engine), 호스트(Host), 혹은 웹 애플리케이션(Context)에 대해 Valve를 정의할 수 있으며, 그에 따라 다른 수준에서 요청을 제어할 수 있습니다.
  3. 다양한 사용 사례:
    • 로그 기록, IP 차단, 인증, SSL 관련 처리 등 다양한 목적을 위해 사용됩니다.

Valve 동작 구조

Valve는 Chain(체인) 구조를 사용합니다. 여러 Valve가 체인 형태로 연결되어, 요청이 들어오면 첫 번째 Valve부터 순차적으로 다음 Valve로 요청을 넘기며, 최종적으로 Catalina(Tomcat의 코어)로 요청이 전달됩니다.

Valve는 org.apache.catalina.Valve 인터페이스를 구현하며, Tomcat이 시작될 때 server.xml에 정의된 Valve를 읽어들이고 이 체인을 형성합니다.

Valve의 구성 요소

Tomcat의 Valve는 주로 다음과 같은 요소로 구성됩니다:

  1. Request:
    • Valve는 요청을 가로채어 클라이언트로부터 들어오는 HTTP 요청을 처리합니다. 이 과정에서 추가적인 검사, 인증, 데이터 변환, 또는 보안 로직을 수행할 수 있습니다.
  2. Response:
    • 요청에 대한 처리가 끝난 후 응답 단계에서도 Valve가 응답 내용을 가공하거나 로그를 기록할 수 있습니다.
  3. Pipeline:
    • Tomcat의 내부 구조에서 요청 처리 파이프라인(Pipeline)에 Valve가 연결됩니다. 여러 개의 Valve가 함께 작동할 수 있으며, 각 Valve는 다음 Valve로 요청을 전달할지 여부를 결정할 수 있습니다.

Valve와 Filter의 차이점

  • FilterJava Servlet 표준의 일부이며, 애플리케이션 레벨에서 동작합니다.
  • ValveTomcat 전용 기능으로, Tomcat 서버의 엔진(Engine), 호스트(Host), 컨텍스트(Context) 레벨에서 동작합니다.
  • Filter는 주로 서블릿 컨테이너 내부에서 동작하는 반면, ValveTomcat의 전체 요청 처리 사이클에서 동작합니다.
  • 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 &quot;%r&quot; %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 &quot;%r&quot; %s %b" />
</Host>

이 설정은 localhost 호스트에 대한 모든 요청에 대해 액세스 로그를 기록합니다.


결론

Tomcat Valve는 Tomcat의 요청 처리 파이프라인에서 필터링, 로깅, 보안 제어 등 다양한 역할을 수행할 수 있는 강력한 기능입니다. Filter와 비교해 Tomcat 서버와 밀접하게 통합되어 있고, 엔진 또는 호스트 수준에서의 제어가 가능하여, 로그 기록, IP 필터링, 오류 처리 등 서버 관리에 유용하게 사용할 수 있습니다. 각 Valve는 특정한 목적을 위해 설계되어 있으며, 서버의 요구에 따라 적절히 설정하면 서버의 성능 및 보안을 강화할 수 있습니다.

반응형