WAS 중 가장 많이 사용되는 Tomcat의 네트워크 연결 및 성능 관련 커스텀 설정 알아보기

톰캣의 네트워크를 설정하려면 server.xml 파일을 확인해야 한다.
[Tomcat 설치 경로]/conf/server.xml
server.xml은 Tomcat 서버의 핵심 설정 파일로, 서버 동작 방식과 네트워크 통신 방식을 정의한다.
그중 <Connector> 태그는 클라이언트와 서버 간의 연결을 관리하는 핵심 요소로, 클라이언트 요청을 수신하고 응답을 반환하는 역할을 담당한다.
<Connector>는 특정 프로토콜(HTTP, HTTPS, AJP 등) 을 통해 클라이언트 요청을 처리할 포트(Port) 를 지정하고 다양한 속성을 통해 성능, 보안, 연결 관리 등 세부 동작을 조정할 수 있다.
Tomcat은 포트 단위로 Connector를 관리한다. 즉, 사용하는 포트마다 별도의 <Connector> 설정이 필요하다.
Connector 주요 속성 및 설정 방법 ⚙️
SSL을 통한 HTTPS 설정 예시
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="/path/to/keystore.jks" keystorePass="changeit"
clientAuth="false" sslProtocol="TLS" />
위와 같이 SSL을 적용해야 한다던가 네트워크 관련 설정을 변경해야 할 경우 이런 식으로 다양한 속성들을 활용하여 설정해줄 수 있다.
[ HTTPS 관련 주요 속성 ]
- SSLEnabled
- HTTPS 연결을 활성화하려면 true로 설정 - keystoreFile
- SSL 인증서를 저장한 키스토어 파일의 경로 지정
- 키스토어는 서버가 SSL 인증을 할 때 사용하는 인증서와 비밀 키를 포함하고 있다. - keystorePass
- 키스토어 파일에 접근하기 위한 비밀번호를 지정 - clientAuth
- true로 설정하면 클라이언트 인증(즉, 서버가 클라이언트 인증서를 요구하는 방식)이 활성화
- 보통은 false로 설정하여 서버가 클라이언트 인증서를 요구하지 않도록 한다. - sslProtocol
- SSL/TLS 버전을 지정한다. (일반적으로 TLS를 사용) - secure
- true로 설정하면 커넥터가 보안 연결(HTTPS)을 처리한다고 표시 - scheme
- 클라이언트에 반환되는 스킴을 지정
- HTTPS를 사용하고 있음을 나타내기 위해 https로 설정한다.
[ 성능 및 연결 관리 속성 ]
Tomcat에서 성능과 연결 관리를 커스텀하기 위해 다양한 속성들이 제공된다.
- maxThreads
- 이 커넥터가 동시에 처리할 수 있는 최대 요청 수를 지정
- 이 값을 늘리면 더 많은 요청을 동시에 처리할 수 있다. (기본값 200) - minSpareThreads
- 항상 대기 중인 최소한의 스레드 수를 지정
이 스레드들은 새로운 요청이 들어올 때 빠르게 처리할 수 있도록 대기한다. - maxConnections
- 커넥터가 동시에 처리할 수 있는 최대 연결 수를 설정
- 기본적으로는 무제한(-1)이지만, 이 값을 조정하여 서버 부하를 관리할 수 있다. - enableLookups
- true로 설정하면 클라이언트의 IP 주소를 호스트 이름으로 역방향 조회
- 보통 성능상의 이유로 false로 설정한다. - compression
- 응답에 대한 압축을 설정하여 클라이언트와 서버 간의 네트워크 트래픽을 줄이기 위해 사용한다.
- 서버 성능에 문제가 없지만 클라이언트에서 데이터를 응답받을 때 네트워크 지연이 발생한다면 압축을 고려할 수 있다.
compression="on" #압축 설정
compressionMinSize="1024" #1kb 이상 데이터만 압축
compressableMimeType="application/json" #json 타입만 압축
응답 데이터가 너무 크면 네트워크 전송 시 여러개의 패킷으로 분할하여 전송해야 하기 때문에 트래픽이 증가하여 전송 지연 발생
보안 취약점 방지를 위한 설정 🔐
[ 서버명, 버전 노출 방지 ]
Tomcat과 같은 WAS는 기본적으로 따로 설정을 하지 않으면 HTTP 응답에 서버명(Server Name)과 버전(Server Version)이 노출되는데 이러한 정보가 클라이언트에 노출되는 것은 보안 측면에서 취약점이 될 수 있다.
서버 정보가 노출되면 공격자가 해당 정보에 기반하여 특정 취약점을 노린 공격을 시도할 수 있으므로 보여주지 않는 것이 바람직하다.
# server 속성을 설정하지 않은 경우
Server: Apache-Coyote/1.1
1️⃣ server.xml) 서버명 노출 제한
- 목적: HTTP 응답 헤더에서 서버 정보가 노출되는 것을 방지
- 설정 방법: server 속성 지정 (빈값 = " ")
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
server=" " />
2️⃣ web.xml) 서버 버전 노출 제한
- 목적: Tomcat의 기본 오류 페이지에서 서버 정보를 노출하지 않도록 함
- 설정 방법: <init-param> 태그의 showServerInfo 속성을 false로 설정
<init-param>
<param-name>showServerInfo</param-name>
<param-value>false</param-value>
</init-param>
[ 물리적 경로 노출 방지 ]
Tomcat은 따로 설정하지 않을 경우 기본 경로(docBase)를 TOMCAT_HOME/webapps/ 로 잡고, 그 안의 애플리케이션의 경로(path)는 애플리케이션 디렉토리 이름을 사용한다.
애플리케이션 디렉토리 이름이 'myApp'이라고 가정하면 이렇게 유추가 가능하다.
- URL: http://localhost:8080/myApp
- 물리적 경로: TOMCAT_HOME/webapps/myApp
이를 통해 공격자가 Tomcat의 디렉토리 구조를 유추할 가능성이 있기 때문에 기본 경로(docBase)를 Tomcat의 외부 경로로 이동시키고, 클라이언트 요청 시 매핑되는 경로(path)는 애플리케이션의 물리적 경로와 관련이 없는 경로로 변경해주는 것이 비교적 안전하다.
<!-- server.xml -->
<Host name="localhost" appBase="webapps" allowLinking="false">
<Context path="/secureApp" docBase="/opt/tomcat_apps/myApp" reloadable="true" />
</Host>
*/secureApp 경로로 요청 시 /opt/tomcat_apps/myApp/ 경로에 있는 애플리케이션으로 매핑된다.
path: 클라이언트 요청 경로
docBase: appBase인 webapps 경로 밑의 하위 경로 (webapps/myapp/WEB-INF) 즉, Context path에 매핑될 물리적 경로
💡 논리적 경로 지정은 보안적 측면 이외에도 유용하게 활용할 수 있다.
유지 관리 및 관리 편의성
Context 설정을 통해 여러 애플리케이션을 운영할 때, 각 애플리케이션에 대한 설정을 일관되게 유지할 수 있다. 이는 특히 여러 프로젝트를 동시에 관리할 때 유리하게 사용할 수 있다.
설정 변경의 유연성
나중에 URL 구조를 변경해야 할 경우, Context 설정만 수정하면 된다. 예를 들어, /myApp를 /app으로 변경하려면 Context의 path만 수정하면 된다. 물리적 경로를 변경하면 파일 시스템에서 해당 디렉토리를 이동하거나 이름을 바꿔야 하므로 더 복잡할 수 있지만 논리적 경로를 지정하여 쉽게 설정하고 관리할 수 있다.
- 끝 -
'🖥️ 서버(Server) > Tomcat' 카테고리의 다른 글
| [Server] WebtoB(WEB) & Tomcat(WAS) 연동. with ReverseProxy (5) | 2024.09.18 |
|---|---|
| [Tomcat] 톰켓이란? (0) | 2023.08.27 |