https://sundaland.tistory.com/9
[ ▶ Valve ]
아파치 톰캣 서버에서 밸브는 요청(Request)과 응답(Response)을 처리하는 파이프라인의 중요한 구성 요쇼로, 주로 HTTP 요청과 관련된 로깅, 인증, 접근 제어, 요청/응답 변경과 같은 특정 작업을 처리하는 역할을 한다. 밸브는 톰캣의 코어 컴포넌트 중 하나로, 톰캣 내부의 여러 컨테이너(Container) 레벨에서 적용할 수 있으며 주로 호스트 또는 엔진 레벨에서 설정된다.
[ ▷ Valve의 개념 및 역할 ]
밸브는 톰캣의 파이프라인 구조 안에서 동작하며, 필터와 유사하지만, 차이점은 벨브는 톰캣 내부의 특정 단계에서만 동작하고, HTTP 요청이 톰캣 내부로 들어와 서블릿 컨테이너로 전달되기 전에 수행된다는 점이다. 필터는 웹 애플리케이션 레벨에서 동작하는 반면, 밸브틑 톰캣의 특정 컴포넌트 수준에서 동작하는 더 강력한 매커니즘이다.
[ ▷ 톰캣 밸브 특징 ]
- 요청과 응답에 대한 전처리 및 후처리: 밸브는 톰캣의 엔진이나 호스트 레벨에서 HTTP 요청에 대해 전처리(pre-processing)를 수행하고, 응답에 대해 후처리(post-processing)를 수행할 수 있다. 이를 통해 각 요청에 대해 특정한 로직을 적용할 수 있다.
- 단일 확장 포인트: 밸브는 요청 처리 파이프라인에서 하나의 확장 지점으로 작동한다. 개발자는 자신의 커스텀 밸브를 작성하여 톰캣에 추가할 수 있으며, 이를 통해 요청 처리 중 특정 작업을 수행하도록 할 수 있다.
- 톰캣 내부의 특정 컨테이너에 설정: 밸브는 주로 Engine, Host, Context와 같은 톰캣의 컨테이너 컴포넌트에 설정되며, 각각의 컨테이너는 자신만의 밸브 체인을 가질 수 있다.
- 클래스 구현: 밸브는 org.apache.catalina.Valve인터페이스를 구현하여 정의된다.밸브의 핵심 메서드는invoke()이며, 요청이 들어오면 이 메서드가 호출되어 처리된다.
[ ▷ 톰캣에서 자주 사용되는 밸트 종류 ]
- AccessLogValve: 요청과 응답에 대한 정보를 로깅하는 밸브로, 웹 서버의 로그 파일을 생성하는데 사용된다. 로그 포맷을 커스터마이징하여 특정 정보만을 기록하거나, 클라이언트의 요청 메서드, 상태 코드, 응답 시간등을 기록할 수 있다.
- RemoteIpValve: 프록시 서버나 로드 밸런서 뒤에서 톰캣이 동작할 때, 실제 클라이언트의 IP 주소를 요청에서 추출하여 설정하는 밸브이다. 기본적으로 클라이언트의 IP 주소를 알 수 없는 경우가 있는데, 이 밸브를 통해 X-Forwarded-For 헤더를 기반으로 실제 클라이언트의 IP를 추적할 수 있다.
- SingleSignOnValve: 톰캣 내의 여러 애플리케이션 사이에서 단일 로그인 (Single Sign-On) 기능을 제공하는 밸브이다. 한 번의 로그인으로 동일한 호스트 내에 있는 여러 애플리케이션에 접근할 수 있다.
- RewriteValve: URL 재작성 (Rewrite)을 지원하는 밸브로, Apache HTTP Server의 mod_rewrite와 유사하게 특정 규칙을 기반으로 URL을 변환할 수 있다.
- 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 "%r" %s %b" />
</Host>
localhost 호스트에 대해 AccessLogValve를 설정하는 부분이다. 이 밸브는 로그를 logs 디렉토리에 저장하고, 파일 이름은 localhost_access_log로 시작하며, 로그 형식은 Apache HTTP 서버의 공통 로그 포맷과 유사하다.
[ ▷ 밸브와 필터의 차이점 ]
- 밸브(Valve)는 톰캣 컨테이너 수준에서 동작하며, 서블릿이 실행되기 전에 HTTP 요청을 처리할 수 있다. 밸브는 특정 컨테이너에 종속적이며 서블릿 컨텍스트와 관계없이 더 넓은 범위에서 작동한다.
- 필터(Filter)는 웹 애플리케이션 수준에서 동작하며, 서블릿 스펙에 정의된 기능이다. 필터는 서블릿 요청과 응답을 조작할 수 있지만, 톰캣 컨테이너 자체와는 무관하게 동작한다.
[ ▷ 밸브 사용시 고려사항 ]
- 성능: 밸브는 요청 처리 파이프라인의 중간에 위치하므로, 성능에 영향을 미칠 수 있다. 특히 로그를 남기거나 복잡한 인증/인가 로직을 적용하는 경우, 응답 시간에 영향을 줄 수 있다.
- 보안: 밸브는 보안 로직을 구현하는 데 매우 유용하지만, 올바르게 설정되지 않으면 의도치 않은 보안 취약점을 야기할 수 있다. 예를 들어 RemoteIpValve를 사용할 때 신뢰할 수 없는 프록시로부터 오는 헤더 정보를 무분별하게 신뢰할 경우, IP 스푸핑과 같은 보안 문제가 발생할 수 있다.
- 배포 환경에 따른 설정: 밸브는 톰캣의 특정 환경에 맞춰 설정이 달라질 수 있다. 로드 밸런서, 프록시 서버가 있는 환경에서의 IP 처리, SSL 설정 등에 따라 밸브 설정을 조정해야 한다.
[ ▷ 요약 ]
톰캣의 밸브는 요청 처리 파이프라인에서 매우 유연하고 강력한 확장 포인트이다. 요청과 응답의 전후 처리, 로깅, 보안, 인증 등 다양한 작업을 처리할 수 있으며, 특정한 컨테이너 레벨에서 동작하도록 설정할 수 있다.
AccessLogValve, RemoteIpValve와 같은 기본 제공 밸브 외에도 커스텀 밸브를 작성하여 원하는 기능을 추가할 수 있다.
'Apache Tomcat' 카테고리의 다른 글
Context (0) | 2024.10.07 |
---|---|
Host (0) | 2024.10.07 |
Engine (0) | 2024.10.07 |
Service (0) | 2024.10.07 |
Apache Tomcat Server Arch (0) | 2024.10.07 |