Tomcat 웹 애플리케이션 보호

tomcat은 WAR를 자체 완결형 Tomcat 베이스로 변환합니다. 패키저에 내장된 Tomcat 구성 요소를 사용하며, 로컬에 설치된 Tomcat은 전혀 건드리지 않습니다.

1. GUI에서 하는 방법

  1. 애플리케이션 유형 페이지에서 Tomcat WAR를 선택합니다.

    Tomcat WAR 선택

  2. 입력 WAR, 함께 넣을 Java 버전, 대상 플랫폼을 선택한 뒤 간단 모드와 고급 모드 중에서 고릅니다.

    입력, Java 버전, 대상 플랫폼, 모드 선택

  3. 고급 모드에서는 Tomcat 9 또는 10.1을 고르거나 자동 감지 상태로 두고, 필요에 따라 컨텍스트 경로, JVM 시작 옵션, 제외 규칙을 지정합니다. 간단 모드는 호환성 검사 결과로 Tomcat 버전을 정합니다. 각 옵션의 의미는 Protector4J 고급 모드 설정을 참고하세요.

    Tomcat 버전, 컨텍스트 경로, 제외 규칙 설정

  4. 출력 디렉터리를 선택하고 요약을 확인한 뒤 보호 실행을 클릭합니다.

    출력 디렉터리를 선택하고 보호 실행

2. CLI 예제

컨텍스트 경로를 지정하는 경우:

p4j tomcat app.war dist --context /app

호환성 검사와 권장 설정 자동 적용:

p4j tomcat app.war --compat-scan
p4j tomcat app.war dist --compat-apply --context /app

두 옵션은 함께 쓸 수 없습니다. 차이는 다음과 같습니다.

옵션동작사용 시점
--compat-scan입력 WAR를 검사해 위험 요소와 설정 권장을 출력하고 종료합니다. 인코딩하지 않고 dist도 만들지 않으므로 출력 디렉터리가 필요 없습니다.처음 보호할 때, Tomcat 관련 의존성을 올린 뒤, 보호 범위나 JSP 설정을 바꾼 뒤, 호환성 문제를 조사할 때 먼저 보고서를 확인합니다.
--compat-apply검사한 뒤 보수적인 권장 설정을 반영하고 그대로 인코딩해 결과물을 만듭니다. 따라서 출력 디렉터리가 필요합니다.검사 결과를 확인하고 권장 설정을 받아들인 뒤 패키징을 마무리할 때 사용합니다. 규칙이 검증된 반복 빌드나 CI에도 적합합니다.

tomcat에서 --compat-apply는 검사 결과에 따라 제외 규칙을 추가하고 Tomcat 버전, 스캐너 ZIP 오버레이, 아카이브 확장자를 조정할 수 있습니다. 이 세 가지는 명령줄에서 직접 지정한 값이 우선합니다. 권장되는 제외 규칙은 기본적으로 직접 지정한 --exclude와 합쳐집니다. 자동 추가를 원하지 않으면 --no-compat-excludes를 함께 전달하세요. 스캐너는 정적 휴리스틱 분석만 수행하므로 소스 수정이 필요한 문제는 --compat-apply로 해결되지 않으며, 패키징한 뒤에도 대상 플랫폼에서 회귀 테스트가 필요합니다.

그 밖의 CLI 명령, 전체 옵션, 환경 변수, 자동화 예제는 CLI 레퍼런스를 참고하세요.

--tomcat-version의 기본값은 auto입니다. 직접 지정하려면 9 또는 10.1을 씁니다.

p4j tomcat app.war dist --context /app --tomcat-version 10.1

3. 출력 구조

dist/
├── bin/
│   ├── catalina.sh
│   ├── startup.sh
│   ├── shutdown.sh
│   └── *.bat
├── conf/p4jx/
│   ├── contexts.list
│   ├── protected-classes.list
│   └── allowed-prefixes.list
├── protected/
│   └── app.p4jx
├── lib/
│   ├── p4jx-tomcat-runtime.jar
│   └── tomcat-runtime-deps.jar
├── vlxjre/
├── run.sh
└── run.bat

기본적으로 물리적인 WAR는 만들어지지 않습니다. web.xml, 정적 리소스, 보호되지 않은 클래스, 메타데이터 스텁, 보호된 구현이 모두 protected/<context>.p4jx에 들어가고, P4JX의 WebResourceSet을 통해 Tomcat에 제공됩니다.

4. 시작과 종료

포그라운드로 실행:

./run.sh

Tomcat 방식으로 백그라운드에서 시작·종료:

./bin/startup.sh
./bin/shutdown.sh

Windows에서는 대응하는 .bat 파일을 씁니다. 로그는 출력 디렉터리 안의 logs/에 기록됩니다.

Windows용으로 패키징할 때는 내장 Tomcat을 포그라운드로 시작하는 네이티브 실행기도 만들 수 있습니다. 자세한 내용은 Windows EXE 실행기 생성을 참고하세요.

JVM 시작 옵션

패키징할 때 GUI의 JVM 시작 옵션에 한 줄에 하나씩 입력하거나 명령줄에서 지정합니다.

p4j tomcat app.war dist \
  --context /app \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

배포된 패키지에서 바꾸려면:

  • macOS와 Linux: bin/catalina.sh를 편집해 run_java() 안의 JVM_OPTS=(...) 뒤에 JVM_OPTS+=("-Xms1g" "-Xmx2g")를 추가합니다. 포그라운드 실행과 startup.sh로 시작하는 백그라운드 실행 모두에 적용됩니다.
  • Windows 포그라운드: bin\catalina.bat을 편집해 기존 set "JVM_OPTS=..." 뒤에 set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g"를 추가합니다.
  • Windows 백그라운드: bin\startup.batcatalina.bat을 호출하기 전에 set "APP_JAVA_OPTS=-Xms1g -Xmx2g"를 추가합니다. 포그라운드와 백그라운드를 한꺼번에 영구 설정하려면 GUI나 CLI로 패키지를 다시 만드는 편이 간단합니다.

명령 앞에 APP_JAVA_OPTS를 설정해 한 번만 적용할 수도 있습니다. CMD, PowerShell, 스크립트의 자세한 예제는 JVM 시작 옵션을 참고하세요.

5. Tomcat 버전 고르기

WAR에서 쓰는 API 네임스페이스Tomcat필요한 Java
javax.servlet.*Tomcat 9Java 8, 11, 17, 21, 25
jakarta.servlet.*Tomcat 10.1Java 11, 17, 21, 25

자동 감지는 먼저 애플리케이션 클래스와 배포 서술자에서 API 네임스페이스를 판별하고, JAR 파일 이름은 보조 근거로만 씁니다. javaxjakarta가 함께 쓰이면 도구는 추측하지 않습니다.

6. JSP

WAR에 JSP가 들어 있으면 기본적으로 인코딩 단계에서 서블릿 클래스와 URL 매핑으로 미리 컴파일합니다. 실행 중에 JSP를 컴파일하면 Tomcat 작업 디렉터리에서 새 클래스를 정의하게 되는데, 이는 보호된 런타임이 허용하는 클래스 정의 경계를 벗어나기 때문입니다.

직접 제어할 수도 있습니다.

--precompile-jsp
--no-precompile-jsp

운영 환경에서는 기본값인 사전 컴파일을 유지하세요. 끄면 JSP를 쓰는 애플리케이션에서 페이지가 열리지 않을 수 있습니다.

7. 보호 범위와 제외 규칙

기본적으로 WEB-INF/classes 아래의 애플리케이션 클래스를 보호하고 WEB-INF/lib는 보호 범위 밖입니다. 웹에 노출되는 클래스는 제외할 수 있습니다.

p4j tomcat app.war dist \
  --context /app \
  --exclude 'com.example.web.**,com.example.dto.**'

서블릿, 필터, 리스너를 먼저 제외하고 DTO, 설정 클래스, 엔티티, JNI 브리지 클래스, 컨테이너가 확장해야 하는 클래스도 제외하세요. 호환성 검사가 보수적인 권장을 제시합니다.

8. 같은 Tomcat 패키지에 애플리케이션 추가

p4j tomcat second.war dist \
  --append-app \
  --context /second

제약 조건:

  • 컨텍스트 경로가 기존 애플리케이션과 겹치면 안 됩니다.
  • 기존 애플리케이션과 새 애플리케이션의 Tomcat 메이저 버전, Java 버전, 대상 플랫폼이 같아야 합니다.
  • --append-app을 전달하지 않으면 도구는 기존 Tomcat 패키지에 쓰기를 거부합니다.
  • GUI에서는 기존 Tomcat 폴더에 애플리케이션 추가를 선택하고 기존 디렉터리를 직접 고릅니다.

9. Java 8 참고 사항

Java 8 대상에서는 ZIP 오버레이가 자동으로 켜져 Tomcat의 WebResourceSet이 보호된 아카이브를 열 수 있습니다.