Valve

2023. 4. 13. 12:45Spring Framework/Apache Tomcat Server

아파치 톰캣(Apache Tomcat) 서버에서 밸브(Valve)는 요청(Request)과 응답(Response)을 처리하는 파이프라인의 중요한 구성 요소로, 주로 HTTP 요청과 관련된 로깅, 인증, 접근 제어, 요청/응답 변경과 같은 특정 작업을 처리하는 역할을 합니다. 밸브는 톰캣의 코어 컴포넌트 중 하나로, 톰캣 내부의 여러 컨테이너(Container) 레벨에서 적용할 수 있으며 주로 호스트(Host) 또는 엔진(Engine) 레벨에서 설정됩니다.

밸브의 개념 및 역할

밸브는 톰캣의 Pipeline 구조 안에서 동작하며, 필터(filter)와 유사하지만, 차이점은 밸브는 톰캣 내부의 특정 단계에서만 동작하고, HTTP 요청이 톰캣 내부로 들어와 서블릿(Servlet) 컨테이너로 전달되기 전에 수행된다는 점입니다. 필터는 웹 애플리케이션 레벨에서 동작하는 반면, 밸브는 톰캣의 특정 컴포넌트 수준에서 동작하는 더 강력한 메커니즘입니다.

톰캣 밸브의 특징

  1. 요청과 응답에 대한 전처리 및 후처리

    • 밸브는 톰캣의 엔진이나 호스트 레벨에서 HTTP 요청에 대해 전처리(pre-processing)를 수행하고, 응답에 대해 후처리(post-processing)를 수행할 수 있습니다. 이를 통해 각 요청에 대해 특정한 로직을 적용할 수 있습니다.
  2. 단일 확장 포인트

    • 밸브는 요청 처리 파이프라인에서 하나의 확장 지점으로 작동합니다. 개발자는 자신의 커스텀 밸브를 작성하여 톰캣에 추가할 수 있으며, 이를 통해 요청 처리 중 특정 작업을 수행하도록 할 수 있습니다.
  3. 톰캣 내부의 특정 컨테이너에 설정

    • 밸브는 주로 Engine, Host, Context와 같은 톰캣의 컨테이너 컴포넌트에 설정되며, 각각의 컨테이너는 자신만의 밸브 체인을 가질 수 있습니다.
  4. 파이프라인과 밸브 체인

    • 밸브는 톰캣 내부의 파이프라인 구조에 의해 관리됩니다. 파이프라인(Pipeline)은 여러 밸브로 구성될 수 있으며, 각 밸브는 차례대로 요청을 처리하고 다음 밸브로 요청을 전달합니다. 이 구조는 체인(chain) 방식으로 동작합니다.
  5. 클래스 구현

    • 밸브는 org.apache.catalina.Valve 인터페이스를 구현하여 정의됩니다. 밸브의 핵심 메서드는 invoke()이며, 요청이 들어오면 이 메서드가 호출되어 처리됩니다.

톰캣에서 자주 사용되는 밸브 종류

  1. AccessLogValve

    • 요청과 응답에 대한 정보를 로깅하는 밸브로, 웹 서버의 로그 파일을 생성하는 데 사용됩니다. 로그 포맷을 커스터마이징하여 특정 정보만을 기록하거나, 클라이언트의 요청 메서드, 상태 코드, 응답 시간 등을 기록할 수 있습니다.
  2. RemoteIpValve

    • 프록시 서버나 로드 밸런서 뒤에서 톰캣이 동작할 때, 실제 클라이언트의 IP 주소를 요청에서 추출하여 설정하는 밸브입니다. 기본적으로 클라이언트의 IP 주소를 알 수 없는 경우가 있는데, 이 밸브를 통해 X-Forwarded-For 헤더를 기반으로 실제 클라이언트의 IP를 추적할 수 있습니다.
  3. SingleSignOnValve

    • 톰캣 내의 여러 애플리케이션 사이에서 단일 로그인(Single Sign-On) 기능을 제공하는 밸브입니다. 한 번의 로그인으로 동일한 호스트 내에 있는 여러 애플리케이션에 접근할 수 있습니다.
  4. RewriteValve

    • URL 재작성(Rewrite)을 지원하는 밸브로, Apache HTTP Server의 mod_rewrite와 유사하게 특정 규칙을 기반으로 URL을 변환할 수 있습니다.
  5. ErrorReportValve

    • 요청 처리 중 발생한 오류에 대한 사용자 지정 오류 페이지를 제공하는 밸브입니다. 예를 들어 404 오류나 500 오류와 같은 특정 오류 발생 시, 사용자에게 보여줄 페이지를 정의할 수 있습니다.

밸브 사용 방법

밸브는 톰캣의 server.xml 파일이나 context.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 호스트에 대해 AccessLogValve를 설정하는 부분입니다. 이 밸브는 로그를 logs 디렉토리에 저장하고, 파일 이름은 localhost_access_log로 시작하며, 로그 형식은 Apache HTTP 서버의 공통 로그 포맷과 유사합니다.

밸브와 필터의 차이점

  • 밸브(Valve)는 톰캣 컨테이너 수준에서 동작하며, 서블릿이 실행되기 전에 HTTP 요청을 처리할 수 있습니다. 밸브는 특정 컨테이너에 종속적이며 서블릿 컨텍스트와 관계없이 더 넓은 범위에서 작동합니다.

  • 필터(Filter)는 웹 애플리케이션 수준에서 동작하며, 서블릿 스펙에 정의된 기능입니다. 필터는 서블릿 요청과 응답을 조작할 수 있지만, 톰캣 컨테이너 자체와는 무관하게 동작합니다.

밸브 사용 시 고려사항

  1. 성능

    • 밸브는 요청 처리 파이프라인의 중간에 위치하므로, 성능에 영향을 미칠 수 있습니다. 특히 로그를 남기거나 복잡한 인증/인가 로직을 적용하는 경우, 응답 시간에 영향을 줄 수 있습니다.
  2. 보안

    • 밸브는 보안 로직을 구현하는 데 매우 유용하지만, 올바르게 설정되지 않으면 의도치 않은 보안 취약점을 야기할 수 있습니다. 예를 들어 RemoteIpValve를 사용할 때 신뢰할 수 없는 프록시로부터 오는 헤더 정보를 무분별하게 신뢰할 경우, IP 스푸핑과 같은 보안 문제가 발생할 수 있습니다.
  3. 배포 환경에 따른 설정

    • 밸브는 톰캣의 특정 환경에 맞춰 설정이 달라질 수 있습니다. 로드 밸런서, 프록시 서버가 있는 환경에서의 IP 처리, SSL 설정 등에 따라 밸브 설정을 조정해야 합니다.

요약

톰캣의 밸브는 요청 처리 파이프라인에서 매우 유연하고 강력한 확장 포인트입니다. 요청과 응답의 전후 처리, 로깅, 보안, 인증 등 다양한 작업을 처리할 수 있으며, 특정한 컨테이너 레벨에서 동작하도록 설정할 수 있습니다. AccessLogValve, RemoteIpValve와 같은 기본 제공 밸브 외에도 커스텀 밸브를 작성하여 원하는 기능을 추가할 수 있습니다.

'Spring Framework > Apache Tomcat Server' 카테고리의 다른 글

Context  (0) 2023.06.04
Thread Pool  (0) 2023.05.25
AJP (Apache JServ Protocol) Connector  (0) 2023.04.28
Realm  (0) 2023.04.25
Coyote Connector  (0) 2023.04.17