이 가이드는 **Tomcat**으로 실행되는 웹 애플리케이션에 **SSL/TLS (HTTPS)를 적용**하는 다양한 방법을 설명합니다. 특히, 사내 인프라(`192.168.0.61`과 같은 중앙 프록시)와 유사한 환경 및 클라우드 배포 환경 모두에서 적용할 수 있는 표준적인 방법을 다룹니다.
다양한 조합(Docker/Bare-metal, Apache/Nginx, Let's Encrypt/자체 서명 인증서)에 따른 설정 방법을 체계적으로 안내합니다.
이 가이드의 핵심 전략은 **리버스 프록시(Reverse Proxy)를 이용한 SSL 오프로딩(SSL Offloading)**입니다.
*참고: Docker에서 Apache SSL을 설정하는 것은 Nginx보다 다소 복잡합니다. `httpd.conf`를 직접 수정하여 `mod_ssl` 로드, `Listen 443`, `Include conf/extra/httpd-ssl.conf` 등의 지시어를 관리해야 하기 때문입니다.*
## 5. 3단계: Tomcat 설정 (`server.xml`)
리버스 프록시 뒤에서 Tomcat이 올바르게 동작하도록 `server.xml` 파일을 설정합니다. 핵심은 Tomcat이 클라이언트의 원래 요청(HTTPS, 도메인 등)을 인지하도록 만드는 것입니다. **`RemoteIpValve`를 사용하는 것이 가장 표준적이고 권장되는 방법입니다.**
**`conf/server.xml`**
```xml
<Hostname="localhost"appBase="webapps"
unpackWARs="true"autoDeploy="true">
<!--
RemoteIpValve:
Nginx/Apache와 같은 프록시 서버로부터 받은 헤더를 기반으로
request.getRemoteAddr(), request.getScheme() 등의 값을 실제 클라이언트 값으로 대체해줍니다.
-`internalProxies`: 신뢰할 수 있는 프록시 서버의 IP 주소 목록입니다. 여기에 등록된 IP가 보낸 `x-forwarded-*` 헤더만 신뢰합니다. **중앙 프록시(`192.168.0.61`), Docker의 게이트웨이 IP 등을 등록해야 합니다.**
-`remoteIpHeader`: 클라이언트의 실제 IP가 담긴 헤더 이름입니다. (`X-Real-IP` 또는 `X-Forwarded-For`)
-`protocolHeader`: 원래 프로토콜(http/https)이 담긴 헤더 이름입니다. (`X-Forwarded-Proto`)
`RemoteIpValve`를 사용하면, `ProxyPass` 설정 시 `proxyName`, `proxyPort`, `scheme` 같은 속성을 Connector에 일일이 설정할 필요가 없어 구성이 매우 깔끔해집니다.
Tomcat의 Connector는 SSL 설정 없이 일반 HTTP/AJP로 유지합니다.
**HTTP Connector:**
```xml
<Connectorport="8080"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
```
**AJP Connector (AJP 연동 시):**
```xml
<Connectorprotocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443"/>
```
## 6. 결론
Tomca.t 애플리케이션에 SSL을 적용하는 가장 현대적이고 효율적인 방법은 **리버스 프록시를 사용한 SSL 오프로딩**입니다
1.`openssl` 또는 `certbot`으로 **인증서를 준비**합니다.
2.**Nginx/Apache 프록시 서버에 SSL을 설정**하고 Tomcat으로 요청을 전달합니다. (Docker/Bare-metal 환경에 맞게)
3.**Tomcat의 `server.xml`에는 `RemoteIpValve`를 설정**하여 프록시 환경에 대응합니다.
이 구조를 통해 SSL 인증서 관리와 트래픽 제어를 프록시 서버에 위임하고, Tomcat은 비즈니스 로직에 집중하여 안정적이고 확장성 있는 서비스 아키텍처를 구축할 수 있습니다.
## 7. 고급 구성: End-to-End 암호화 (Re-Encryption)
지금까지 설명한 **SSL 오프로딩**이 가장 일반적이고 효율적인 방법이지만, 내부망 보안 규정과 같은 특수한 요구사항으로 인해 리버스 프록시와 Tomcat 서버 간의 통신까지 암호화해야 하는 경우가 있습니다. 이 구성을 "End-to-End 암호화" 또는 "Re-Encryption"이라고 부릅니다.