WAS 환경에서는 세션-쿠키 설정과 JVM 메모리 튜닝이 안정성을 좌우한다

Wildfly 기반 WAS 환경에서 운영 안정성 문제를 다루면서 얻은 경험을 정리한다. 설정 하나 잘못 잡아서 오랫동안 원인을 찾아 헤맸던 기억이 있어서, 실제로 챙겨야 할 항목들을 남겨둔다.

세션-쿠키 설정

세션 처리를 제대로 설정하지 않으면 의도치 않은 상황이 생긴다. 세션 타임아웃이 너무 짧으면 사용자가 작업 중에 갑자기 로그아웃되고, 너무 길면 서버 메모리에 부담을 준다. 쿠키 보안 설정이 빠지면 XSS나 중간자 공격에 취약해진다.

web.xml에서 기본으로 챙겨야 할 설정들이다.

<session-config>
    <session-timeout>30</session-timeout>
    <cookie-config>
        <http-only>true</http-only>  <!-- JavaScript에서 쿠키 접근 차단 (XSS 방어) -->
        <secure>true</secure>         <!-- HTTPS 연결에서만 쿠키 전송 -->
    </cookie-config>
</session-config>

http-only는 JavaScript에서 쿠키에 접근하지 못하게 막아 XSS 공격을 방어한다. secure는 HTTPS 연결에서만 쿠키를 전송한다. 이 두 설정은 빠뜨리기 쉽지만 빠뜨리면 안 되는 것들이다.

JVM 메모리 튜닝

WAS가 느려지거나 OutOfMemory가 발생하면 JVM 힙 설정을 먼저 확인한다. 초기 힙 크기와 최대 힙 크기가 너무 작으면 GC가 자주 돌면서 응답 시간에 직접 영향을 준다.

JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx2048m"
JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m"

-Xms는 초기 힙 크기, -Xmx는 최대 힙 크기다. 두 값을 동일하게 설정하면 힙 리사이징이 일어나지 않아 GC 오버헤드를 줄일 수 있다. MetaspaceSize는 클래스 메타데이터가 저장되는 공간으로, 동적 클래스 로딩이 많은 환경에서는 기본값이 부족할 수 있다.

로깅 설정

장애 상황에서 로그는 유일한 단서가 된다. 타임스탬프와 스레드 정보를 포함한 패턴을 잡고, 날짜 로테이션을 설정해두면 나중에 찾아보기 편하다.

<periodic-rotating-file-handler name="FILE">
    <formatter>
        <pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
    </formatter>
    <file relative-to="jboss.server.log.dir" path="server.log"/>
    <suffix value=".yyyy-MM-dd"/>
    <append value="true"/>
</periodic-rotating-file-handler>

WAS 튜닝은 정답이 있는 영역이 아니다. 서버 스펙, 트래픽 패턴, 애플리케이션 특성에 따라 달라진다. 먼저 현재 상태를 측정하고, 변경 후 지표를 비교하는 방식으로 접근해야 한다.

연결 (이유)

출처(참고문헌)