시스템 요구사항
권장 서버 사양 (200~300명 동시 접속 기준)
| 항목 | 최소 | 권장 |
|---|---|---|
| CPU | 4코어 | 8코어 이상 |
| RAM | 8GB | 16GB 이상 |
| 디스크 | 50GB SSD | 100GB+ SSD (OS + 파일서버 분리 권장) |
| OS | Windows Server 2019 | Windows Server 2022 |
| 네트워크 | 100Mbps | 1Gbps |
소프트웨어 버전
| 소프트웨어 | 버전 | 역할 |
|---|---|---|
| OpenJDK | 17 (LTS) | Java 실행 환경 |
| Apache Tomcat | 9.0.x (최신) | Java 웹 애플리케이션 서버 |
| Apache HTTP Server | 2.4.x (최신) | 리버스 프록시 · SSL 처리 |
| PostgreSQL | 16 | 데이터베이스 |
사용자 브라우저
↓ HTTPS 443 (또는 HTTP 80)
Apache HTTP Server ← SSL 인증서 처리, 보안 헤더, 정적 파일 캐싱
↓ HTTP 8009/AJP 또는 HTTP 8080 (내부 통신)
Apache Tomcat 9 ← Java 앱 실행 (HandsOn)
↓
PostgreSQL 5432
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추가
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 파일을 아래 경로에 압축 해제합니다:
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 "%r" %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-name이 jsp인 블록) 아래 항목을 추가합니다:
<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 설정에서 listings를 false로 합니다 (기본값이지만 확인):
<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>
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 기본 화면이 나오면 정상입니다.
C:\tomcat9\webapps\manager 폴더 삭제C:\tomcat9\webapps\host-manager 폴더 삭제C:\tomcat9\webapps\ROOT 폴더 삭제 (HandsOn만 운영 시)Apache HTTP Server 설치 및 설정
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 ← 중간 인증서 (있는 경우)
방법 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
성능 튜닝 (200~300명 기준)
5-1. JVM 메모리 설정 (setenv.bat)
| 항목 | RAM 8GB 서버 | RAM 16GB 서버 |
|---|---|---|
| 초기 힙 (-Xms) | 512m | 1g |
| 최대 힙 (-Xmx) | 1g | 2g |
| GC 방식 | G1GC | G1GC |
📄 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)
| 항목 | 설정값 | 설명 |
|---|---|---|
| maxThreads | 200 | 동시 처리 최대 요청 수 |
| minSpareThreads | 10 | 대기 스레드 최솟값 |
| acceptCount | 100 | 대기열 크기 (초과 시 연결 거부) |
| connectionTimeout | 20000 | 연결 타임아웃 (ms) |
| keepAliveTimeout | 15000 | Keep-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=5000 | DB 연결 대기 최대 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-1. 포트 설계
| 포트 | 서비스 | 외부 노출 | 설명 |
|---|---|---|---|
| 80 | Apache HTTP | 허용 | HTTPS로 자동 리다이렉트 |
| 443 | Apache HTTPS | 허용 | 메인 접속 포트 |
| 8080 | Tomcat HTTP | 차단 | Apache만 내부에서 접근 가능 |
| 8009 | Tomcat AJP | 차단 | 사용 안 하면 비활성화 |
| -1 | Tomcat 종료 포트 | 비활성화 | server.xml에서 -1로 설정 |
| 5432 | PostgreSQL | 차단 | 서버 내부에서만 접근 |
| 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
현재
https://amm.penta.co.kr:8080으로 직접 접속되고 있다면, Apache 연동 후 방화벽에서 8080을 차단해야 합니다.
차단 전에 Apache를 통해 정상 접속이 되는지 먼저 확인하세요.환경변수 및 민감 정보 관리
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-1. Windows 서비스로 관리 (권장)
시작 메뉴 → services.msc 검색 → 실행
| 서비스명 | 설명 | 시작 유형 |
|---|---|---|
| Apache24 | Apache HTTP Server | 자동 |
| Tomcat9 | Apache 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 build → clean 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 파일에서 오류 여부 확인
설치 완료 최종 점검 체크리스트
설치 확인
- 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 (빈 값이어야 함)
트러블슈팅
| 증상 | 원인 | 해결 방법 |
|---|---|---|
| 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.out | Tomcat 전체 로그 (가장 중요) |
C:\tomcat9\logs\localhost.YYYY-MM-DD.log | 웹앱 오류 로그 |
C:\tomcat9\logs\access_log.txt | HTTP 접근 로그 |
C:\Apache24\logs\penta-error.log | Apache 오류 로그 |
C:\Apache24\logs\penta-access.log | Apache 접근 로그 |