⚙️ Penta HandsOn 서버 설치 및 보안 설정 가이드

200~300명 동시 사용 환경 기준 · OpenJDK 17 + Apache HTTP Server + Apache Tomcat 9

📅 작성일: 2026-04 🖥️ 대상 OS: Windows Server 2019/2022 👥 사용자: 200~300명 📦 버전: HandsOn 1.0

📋 목차

  1. 시스템 요구사항
  2. OpenJDK 17 설치
  3. Apache Tomcat 9 설치 및 기본 설정
    1. 다운로드 및 설치
    2. server.xml 보안·성능 설정
    3. web.xml 보안 설정
    4. context.xml 보안 설정
    5. Windows 서비스 등록
  4. Apache HTTP Server 설치 및 설정
    1. 다운로드 및 설치
    2. Tomcat 연동 (Reverse Proxy)
    3. SSL/HTTPS 설정
    4. Apache 보안 헤더 설정
  5. 성능 튜닝 (200~300명 기준)
  6. 방화벽 및 포트 설정
  7. 환경변수 및 민감 정보 관리
  8. 서비스 시작·중지 방법
  9. 설치 완료 최종 점검 체크리스트
  10. 트러블슈팅
1

시스템 요구사항

권장 서버 사양 (200~300명 동시 접속 기준)

항목최소권장
CPU4코어8코어 이상
RAM8GB16GB 이상
디스크50GB SSD100GB+ SSD (OS + 파일서버 분리 권장)
OSWindows Server 2019Windows Server 2022
네트워크100Mbps1Gbps

소프트웨어 버전

소프트웨어버전역할
OpenJDK17 (LTS)Java 실행 환경
Apache Tomcat9.0.x (최신)Java 웹 애플리케이션 서버
Apache HTTP Server2.4.x (최신)리버스 프록시 · SSL 처리
PostgreSQL16데이터베이스
ℹ️
구성 개요: 외부에서 오는 요청은 Apache HTTP Server(80/443 포트)가 받고, Tomcat(8080 포트)으로 전달합니다. 사용자에게는 Apache의 포트만 노출되므로 Tomcat 포트를 방화벽으로 차단해도 됩니다.
사용자 브라우저
    ↓  HTTPS 443 (또는 HTTP 80)
Apache HTTP Server  ← SSL 인증서 처리, 보안 헤더, 정적 파일 캐싱
    ↓  HTTP 8009/AJP 또는 HTTP 8080 (내부 통신)
Apache Tomcat 9     ← Java 앱 실행 (HandsOn)
    ↓
PostgreSQL 5432
2

OpenJDK 17 설치

2-1. 다운로드

다운로드 사이트 접속

아래 주소를 웹 브라우저에 입력합니다:

https://adoptium.net/temurin/releases/

이 사이트는 OpenJDK의 공식 배포판인 Eclipse Temurin을 제공합니다. 상업용 무제한 무료 사용 가능한 OpenJDK 배포판입니다.

다운로드 옵션 선택

  • Version: 17 - LTS 선택
  • OS: Windows 선택
  • Architecture: x64 선택
  • Package Type: JDK 선택

.msi 파일을 클릭하여 다운로드합니다.
파일명 예시: OpenJDK17U-jdk_x64_windows_hotspot_17.0.x_x.msi

설치 실행

다운로드한 .msi 파일을 더블클릭합니다.

  • 설치 마법사 화면에서 Next 클릭
  • "Set JAVA_HOME variable" 항목에서 드롭다운을 클릭 → "Will be installed on local hard drive" 선택
    ⚠️ 이 단계가 가장 중요합니다. 선택하지 않으면 환경변수가 자동 설정되지 않습니다.
  • "Add to PATH"도 동일하게 선택
  • Install 클릭 → 완료 후 Finish

설치 확인

시작 메뉴에서 cmd 검색 → 명령 프롬프트 실행 후 아래 명령어 입력:

java -version

아래와 같이 출력되면 정상입니다:

openjdk version "17.0.x" 202x-xx-xx
OpenJDK Runtime Environment Temurin-17.0.x+x
OpenJDK 64-Bit Server VM Temurin-17.0.x+x (build 17.0.x+x, mixed mode, sharing)

JAVA_HOME 환경변수 수동 확인 (자동 설정 안 된 경우)

시작 메뉴 → 시스템 환경 변수 편집 검색 → 실행

  • 환경 변수(N)... 클릭
  • 시스템 변수에서 JAVA_HOME 확인
  • 없으면 새로 만들기 클릭:
    • 변수 이름: JAVA_HOME
    • 변수 값: C:\Program Files\Eclipse Adoptium\jdk-17.x.x.x-hotspot
  • Path 변수 편집 → 새로 만들기%JAVA_HOME%\bin 추가
3

Apache Tomcat 9 설치 및 설정

3-1. 다운로드 및 설치

다운로드 사이트 접속

https://tomcat.apache.org/download-90.cgi

페이지 좌측 메뉴에서 9.0.x 버전을 클릭합니다.

Windows 설치 파일 다운로드

Binary Distributions → Core 섹션에서:

  • 64-bit Windows zip 클릭하여 다운로드
  • 파일명 예시: apache-tomcat-9.0.xx-windows-x64.zip
ℹ️
ZIP 파일을 사용합니다. Windows Installer(.exe)보다 ZIP이 설정 파일 위치를 직접 관리하기 쉽습니다.

설치 경로에 압축 해제

다운로드된 ZIP 파일을 아래 경로에 압축 해제합니다:

C:\tomcat9

압축 해제 후 폴더 구조:

C:\tomcat9\
  ├── bin\        ← 실행 파일 (startup.bat, shutdown.bat)
  ├── conf\       ← 설정 파일 (server.xml, web.xml, context.xml)
  ├── lib\        ← 라이브러리
  ├── logs\       ← 로그 파일
  ├── webapps\    ← 웹 애플리케이션 배포 폴더
  └── work\       ← JSP 컴파일 임시 파일

HandsOn WAR 파일 배포

빌드된 WAR 파일을 아래 경로에 복사합니다:

C:\tomcat9\webapps\HandsOn.war

Tomcat 시작 시 자동으로 압축이 풀립니다.

setenv.bat 생성 (환경변수 설정)

C:\tomcat9\bin\ 폴더에 setenv.bat 파일을 메모장으로 새로 만들어 저장합니다:

📄 C:\tomcat9\bin\setenv.bat@echo off
rem ── JVM 메모리 설정 (200~300명 기준) ──────────────
rem  -Xms: 초기 힙 메모리  -Xmx: 최대 힙 메모리
rem  서버 RAM 16GB 기준. RAM이 8GB이면 512m / 1g 로 조정
set CATALINA_OPTS=-Xms1g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200

rem ── DB 비밀번호 환경변수 (소스코드에 비밀번호 노출 방지) ──
set PENTA_DB_PASSWORD=실제DB비밀번호를여기에입력

rem ── 서버 정보 숨김 ──────────────────────────────────
set CATALINA_OPTS=%CATALINA_OPTS% -Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=false
🚨
주의: setenv.bat 파일은 절대 Git이나 외부에 공유하지 마세요. DB 비밀번호가 포함되어 있습니다.

3-2. server.xml 보안·성능 설정

파일 위치: C:\tomcat9\conf\server.xml

메모장이나 Notepad++로 열어서 아래 항목들을 찾아 수정합니다.

① Server 포트 변경 (기본 8005 → 비활성화)

Tomcat 기본 종료 포트 8005는 외부에서 Tomcat을 강제 종료할 수 있어 위험합니다.

수정 전<Server port="8005" shutdown="SHUTDOWN">
수정 후 (포트를 -1로 설정하면 비활성화)<Server port="-1" shutdown="DISABLED-RANDOM-STRING-XK9P2">

② Connector 설정 (HTTP 8080 포트 성능·보안)

기존 <Connector port="8080"> 태그를 찾아서 아래와 같이 교체합니다:

📄 C:\tomcat9\conf\server.xml  (Connector 부분)<Connector port="8080"
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           connectionTimeout="20000"
           maxThreads="200"
           minSpareThreads="10"
           maxConnections="8192"
           acceptCount="100"
           keepAliveTimeout="15000"
           maxKeepAliveRequests="100"
           compression="on"
           compressionMinSize="2048"
           noCompressionUserAgents="gozilla, traviata"
           compressibleMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json"
           URIEncoding="UTF-8"
           server=""
           xpoweredBy="false"
           secure="false"
           scheme="http" />

<!-- Apache에서 AJP로 연동할 경우 아래 AJP Connector 사용 (선택) -->
<!--
<Connector protocol="AJP/1.3"
           address="127.0.0.1"
           port="8009"
           secretRequired="true"
           secret="AJP_SECRET_CHANGE_ME"
           redirectPort="443"
           URIEncoding="UTF-8" />
-->

③ JSESSIONID 서버명 노출 제거

<Engine> 태그에서 jvmRoute 속성을 제거합니다:

수정 전 (서버명이 쿠키에 노출됨)<Engine name="Catalina" defaultHost="localhost" jvmRoute="서버명">
수정 후<Engine name="Catalina" defaultHost="localhost">

④ 기본 Valve (접근 로그) 설정

<Host> 태그 안에 아래 Valve가 있는지 확인합니다 (없으면 추가):

<Valve className="org.apache.catalina.valves.AccessLogValve"
       directory="logs"
       prefix="access_log"
       suffix=".txt"
       pattern="%h %l %u %t &quot;%r&quot; %s %b %D"
       rotatable="true" />

<!-- 요청 속도 제한 (동일 IP에서 초당 과도한 요청 차단) -->
<Valve className="org.apache.catalina.valves.RemoteIpValve"
       remoteIpHeader="X-Forwarded-For"
       protocolHeader="X-Forwarded-Proto" />
⚠️
maxThreads="200"는 200~300명 기준 적정값입니다. RAM이 8GB면 150으로 낮추세요. 각 스레드가 약 1MB 스택을 사용합니다.

3-3. Tomcat conf/web.xml 보안 설정

파일 위치: C:\tomcat9\conf\web.xml
⚠️ 이 파일은 Tomcat 전체에 적용됩니다. 애플리케이션의 WEB-INF/web.xml과 다릅니다.

① X-Powered-By 헤더 숨김

파일에서 JspServlet 설정 부분을 찾아 (servlet-namejsp인 블록) 아래 항목을 추가합니다:

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <!-- ↓ 이 부분 추가: X-Powered-By 헤더 숨김 -->
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

② 기본 서블릿 디렉토리 리스팅 비활성화

DefaultServlet 설정에서 listingsfalse로 합니다 (기본값이지만 확인):

<init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>  <!-- false 확인 -->
</init-param>

3-4. context.xml 쿠키 보안 설정

파일 위치: C:\tomcat9\conf\context.xml

<Context> 태그를 찾아 아래와 같이 수정합니다:

📄 C:\tomcat9\conf\context.xml<Context>
    <!-- WatchedResource는 기본 유지 -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- ↓ 추가: SameSite=Strict 쿠키 설정 (CSRF 방어) -->
    <CookieProcessor sameSiteCookies="strict" />
</Context>
이 설정으로 JSESSIONID 쿠키에 SameSite=Strict가 자동으로 추가됩니다. 외부 사이트에서 이 쿠키를 이용한 CSRF 공격이 차단됩니다.

3-5. Windows 서비스로 등록 (자동 시작)

서버 재부팅 시 Tomcat이 자동으로 시작되도록 Windows 서비스에 등록합니다.

명령 프롬프트를 관리자 권한으로 실행

시작 메뉴에서 cmd 검색 → 우클릭 → 관리자 권한으로 실행

서비스 등록 명령어 실행

cd C:\tomcat9\bin
service.bat install Tomcat9

"The service 'Tomcat9' has been installed." 메시지가 나오면 성공입니다.

서비스 자동 시작 설정

sc config Tomcat9 start= auto

서비스 시작

net start Tomcat9

또는 Windows 서비스(services.msc)에서 Tomcat9을 찾아 시작합니다.

동작 확인

브라우저에서 접속: http://서버IP:8080

Tomcat 기본 화면이 나오면 정상입니다.

⚠️
운영 환경에서는 Tomcat 기본 관리 페이지(manager, host-manager)를 삭제하세요:
C:\tomcat9\webapps\manager 폴더 삭제
C:\tomcat9\webapps\host-manager 폴더 삭제
C:\tomcat9\webapps\ROOT 폴더 삭제 (HandsOn만 운영 시)
4

Apache HTTP Server 설치 및 설정

ℹ️
왜 Apache가 필요한가요?
Apache HTTP Server를 Tomcat 앞에 두면: ① HTTPS(SSL) 처리, ② 정적 파일 직접 서비스(빠름), ③ 부하 분산, ④ Tomcat 포트(8080)를 외부에 노출하지 않아도 됨, ⑤ 추가 보안 설정 가능

4-1. 다운로드 및 설치

다운로드 사이트 접속

Apache 공식 사이트는 Windows 바이너리를 직접 제공하지 않으므로 아래 신뢰할 수 있는 배포처에서 다운로드합니다:

https://www.apachelounge.com/download/

Apache 2.4.x Win64 섹션에서 httpd-2.4.x-win64-VSxx.zip 클릭

Visual C++ 재배포 패키지 설치 (필수 선행 조건)

다운로드 페이지에서 안내하는 Microsoft Visual C++ Redistributable을 먼저 설치해야 합니다.

https://aka.ms/vs/17/release/vc_redist.x64.exe

위 파일을 다운로드하여 설치하세요.

설치 경로에 압축 해제

ZIP 파일을 아래 경로에 압축 해제합니다:

C:\Apache24

폴더 구조:

C:\Apache24\
  ├── bin\        ← 실행 파일 (httpd.exe)
  ├── conf\       ← 설정 파일 (httpd.conf)
  ├── logs\       ← 로그 파일
  ├── htdocs\     ← 기본 웹 루트 (사용 안 해도 됨)
  └── modules\    ← 모듈 파일

Windows 서비스로 설치

관리자 권한으로 명령 프롬프트를 열고:

cd C:\Apache24\bin
httpd.exe -k install -n "Apache24"

"The Apache24 service is successfully installed." 메시지가 나오면 성공

동작 테스트

httpd.exe -t

"Syntax OK" 메시지가 나와야 합니다.

net start Apache24

브라우저에서 http://localhost 접속 → "It works!" 페이지가 나오면 정상


4-2. Tomcat 연동 (Reverse Proxy)

파일 위치: C:\Apache24\conf\httpd.conf

메모장이나 Notepad++으로 열어서 아래 작업을 수행합니다.

① 필요한 모듈 활성화

아래 줄들에서 맨 앞의 #(주석 기호)을 제거합니다:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule headers_module modules/mod_headers.so

② 서버명 설정

ServerName 항목을 찾아 수정합니다 (# 제거 후):

ServerName amm.penta.co.kr:80

③ Tomcat으로 요청 전달 설정 추가

httpd.conf 파일 맨 끝에 아래 내용을 추가합니다:

📄 C:\Apache24\conf\httpd.conf (파일 끝에 추가)<!-- Tomcat 연동 설정 포함 -->
Include conf/extra/httpd-penta.conf

그 다음 C:\Apache24\conf\extra\ 폴더에 httpd-penta.conf 파일을 새로 만들어 아래 내용을 저장합니다:

📄 C:\Apache24\conf\extra\httpd-penta.conf#
# Penta HandsOn - Tomcat 리버스 프록시 설정
#

# Tomcat 직접 접근 차단 (Apache를 통해서만 접근 허용)
# Tomcat 8080 포트는 방화벽에서 외부 차단 후 이 설정으로 이중 차단

# HTTP → HTTPS 리다이렉트
<VirtualHost *:80>
    ServerName amm.penta.co.kr
    # 모든 HTTP 요청을 HTTPS로 리다이렉트
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]
</VirtualHost>

# HTTPS 메인 설정
<VirtualHost *:443>
    ServerName amm.penta.co.kr

    # SSL 설정 (5번 섹션 SSL 설정 후 주석 해제)
    SSLEngine on
    SSLCertificateFile      "C:/Apache24/ssl/server.crt"
    SSLCertificateKeyFile   "C:/Apache24/ssl/server.key"
    # 중간 인증서가 있는 경우
    # SSLCertificateChainFile "C:/Apache24/ssl/ca-bundle.crt"

    # 안전한 TLS 버전만 허용 (TLS 1.2 이상)
    SSLProtocol -all +TLSv1.2 +TLSv1.3
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
    SSLHonorCipherOrder on

    # ── Tomcat으로 요청 전달 ──────────────────────────
    ProxyRequests Off
    ProxyPreserveHost On

    # /HandsOn 경로를 Tomcat으로 전달
    ProxyPass        /HandsOn  http://localhost:8080/HandsOn
    ProxyPassReverse /HandsOn  http://localhost:8080/HandsOn

    # 루트 접속 시 HandsOn으로 이동
    RedirectMatch ^/$ /HandsOn/

    # ── 보안 헤더 (Apache 레벨) ──────────────────────
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set Permissions-Policy "geolocation=(self), camera=(self), microphone=()"

    # 서버 정보 숨김
    Header always unset X-Powered-By
    Header always unset Server

    # ── 로그 설정 ────────────────────────────────────
    ErrorLog  "C:/Apache24/logs/penta-error.log"
    CustomLog "C:/Apache24/logs/penta-access.log" combined
</VirtualHost>

4-3. SSL/HTTPS 인증서 설정

방법 A — 상용 SSL 인증서 (운영 권장)

인증서 구매/발급

인증서 발급 기관(CA)에서 도메인 인증서를 구매합니다. 무료 인증서는 Let's Encrypt를 이용할 수 있습니다.

인증서 파일 배치

C:\Apache24\ssl\ 폴더를 새로 만들고 인증서 파일을 복사합니다:

C:\Apache24\ssl\
  ├── server.crt   ← 도메인 인증서 파일
  ├── server.key   ← 개인키 파일 (절대 외부 노출 금지)
  └── ca-bundle.crt ← 중간 인증서 (있는 경우)
🚨
server.key 파일 권한: 이 파일은 관리자만 읽을 수 있도록 권한을 제한해야 합니다. 파일 우클릭 → 속성 → 보안 탭에서 Administrators만 읽기 권한으로 설정하세요.

방법 B — 자체 서명 인증서 (내부망 테스트용)

공인 인증서가 없는 내부 환경에서만 임시로 사용합니다.

OpenSSL이 설치된 환경에서 아래 명령어를 실행합니다 (Git Bash 또는 OpenSSL 별도 설치):

# 개인키 생성
openssl genrsa -out server.key 2048

# 자체 서명 인증서 생성 (유효기간 365일)
openssl req -new -x509 -key server.key -out server.crt -days 365 \
  -subj "/C=KR/ST=Seoul/O=Penta Systems/CN=amm.penta.co.kr"
⚠️
자체 서명 인증서는 브라우저에서 "안전하지 않음" 경고가 나옵니다. 반드시 공인 인증서로 교체하세요.

SSL 모듈 포함 파일 활성화

httpd.conf에서 아래 줄의 주석(#)을 제거합니다:

Include conf/extra/httpd-ssl.conf

4-4. Apache httpd.conf 기본 보안 설정

C:\Apache24\conf\httpd.conf 파일에서 아래 항목들을 찾아 수정합니다.

① 서버 정보 숨김

# 서버 버전 숨김 (기본값 Full → Prod)
ServerTokens Prod

# 에러 페이지에 서버 서명 숨김
ServerSignature Off

② 불필요한 디렉토리 접근 차단

<Directory />
    Options None
    AllowOverride None
    Require all denied
</Directory>

<Directory "C:/Apache24/htdocs">
    Options None
    AllowOverride None
    Require all granted
</Directory>

③ .htaccess 비활성화 (성능·보안)

<Directory "C:/Apache24/htdocs">
    AllowOverride None   <!-- All 이면 None으로 변경 -->
</Directory>

④ TRACE 메서드 비활성화

TraceEnable off
5

성능 튜닝 (200~300명 기준)

5-1. JVM 메모리 설정 (setenv.bat)

항목RAM 8GB 서버RAM 16GB 서버
초기 힙 (-Xms)512m1g
최대 힙 (-Xmx)1g2g
GC 방식G1GCG1GC
📄 C:\tomcat9\bin\setenv.bat (메모리 부분)rem RAM 16GB 기준
set CATALINA_OPTS=-Xms1g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 ^
 -XX:+HeapDumpOnOutOfMemoryError ^
 -XX:HeapDumpPath=C:\tomcat9\logs\heap-dump.hprof
⚠️
-Xmx를 서버 전체 RAM의 70% 이하로 설정하세요. OS와 PostgreSQL이 사용하는 메모리를 남겨야 합니다.

5-2. Tomcat 스레드 풀 설정 (server.xml)

항목설정값설명
maxThreads200동시 처리 최대 요청 수
minSpareThreads10대기 스레드 최솟값
acceptCount100대기열 크기 (초과 시 연결 거부)
connectionTimeout20000연결 타임아웃 (ms)
keepAliveTimeout15000Keep-Alive 유지 시간 (ms)

5-3. DB 커넥션 풀 (globals.properties)

200~300명 기준 아래 값을 권장합니다:

📄 src/main/resources/globals.propertiesdb.initialSize=10
db.maxTotal=50
db.maxIdle=20
db.minIdle=10
db.maxWaitMillis=5000
항목설명
maxTotal=50동시 DB 연결 최대 50개 (무료 오픈소스 DB)
maxWaitMillis=5000DB 연결 대기 최대 5초 (초과 시 에러 반환)

5-4. 로그 파일 관리

로그가 쌓이면 디스크가 꽉 차 서비스가 중단될 수 있습니다. 주기적으로 삭제하거나 자동 삭제를 설정합니다.

Windows 작업 스케줄러를 이용한 로그 자동 삭제 배치파일:

📄 C:\scripts\cleanup_logs.bat@echo off
rem 30일 이상 된 Tomcat 로그 삭제
forfiles /p "C:\tomcat9\logs" /s /m *.log /d -30 /c "cmd /c del @path"
forfiles /p "C:\tomcat9\logs" /s /m *.txt /d -30 /c "cmd /c del @path"
rem 30일 이상 된 Apache 로그 삭제
forfiles /p "C:\Apache24\logs" /s /m *.log /d -30 /c "cmd /c del @path"
echo 로그 정리 완료: %date% %time%

작업 스케줄러에서 매일 새벽 3시에 실행하도록 등록합니다.

6

방화벽 및 포트 설정

6-1. 포트 설계

포트서비스외부 노출설명
80Apache HTTP 허용 HTTPS로 자동 리다이렉트
443Apache HTTPS 허용 메인 접속 포트
8080Tomcat HTTP 차단 Apache만 내부에서 접근 가능
8009Tomcat AJP 차단 사용 안 하면 비활성화
-1Tomcat 종료 포트 비활성화 server.xml에서 -1로 설정
5432PostgreSQL 차단 서버 내부에서만 접근
3389원격 데스크톱(RDP) 관리 IP만 관리자 IP만 허용

6-2. Windows 방화벽 설정

관리자 권한 명령 프롬프트에서 실행합니다:

# 80 포트 허용 (HTTP)
netsh advfirewall firewall add rule name="Apache HTTP" dir=in action=allow protocol=TCP localport=80

# 443 포트 허용 (HTTPS)
netsh advfirewall firewall add rule name="Apache HTTPS" dir=in action=allow protocol=TCP localport=443

# 8080 포트 차단 (외부에서 Tomcat 직접 접근 금지)
netsh advfirewall firewall add rule name="Block Tomcat 8080" dir=in action=block protocol=TCP localport=8080

# 8009 포트 차단 (AJP 외부 접근 금지)
netsh advfirewall firewall add rule name="Block AJP 8009" dir=in action=block protocol=TCP localport=8009
🚨
Tomcat 8080 포트 외부 차단은 필수입니다!
현재 https://amm.penta.co.kr:8080으로 직접 접속되고 있다면, Apache 연동 후 방화벽에서 8080을 차단해야 합니다. 차단 전에 Apache를 통해 정상 접속이 되는지 먼저 확인하세요.
7

환경변수 및 민감 정보 관리

🚨
절대 하지 말아야 할 것: DB 비밀번호, API 키, Firebase 서비스 계정 JSON을 소스코드나 Git에 포함시키지 마세요. 소스코드가 외부로 유출될 경우 즉시 데이터베이스가 위험해집니다.

7-1. 민감 정보 관리 방법

모든 민감 정보는 setenv.bat에만 보관합니다:

📄 C:\tomcat9\bin\setenv.bat (완성본)@echo off
rem ──────────────────────────────────────────────────────
rem Penta HandsOn - Tomcat 환경 설정
rem 이 파일은 외부에 절대 공유하지 마세요 (DB 비밀번호 포함)
rem ──────────────────────────────────────────────────────

rem JVM 메모리 설정
set CATALINA_OPTS=-Xms1g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200

rem DB 접속 정보 (소스코드에는 이 변수명만 사용)
set PENTA_DB_URL=jdbc:postgresql://192.168.100.66:5432/handson
set PENTA_DB_USERNAME=handson
set PENTA_DB_PASSWORD=실제DB비밀번호

rem Firebase 서비스 계정 파일 경로 (classpath 밖에 보관)
set PENTA_FCM_PATH=C:\secrets\firebase-adminsdk.json

rem 도로명주소 API 키
set PENTA_ROADADDR_KEY1=실제API키1
set PENTA_ROADADDR_KEY2=실제API키2

7-2. Firebase 서비스 계정 파일 외부 보관

C:\secrets\ 폴더를 만들고 Firebase JSON 파일을 이동합니다

폴더 보안 설정: C:\secrets 우클릭 → 속성 → 보안 탭 → Administrators만 접근 가능하도록 설정

globals.properties에서 경로 수정:

push.fcm.service.account.path=file:C:/secrets/handson-firebase-adminsdk.json

7-3. setenv.bat 파일 접근 제한

관리자 권한 명령 프롬프트에서:

# Administrators 그룹만 읽기 가능하도록 설정
icacls "C:\tomcat9\bin\setenv.bat" /inheritance:r /grant:r "Administrators:(R)"
icacls "C:\secrets" /inheritance:r /grant:r "Administrators:(F)"
8

서비스 시작·중지 방법

8-1. Windows 서비스로 관리 (권장)

시작 메뉴 → services.msc 검색 → 실행

서비스명설명시작 유형
Apache24Apache HTTP Server자동
Tomcat9Apache Tomcat 9자동

8-2. 명령어로 관리

Tomcat 시작/중지/재시작net start Tomcat9
net stop Tomcat9
net stop Tomcat9 && net start Tomcat9
Apache 시작/중지/재시작net start Apache24
net stop Apache24
C:\Apache24\bin\httpd.exe -k restart

8-3. 애플리케이션 배포 절차

이클립스에서 Maven buildclean package 실행하여 WAR 파일 생성

WAR 파일 위치: 프로젝트폴더\target\HandsOn-1.0.0.war

Tomcat 서비스 중지: net stop Tomcat9

기존 WAR 및 폴더 삭제:

del C:\tomcat9\webapps\HandsOn.war
rmdir /s /q C:\tomcat9\webapps\HandsOn
rmdir /s /q C:\tomcat9\work\Catalina

새 WAR 파일 복사:

copy "프로젝트폴더\target\HandsOn-1.0.0.war" "C:\tomcat9\webapps\HandsOn.war"

Tomcat 서비스 시작: net start Tomcat9

로그 확인: C:\tomcat9\logs\catalina.out 파일에서 오류 여부 확인

9

설치 완료 최종 점검 체크리스트

설치 확인

  • java -version 실행 시 "17.0.x" 표시 확인
  • JAVA_HOME 환경변수 설정 확인
  • Tomcat 서비스 자동 시작 설정 확인
  • Apache 서비스 자동 시작 설정 확인
  • HandsOn WAR 파일 배포 및 정상 기동 확인
  • https://도메인/HandsOn 접속 확인 (SSL 잠금 표시)

Tomcat 보안

  • server.xml — Server 종료 포트 -1 설정 확인
  • server.xml — jvmRoute 속성 제거 확인 (JSESSIONID 서버명 숨김)
  • server.xml — Connector xpoweredBy="false" 설정 확인
  • conf/web.xml — JspServlet xpoweredBy=false 설정 확인
  • conf/context.xml — CookieProcessor sameSiteCookies="strict" 설정 확인
  • webapps/manager, host-manager, ROOT 폴더 삭제 확인
  • curl 응답 헤더에 X-Powered-By 없는지 확인
  • JSESSIONID 쿠키에 secure; HttpOnly; SameSite=Strict 확인
  • JSESSIONID에 서버명(.bm-win2012-1-vm 등) 미포함 확인

Apache 보안

  • httpd.conf — ServerTokens Prod 설정 확인
  • httpd.conf — ServerSignature Off 설정 확인
  • httpd.conf — TraceEnable off 설정 확인
  • HTTPS 리다이렉트 동작 확인 (http → https)
  • SSL 인증서 유효기간 확인 (만료 30일 전 갱신 알림 설정)
  • TLS 1.0, 1.1 비활성화 확인 (1.2 이상만 허용)

방화벽 및 네트워크

  • 외부에서 8080 포트 직접 접근 차단 확인
  • 외부에서 8009(AJP) 포트 접근 차단 확인
  • 외부에서 5432(PostgreSQL) 포트 접근 차단 확인
  • RDP(3389) 포트 관리자 IP만 허용 확인

민감 정보 관리

  • setenv.bat에 DB 비밀번호 설정 확인
  • setenv.bat 파일 권한 Administrators만 읽기 설정 확인
  • Firebase JSON 파일 C:\secrets\ 로 이동 확인
  • globals.properties에서 Firebase 경로 file: 방식으로 변경 확인
  • 소스코드/Git에 비밀번호 없음 확인

응답 헤더 최종 확인 방법

CMD에서 아래 명령어로 보안 헤더가 모두 적용됐는지 확인합니다:

curl -s -I https://amm.penta.co.kr/HandsOn/login.do

아래 헤더들이 모두 응답에 포함되어야 합니다:

X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Security-Policy: ...
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: ...

Set-Cookie: JSESSIONID=...; secure; HttpOnly; SameSite=Strict

# 없어야 하는 헤더:
# X-Powered-By  (이 헤더가 없어야 함)
# Server: Apache/2.4.x  (빈 값이어야 함)
10

트러블슈팅

증상원인해결 방법
Tomcat 시작 안 됨 JAVA_HOME 미설정 또는 잘못된 경로 환경변수 확인: echo %JAVA_HOME%
정확한 JDK 경로인지 확인
8080 접속 안 됨 포트 충돌 또는 방화벽 차단 netstat -ano | findstr 8080으로 포트 사용 확인
다른 프로세스가 사용 중이면 해당 프로세스 종료
Apache 시작 오류
"bind: Access denied"
80/443 포트를 다른 프로세스가 사용 중 netstat -ano | findstr ":80 "
IIS나 Skype 등이 80포트를 사용 중인지 확인 후 중지
SSL 인증서 오류 인증서 파일 경로 오류 또는 권한 문제 인증서 파일 존재 여부 확인
httpd.exe -t로 설정 문법 검사
Apache → Tomcat 연결 실패
502 Bad Gateway
Tomcat이 실행 중이지 않거나 ProxyPass 주소 오류 Tomcat 실행 상태 확인
ProxyPass의 주소가 localhost:8080인지 확인
로그인 후 세션이 유지 안 됨 web.xml의 <secure>true</secure>인데 HTTP로 접속 HTTPS로 접속하거나 secure를 false로 변경
한글 깨짐 URIEncoding 설정 누락 server.xml Connector에 URIEncoding="UTF-8" 추가
파일 업로드 실패
(대용량)
Tomcat 기본 업로드 크기 제한 globals.properties의 file.max.size 값 확인
Apache의 LimitRequestBody 설정 추가 필요
OutOfMemoryError JVM 힙 메모리 부족 setenv.bat에서 -Xmx 값 증가
logs 폴더의 heap-dump.hprof 분석
Tomcat 로그 확인 방법 C:\tomcat9\logs\catalina.out 또는
catalina.YYYY-MM-DD.log 파일 확인

주요 로그 파일 위치

로그 파일내용
C:\tomcat9\logs\catalina.outTomcat 전체 로그 (가장 중요)
C:\tomcat9\logs\localhost.YYYY-MM-DD.log웹앱 오류 로그
C:\tomcat9\logs\access_log.txtHTTP 접근 로그
C:\Apache24\logs\penta-error.logApache 오류 로그
C:\Apache24\logs\penta-access.logApache 접근 로그
Penta Systems HandsOn 서버 설치 가이드 | 문의: am@penta.co.kr