Apache HTTP 서버와 Tomcat 애플리케이션 서버를 연계하는 방식에는 크게 AJP(Apache JServ Protocol) 방식Reverse Proxy(역방향 프록시) 방식이 있습니다. 두 방식은 각각의 특징과 장단점, 설정 방법 등이 다르며, 시스템 구조나 운영 요구사항에 따라 적절히 선택해야 합니다.
아래에서는 두 방식을 비교·설명하고, 예시 설정 방법까지 상세히 다뤄보겠습니다.


1. 개요

1.1 Apache와 Tomcat의 연동 목적

  • 보안: 외부에서 직접 Tomcat에 접근하지 못하도록, Apache가 요청을 먼저 받아 필터링·방화벽 설정을 적용한 뒤 Tomcat에 전달
  • 부하 분산: 여러 대의 Tomcat 서버에 트래픽을 분산(load balancing)
  • 캐싱/정적 파일 처리: Apache 측에서 정적 콘텐츠(이미지, CSS, JS 등)를 처리하여 Tomcat의 부담을 줄임
  • URL 라우팅: 도메인 혹은 특정 경로에 대한 요청을 Tomcat으로 연결할 때, Apache의 가상 호스트(VirtualHost) 설정을 통해 유연한 경로 제어

1.2 연동 방식 두 가지

  1. AJP(Apache JServ Protocol)
    • Apache가 Tomcat과 통신할 때, AJP라는 바이너리 프로토콜을 사용하는 방식
    • mod_proxy_ajp, 혹은 mod_jk(과거) 모듈 등을 통해 연결
  2. Reverse Proxy(역방향 프록시)
    • Apache가 클라이언트 요청을 받아 일반 HTTP/HTTPS 프로토콜로 Tomcat에 전달하는 방식
    • mod_proxy_http 모듈 사용

아래 섹션에서는 각 방식의 특징·장단점·설정 방법을 자세히 살펴봅니다.


2. AJP(Apache JServ Protocol) 방식

2.1 AJP 개요

AJPApache HTTP 서버와 Java 애플리케이션 서버(특히 Tomcat) 간 통신을 효율적으로 하기 위해 개발된 바이너리 프로토콜입니다. HTTP(텍스트 기반)보다 작은 헤더를 사용하고, 세션 관리 정보를 포함하여 빠르게 정보를 전달할 수 있도록 설계되었습니다.

일반적으로 Tomcat의 AJP Connector(예: port="8009")와, Apache의 mod_proxy_ajp 모듈을 함께 사용하여 동작합니다.

2.2 AJP 동작 원리 간단 설명

  1. 클라이언트http://example.com에 요청 → Apache HTTP 서버가 이를 수신
  2. Apache가 ProxyPass 또는 mod_jk 설정 등을 통해 AJP 프로토콜로 요청을 변환하여 Tomcat의 AJP 포트(기본 8009)로 전달
  3. Tomcat은 AJP 요청을 받아, 서블릿/JSP/스프링 등 내부 로직을 수행
  4. 응답을 AJP 프로토콜을 통해 다시 Apache로 전송
  5. Apache가 최종 응답을 클라이언트에게 반환

이 과정에서 AJP는 HTTP에 비해 압축된 형태로 데이터를 주고받으며, Tomcat에 클라이언트 IP 정보 등을 전달하여 세션을 유지하기 쉽게 해줍니다.

2.3 AJP의 장점

  1. 고성능
    • AJP는 HTTP보다 단순하고 경량화된 프로토콜로 설계되어 데이터 교환 속도가 빠른 편입니다.
  2. 세션 관리 편의
    • 클라이언트 IP, SSL 정보 등 다양한 헤더 정보를 Tomcat에 전달할 수 있어 세션 관리가 용이합니다.
  3. 로드 밸런싱 지원
    • Apache의 mod_proxy_balancer와 연계해 AJP 기반 로드밸런싱을 설정하기 좋습니다(물론 HTTP 프로토콜도 로드밸런싱 가능하지만, AJP는 여기에 특화되어 있습니다).

2.4 AJP의 단점

  1. 보안 취약점
    • AJP 포트가 외부에 노출되어 있거나, 설정이 잘못되어 있으면 공격자가 AJP 포트를 통해 서버 내부에 직접 접근할 수 있게 됩니다.
    • Tomcat 9.0.31 이상부터는 AJP 관련 보안이 강화되어, 기본적으로 외부 접근을 차단하는 기능(secretRequired 속성 등)이 추가되었습니다.
  2. 구성 복잡성
    • AJP Connector, mod_proxy_ajp, 혹은 mod_jk 설정 등을 모두 맞춰줘야 하므로, Reverse Proxy보다 설정이 조금 더 복잡할 수 있습니다.
  3. Tomcat 중심
    • AJP 프로토콜은 Tomcat(또는 유사한 Java 애플리케이션 서버)와의 통신을 염두에 둔 것이므로, 다른 종류의 서버(Nginx, Jetty, WildFly 등)와 직접 연동하려면 별도 설정·제약 사항이 있을 수 있습니다.

2.5 AJP 설정 예시

2.5.1 Tomcat 설정 (server.xml)

<Connector 
    port="8009" 
    protocol="AJP/1.3" 
    redirectPort="8443"
    secretRequired="true"
    secret="myAJPSecret"
/>
  • port="8009": AJP 디폴트 포트
  • protocol="AJP/1.3": AJP 1.3 프로토콜 사용
  • secretRequired="true"secret="myAJPSecret":
    • Tomcat 9.0.31 이상에서 적용 가능.
    • AJP 연결 시 필요한 보안 설정(이 값을 Apache 측과 일치시켜야 함).

2.5.2 Apache 설정 (httpd.conf 혹은 extra/httpd-ssl.conf 등)

# AJP 모듈 로드
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

<VirtualHost *:80>
    ServerName example.com

    # AJP를 통해 Tomcat과 연결
    ProxyPass        / ajp://localhost:8009/
    ProxyPassReverse / ajp://localhost:8009/

    # Tomcat 9.0.31 이상에서 secretRequired가 true인 경우
    # AJP 포트 접근 시 shared secret을 맞춰줘야 한다.
    # Apache 2.4.42 이상에서 가능 (mod_proxy_ajp Secret)
    # ProxyPass        / ajp://localhost:8009/ secret=myAJPSecret
    # ProxyPassReverse / ajp://localhost:8009/ secret=myAJPSecret
</VirtualHost>
  • LoadModule proxy_ajp_module을 통해 mod_proxy_ajp 기능을 활성화
  • ProxyPass, ProxyPassReverse 지시어로 / 경로에 대한 요청을 ajp://localhost:8009/ 로 전달

보안 팁: 실제 운영환경에서는 방화벽 혹은 iptables 등을 통해 8009 포트를 외부에 노출되지 않도록 해야 합니다.


3. Reverse Proxy 방식

3.1 Reverse Proxy 개요

Reverse Proxy 방식에서는 Apache가 클라이언트로부터 HTTP/HTTPS 요청을 받은 후, HTTP/HTTPS 프로토콜 그대로 Tomcat에 전달합니다. 즉, Apache가 프록시 서버 역할을 하여 뒤편(백엔드)에 있는 Tomcat을 대신해 요청을 처리하는 형태입니다.

대부분의 경우 Apache 설정에서 mod_proxy + mod_proxy_http 모듈을 사용하며, Tomcat은 일반 HTTP Connector(port=8080 등) 설정만 해두면 됩니다.

3.2 Reverse Proxy 동작 원리 간단 설명

  1. 클라이언트http://example.com 요청 → Apache HTTP 서버가 수신
  2. Apache가 ProxyPass / http://localhost:8080/ 지시어를 통해, 들어온 요청을 Tomcat의 HTTP 포트(8080)로 전달
  3. Tomcat이 HTTP 요청을 받아 로직 수행
  4. 응답을 다시 HTTP로 Apache에 반환
  5. Apache가 클라이언트에게 최종 응답 반환

3.3 Reverse Proxy의 장점

  1. 보안성
    • AJP에 비해 오랜 기간 널리 사용되어온 HTTP/HTTPS 프로토콜이므로, 방화벽·SSL 인증서 등을 구축하기가 수월합니다.
    • HTTPS를 쓰면 트래픽 암호화가 용이합니다.
  2. 설정 간단
    • AJP처럼 별도의 AJP Connector나 secret 설정이 필요 없고, HTTP Connector만으로 충분합니다.
  3. 유연성
    • Tomcat 외에도 여러 서버(Nginx, Node.js, Python WSGI 서버 등)와도 쉽게 연동이 가능합니다.
    • Apache가 여러 서버로의 Reverse Proxy를 동시에 수행할 수도 있습니다.
  4. 디버깅 편의
    • TCP 덤프나 Wireshark 등으로 HTTP 패킷을 쉽게 분석할 수 있어, 문제 해결 시 상대적으로 디버깅이 쉽습니다.

3.4 Reverse Proxy의 단점

  1. 성능
    • 바이너리 프로토콜인 AJP보다, 일반 텍스트 HTTP 프로토콜에는 약간의 오버헤드가 있을 수 있습니다.
    • 하지만 현대 서버 환경(고속 네트워크, 강력한 CPU)에서는 이 차이가 크게 문제되지 않는 경우가 많습니다.
  2. 헤더 전송 제약
    • HTTP 요청/응답 헤더 크기가 너무 클 경우, 일부 애플리케이션에서 호환성 문제가 발생할 수 있습니다(AJP도 헤더 제한이 있지만 상대적으로 허용 범위가 넓다고 알려져 있음).

3.5 Reverse Proxy 설정 예시

3.5.1 Tomcat 설정 (server.xml)

<Connector 
    port="8080"
    protocol="org.apache.coyote.http11.Http11NioProtocol"
    connectionTimeout="20000"
    redirectPort="8443"
/>
  • 기본적인 HTTP Connector
  • 특별한 추가 설정이 필요 없으며, HTTPS를 사용하려면 SSL 설정을 적용하면 됩니다.

3.5.2 Apache 설정 (httpd.conf 등)

# Reverse Proxy 모듈 로드
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

<VirtualHost *:80>
    ServerName example.com

    ProxyPass        / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
</VirtualHost>
  • mod_proxy_http 모듈 사용
  • ProxyPassProxyPassReverse를 이용해, Apache가 수신한 모든 요청(/)을 Tomcat의 8080 포트로 포워딩

: SSL(HTTPS)을 Apache에 적용하려면 Listen 443, SSLEngine on, SSLCertificateFile, SSLCertificateKeyFile 등을 설정한 뒤, ProxyPass https://localhost:8080/처럼 구성할 수도 있습니다.


4. AJP와 Reverse Proxy 비교

다음 표에서 간략히 비교해 봅시다.

특징 AJP(Apache JServ Protocol) Reverse Proxy(HTTP/HTTPS)
프로토콜 AJP (바이너리) HTTP/HTTPS (텍스트 기반)
성능 상대적으로 빠른 편 약간의 오버헤드, 현대 환경에서는 큰 차이 X
보안 별도 설정 없으면 취약 가능성 有 HTTPS 기반으로 강화된 보안 제공
구성 난이도 다소 복잡 (AJP Connector, secret) 비교적 단순 (HTTP/HTTPS Connector 활용)
유연성 Tomcat 중심 다양한 서버(Nginx, Node.js 등)와 연계 가능
로드 밸런싱 mod_proxy_balancer, mod_jk 등 지원 mod_proxy_balancer 등 동일하게 지원
헤더 지원 AJP 자체 확장 헤더 가능 일반 HTTP 헤더 크기 제한 존재
주요 적용 사례 고성능, 세션/IP 전달이 중요한 경우 대부분의 일반 웹/REST 서비스, 보안 중시
Tomcat 버전 9.0.31 이상 시 secretRequired 보안 별도 제약 적음

4.1 어떤 방식을 선택해야 할까?

  1. 보안과 간단함이 우선이라면 → Reverse Proxy
    • HTTPS 환경 구성이 쉽고, 설정이 간단하며 다양한 서버와 연계 가능합니다.
    • 다수의 웹 애플리케이션 환경에서 가장 널리 쓰이는 방식입니다.
  2. 고성능, 세션 IP 전달, 엔터프라이즈 로드 밸런싱이 필요하다면 → AJP
    • 세션 관리나 IP 전달을 위해 AJP 특성을 적극 활용할 수 있습니다.
    • Apache와 Tomcat 간 트래픽이 매우 많은 초고성능 환경에서 일부 이점을 기대할 수 있습니다.
    • 단, AJP 보안을 꼼꼼히 설정해야 합니다(특히 최신 Tomcat 버전에서 secretRequired 사용 권장).

5. 결론 및 운영 시사점

  1. AJP

    • 예전부터 Apache-Tomcat 연동에 많이 쓰인 전통적인 방식
    • 성능 이점과 세션 정보 전송에 유리하지만, 보안 설정에 각별히 주의해야 함
    • Tomcat 9.0.31 이상에선 secretRequired가 기본 활성화되거나 권장되므로, 실제 운영환경에서는 반드시 secret을 맞춰주는 등 접근 제한이 필수
  2. Reverse Proxy

    • 현대적인 서버 운영 환경에서 가장 광범위하게 사용되는 방식
    • HTTPS 적용, 방화벽, 인증서 설정이 용이해, 전반적으로 초보자/일반 운영자에게 더 적합
    • 성능이나 세션 관리도 크게 문제되지 않는다면, 이 방식을 권장
  3. 로드 밸런싱 및 확장성

    • AJP나 Reverse Proxy 모두 Apache의 mod_proxy_balancer 등을 통해 로드 밸런싱을 설정할 수 있음
    • AJP는 Tomcat 클러스터링과 함께 세션 스티키(stickiness)를 쉽게 구성할 수 있으나, Reverse Proxy도 쿠키 기반 스티키 세션 등 다양한 방식 지원
  4. 최신 Tomcat 버전 주의사항

    • Tomcat 9.0.31 이후, AJP 보안이 크게 강화됨 → AJP를 사용한다면 관련 설정을 꼼꼼히 확인할 것
    • Reverse Proxy는 기본 HTTP/HTTPS이므로 추가 보안 옵션은 Apache(또는 외부 로드밸런서)에서 충분히 적용 가능

6. 종합 추천

  • 초보자나 일반 웹 애플리케이션Reverse Proxy:
    • 설정이 간단하고, HTTPS 기반 보안이 수월하여 실무에서 많이 쓰임
    • 장애 상황 디버깅도 용이
  • 고성능 및 세부 세션 관리 필요, 사내망 등 보안 통제가 엄격한 환경AJP
    • 내부망에서 동작하며, 방화벽·네트워크 레벨에서 AJP 포트를 안전하게 보호할 수 있다면, AJP로 인한 성능 이점을 충분히 살릴 수 있음
    • Tomcat 9.0.31 이상의 secretRequired 설정 포함, Apache 측과의 secret 일치 필수

결론적으로, 대다수의 현대 웹 서비스 운영 환경에서는 Reverse Proxy 방식이 더 널리 쓰이고, AJP는 특수한 엔터프라이즈 환경에서 여전히 가치가 있는 선택지입니다. 운영 상황, 보안 정책, 트래픽 규모, 세션 관리 전략 등을 종합적으로 검토해 결정하는 것이 좋습니다.


참고 자료


마무리

AJP vs. Reverse Proxy는 단순히 “무엇이 좋다”가 아니라 시스템 요구사항보안 정책, 트래픽 특성 등에 따라 선택해야 합니다. Reverse Proxy는 범용적이고 간편하며, HTTPS 기반 설정이 손쉬워 “대다수”의 환경에서 권장되는 방식입니다. 하지만 초고성능을 필요로 하거나 세션 스티키/추가 헤더 전달이 매우 중요한 경우, AJP 프로토콜에 익숙한 팀이라면 충분히 AJP를 고려할 수 있습니다.

앞으로도 톰캣 버전 업에 따라 AJP 보안 설정이 지속적으로 업데이트될 수 있으니, 공식 문서 및 릴리스 노트를 수시로 확인하고 적용하시기 바랍니다. 무엇보다도 실제 운영 전 충분한 테스트와 검증을 거치는 것이 최선입니다.

태그:

카테고리:

업데이트:

댓글남기기