어플리케이션

AJP(Apache JServ Protocol) 에 대해 알아보겠습니다.

forward error correction Circle 2025. 2. 19. 08:47
반응형

Ⅰ. AJP(Apache JServ Protocol) 란?

 웹 서버(Apache HTTP Server 등)와 애플리케이션 서버(Tomcat 등) 간의 통신을 위한 바이너리 프로토콜입니다.
웹 서버에서 정적 콘텐츠를 제공하고, 동적 요청(예: Servlet, JSP 등)을 애플리케이션 서버로 효율적으로 전달하는 역할을 합니다.

Ⅱ. AJP(Apache JServ Protocol) 주요 특징

 ⅰ. 바이너리 프로토콜
   : 텍스트 기반인 HTTP와 달리 바이너리 형식으로 데이터를 주고받음 → 빠르고 가벼움
     데이터 크기가 작아 네트워크 트래픽 감소
 ⅱ. 지속적 연결 (Persistent Connection)
   : 클라이언트와 서버 간 지속적인 연결(keep-alive) 을 유지하여 연결 오버헤드를 줄임
     HTTP 요청마다 새 연결을 생성하는 것보다 효율적
 ⅲ. 로드 밸런싱 & 클러스터링 지원
  : Apache HTTP Server + Tomcat 클러스터 환경에서 AJP를 사용하면 부하 분산 가능
   여러 Tomcat 인스턴스에 요청을 분배하여 가용성과 확장성을 높일 수 있음
 ⅳ.  HTTP 헤더 압축
  : HTTP 요청의 헤더를 압축하여 전송 → 전송 속도 향상
 ⅴ. 보안 기능
  : 기본적으로 내부 네트워크에서 동작하도록 설계됨
     외부 공격을 방지하려면 AJP 포트를 방화벽으로 보호해야 함

Ⅲ. AJP(Apache JServ Protocol) 동작 방식

 ⅰ. 기본 구조

클라이언트 → (HTTP 요청) → Apache 웹 서버 → (AJP) → Tomcat → 응답 반환


ⅱ.  요청 처리 흐름
 1) 클라이언트가 웹 서버(Apache HTTP Server) 에 HTTP 요청을 보냄
 2) Apache가 요청을 확인하고, 정적 콘텐츠(HTML, CSS, 이미지 등)는 자체적으로 처리
 3) 동적 콘텐츠(서블릿, JSP 등)는 AJP 프로토콜을 통해 Tomcat으로 전달
 4) Tomcat이 요청을 처리하고 응답을 생성
 5) Tomcat이 AJP를 통해 Apache로 응답 전송
 6) Apache가 클라이언트에게 HTTP 응답을 반환


ⅲ. AJP 설정 방법 (Apache + Tomcat 연동)
 ⅰ. Tomcat에서 AJP 활성화 (server.xml)
 Tomcat에서 AJP를 사용하려면 server.xml에서 AJP 커넥터(Connector)를 활성화해야 합니다.

<Connector protocol="AJP/1.3"
           address="0.0.0.0"
           port="8009"
           redirectPort="8443"
           secretRequired="false" />

[설명 설명]
protocol="AJP/1.3" → AJP 1.3 프로토콜 사용
address="0.0.0.0" → 모든 네트워크 인터페이스에서 요청을 받을 수 있음
port="8009" → AJP가 사용하는 기본 포트 (방화벽에서 허용 필요)
redirectPort="8443" → HTTPS 요청 리디렉션 포트
secretRequired="false" → Tomcat 9부터 보안 강화를 위해 비밀키(secret) 가 기본적으로 필요함 (설정을 false로 변경하여 비활성화 가능)


 ⅱ. Apache에서 AJP 모듈 설정 (httpd.conf 또는 workers.properties)
   Apache 웹 서버에서 AJP 모듈(mod_proxy_ajp)을 활성화해야 합니다.
Apache HTTPD 설정 (httpd.conf 또는 extra/httpd-ajp.conf)

<VirtualHost *:80>
    ServerName example.com

    ProxyPass "/app" "ajp://localhost:8009/app"
    ProxyPassReverse "/app" "ajp://localhost:8009/app"
    ErrorLog "logs/ajp_error.log"
    CustomLog "logs/ajp_access.log" common
</VirtualHost>

[설명 설명]
/app URL 경로에 대한 요청을 AJP를 통해 Tomcat의 /app으로 전달
ProxyPassReverse는 응답 헤더 수정 (Tomcat이 반환한 URL을 Apache 기준으로 변경)
ErrorLog와 CustomLog를 설정하여 로그 기록

Ⅳ. AJP vs HTTP vs HTTPS 비교

프로토콜 방식 속도 사용 사례  보안
HTTP 텍스트 느림  직접 요청 전달  보안 없음
HTTPS TLS 암호화 느림 보안이 필요한 요청 암호화된 연결
AJP 바이너리 빠름 웹 서버 ↔ 애플리케이션 서버 간 통신 내부 네트워크에서만 사용해야 함

 

Ⅴ. AJP(Apache JServ Protocol)보안 문제 및 해결 방법

 ⅰ. 보안 문제
   1) AJP는 보안이 강화되지 않은 내부 네트워크용 프로토콜
   2) AJP 포트(기본 8009)가 외부에 노출되면 공격자가 직접 요청을 보내 원격 코드 실행(RCE) 취약점 발생 가능
   3) 2020년 Ghostcat(CVE-2020-1938) 취약점으로 인해 AJP 포트를 보호하지 않으면 위험
 ⅱ. 해결 방법
   1) AJP 포트 외부 노출 금지 (firewalld 또는 iptables 사용)

firewall-cmd --permanent --add-port=8009/tcp --zone=internal
firewall-cmd --reload


  2) AJP 요청을 특정 IP에서만 허용 (server.xml에서 address="127.0.0.1" 설정)

  3) AJP Secret 설정 활성화 (server.xml에서 secretRequired="true" 및 secret="yourSecret")

<Connector protocol="AJP/1.3"
           address="127.0.0.1"
           port="8009"
           secretRequired="true"
           secret="yourSecret" />


 4) Apache에서 secret 설정 추가
   : ProxyPass "/app" "ajp://localhost:8009/app?secret=yourSecret"

반응형