WAS로 가장 많이 사용되는 톰캣의 네트워크 설정에 대해 알아보자
톰캣의 네트워크를 설정하려면 server.xml 파일을 확인해야 한다.
[Tomcat 설치 경로]/conf/server.xml
server.xml 파일은 서버 설정을 관리하는 핵심 구성 파일 중 하나이며 그 중 <Connector> 태그는 클라이언트와 서버 간의 연결을 관리하는 역할을 한다. <Connector>는 특정 프로토콜(HTTP, HTTPS, AJP 등)에 따라 클라이언트 요청을 처리하는 포트를 지정하며, 다양한 속성을 통해 성능, 보안, 기타 여러 항목을 세밀하게 조정할 수 있다.
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을 적용해야 한다던가 네트워크 관련 설정을 변경해야 할 경우 이런 식으로 다양한 속성들을 활용하여 설정해줄 수 있다.
Connector 태그는 사용하는 포트 별로 각각의 Connector 속성을 가진다.
즉, HTTP와 HTTPS를 둘 다 사용한다면 HTTP의 8080 포트와 HTTPS의 8443 포트에 대해 Connector를 2개 설정해야 한다.
<Connector> 태그의 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:
- 응답을 압축할지 여부를 지정 (on, off, force)
- 클라이언트와 서버 간의 네트워크 트래픽을 줄이기 위해 사용한다.
보안 취약점 방지하기
1. 서버명, 버전 노출 방지
Tomcat과 같은 WAS는 기본적으로 따로 설정을 하지 않으면 HTTP 응답에 서버명(Server Name)과 버전(Server Version)이 노출되는데 이러한 정보가 클라이언트에 노출되는 것은 보안 측면에서 취약점이 될 수 있다.
서버 정보가 노출되면 공격자가 해당 정보에 기반하여 특정 취약점을 노린 공격을 시도할 수 있으므로 보여주지 않는 것이 바람직하다.
# server 속성을 설정하지 않은 경우
Server: Apache-Coyote/1.1
1. server.xml에서 Connector 속성 설정
- 목적: 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>
2. 물리적 경로 노출 방지
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/myAㅁpp/ 경로에 있는 애플리케이션으로 매핑된다.
path:
- 클라이언트 요청 경로
docBase:
- appBase인 webapps 경로 밑의 하위 경로 (webapps/myapp/WEB-INF)
- 즉, Context path에 매핑될 물리적 경로
Tomcat의 논리적 경로 지정은 보안적 측면 이외에도 유용하게 활용할 수 있다.
유지 관리 및 관리 편의성
Context 설정을 통해 여러 애플리케이션을 운영할 때, 각 애플리케이션에 대한 설정을 일관되게 유지할 수 있다. 이는 특히 여러 프로젝트를 동시에 관리할 때 유리하게 사용할 수 있다.
설정 변경의 유연성
나중에 URL 구조를 변경해야 할 경우, Context 설정만 수정하면 된다. 예를 들어, /myApp를 /app으로 변경하려면 Context의 path만 수정하면 된다.
물리적 경로를 변경하면 파일 시스템에서 해당 디렉토리를 이동하거나 이름을 바꿔야 하므로 더 복잡할 수 있지만 논리적 경로를 지정하여 쉽게 설정하고 관리할 수 있다.
- 끝 -
'🖥️ 서버(Server) > Tomcat' 카테고리의 다른 글
[Tomcat] 톰켓이란? (0) | 2023.08.27 |
---|