제1장 웹 엔진

내용 목차

1.1. 개요
1.2. 구성 요소
1.3. 주요 기능
1.4. 관리 도구
1.4.1. 도구 종류
1.4.2. 제어와 모니터링
1.5. 디렉터리 구조
1.6. 환경 설정
1.6.1. XML 설정 파일
1.6.2. 모니터링 설정
1.6.3. 기본 오류 페이지 설정
1.6.4. 오류 발생의 경우 Stack Trace 첨부 설정
1.6.5. 인코딩 설정
1.6.6. JSP 엔진 설정
1.6.7. 응답 헤더 설정
1.6.8. 쿠키 정책 설정
1.6.9. 세션 설정
1.6.10. 로그 설정
1.6.11. Async Servlet 타임아웃 처리 설정
1.6.12. 웹 엔진 레벨의 프로퍼티 설정
1.6.13. 웹 공격 대응 설정
1.6.14. 특정 URL 패턴의 HTTP 요청 방지
1.7. 웹 엔진 튜닝

본 장에서는 JEUS 웹 엔진의 구성 요소, 주요 기능, 기본적인 설정 방법에 대해 설명한다.

Jakarta EE 웹 애플리케이션(이하 웹 애플리케이션)은 사용자에게 동적으로 웹 콘텐츠를 제공하기 위한 서블릿(Servlet), JSP와 HTML 파일 같은 정적 리소스들로 구성되어 있다. JEUS는 이러한 웹 애플리케이션을 효율적으로 관리하는 웹 엔진을 제공한다.

본 장에서는 JEUS 웹 엔진에 대하여 소개하고, 운영 환경에서 제어하고 모니터링하는 방법을 설명한다.

본 절에서는 웹 엔진의 구성 요소와 웹 엔진과 연관된 외부 요소들에 대해 설명한다.

웹 엔진은 Jakarta EE, 서블릿, JSP, EL 표준에 따르는 웹 애플리케이션을 관리하고 이를 서비스하는 개체이다. 서블릿과 JSP와 같은 동적 리소스뿐만 아니라 HTML과 같은 정적 리소스도 서비스할 수 있다.

참고

웹 엔진은 웹 컨테이너(Web Container) 또는 서블릿 엔진(Servlet Engine)이라고 부르기도 한다.


주요 구성 요소들은 다음과 같다.

참고

JEUS 6까지 존재했던 Context Group(이하 컨텍스트 그룹)이 JEUS 7부터는 존재하지 않는다. 컨텍스트 그룹의 대부분의 기능은 웹 엔진에서 대신한다.

웹 엔진과 연관된 외부 요소들은 다음과 같다.

웹 엔진의 주요 기능은 다음과 같다.

  • 웹 애플리케이션 관리

    웹 엔진은 Jakarta EE 표준을 준수하는 웹 애플리케이션의 Deploy, Undeploy 및 일시 서비스 정지 기능을 제공한다. 그 외에도 서비스의 중단 없이 Redeploy하는 기능을 지원한다. 이에 관한 자세한 내용은 “제3장 웹 컨텍스트”를 참고한다.

  • 모니터링

    모니터링은 웹 엔진의 자원들의 상태를 감시하고 문제가 발생했을 때 대응하기 위한 기능이다. 크게 3가지 타입의 모니터링이 존재한다. 각각의 설정에 대한 자세한 내용은 “1.6.2. 모니터링 설정”을 참고한다.

    구분설명
    Thread Pool 모니터링웹 커넥션별로 가지고 있는 Thread Pool을 모니터링한다. 자세한 내용은 “제2장 웹 커넥션 관리”를 참고한다.
    클래스 로더 모니터링웹 애플리케이션들의 서블릿 클래스들의 변경을 모니터링한다. 자세한 내용은 “제3장 웹 컨텍스트”를 참고한다.
    세션 서비스 모니터링클라이언트 세션의 기한 만료 여부를 체크하고 만료된 세션을 제거한다. 세션 서비스 모니터링에 대한 자세한 내용은 JEUS 세션 관리 안내서”의 “제1장 세션 트래킹”을 참고한다.

  • 기본 오류 페이지 설정

    웹 엔진은 해당 컨텍스트가 준비되지 않은 상태에서 보여줄 오류 페이지를 설정할 수 있다. 설정에 대한 자세한 내용은 “1.6.3. 기본 오류 페이지 설정”을 참고한다.

  • 오류 발생의 경우 Stack Trace 첨부 설정

    웹 엔진은 오류가 발생했을 경우 오류가 발생한 지점의 Stack Trace를 기본 오류 페이지에 첨부할지 여부를 설정할 수 있다. 설정에 대한 자세한 내용은 “1.6.4. 오류 발생의 경우 Stack Trace 첨부 설정”을 참고한다.

  • 인코딩 설정

    웹 엔진은 등록된 모든 컨텍스트에 의해 사용될 수 있는 인코딩 설정을 가지고 있다. 설정에 대한 자세한 내용은 “1.6.5. 인코딩 설정”을 참고한다.

  • JSP 엔진 설정

    JSP 엔진은 각 웹 애플리케이션 별로 생성된다. JSP 엔진은 JSP 자원을 클라이언트가 요청했을 때 JSP 페이지들을 Java 파일로 변환 후 이 Java 파일을 컴파일하여 서블릿 바이트 코드로 생성하는 작업을 한다. 실행 결과로 하나의 JSP에 대해 Java 파일과 클래스 파일이 생성된다. 단, Java 파일은 jsp 작성시 문제점을 확인하기 위한 디버깅 용도로 사용하는 것이다. 설정에 대한 자세한 내용은 “4.4. JSP 엔진 설정”을 참고한다.

  • 응답 헤더 설정

    웹 엔진은 사용자 임의의 HTTP Response Header의 이름과 값의 짝을 설정할 수 있다. 사용자 임의의 응답 헤더를 설정할 경우 해당 웹 엔진에서 나가는 모든 응답에는 정의된 헤더가 항상 포함된다.

    설정에 대한 자세한 내용은 “1.6.7. 응답 헤더 설정”을 참고한다.

  • 세션 관리

    웹 엔진의 세션 관리에 대한 여러 가지 사항을 설정한다. 세션 클러스터링의 참여 여부, 세션 객체의 공유 여부, 세션 쿠키(Session Cookie) 설정, 타임아웃 등 웹 엔진의 세션과 관련된 모든 설정을 할 수 있다. 설정에 대한 자세한 내용은 “1.6.9. 세션 설정”JEUS 세션 관리 안내서”의 “제1장 세션 트래킹”을 참고한다.

  • Event Logging

    웹 엔진에서 남기는 로그는 서버 로그와 액세스 로그이다. 그리고 웹 애플리케이션에서 ServletContext API의 log 메소드로 남기는 유저 로그가 있다.

    구분설명
    서버 로그웹 엔진의 동작에 관련된 로그이다.
    액세스 로그웹 엔진에 요청 및 처리 결과에 대한 로그이다.
    유저 로그javax.servlet.ServletContext.log(String msg) 또는 javax.servlet.ServletContext.log(String msg, Throwable t) API를 사용하여 웹 애플리케이션 내에서 생성되는 메시지를 기록하는 로그이다.

    JEUS 로그의 기본 위치는 “1.5. 디렉터리 구조”를 참고하고, 로그 설정에 대한 자세한 내용은 “1.6.10. 로그 설정”을 참고한다.

  • Graceful Shutdown

    관리자가 JEUS 서버를 Shutdown할 때 이미 진행 중이던 서비스 완료를 보장하는 기능이다. 실제로 관리자가 Shutdown 명령을 내리면 다음과 같은 순서로 동작한다.

    1. 더 이상 새로운 서비스 요청을 받지 않는다.

    2. 그 시점에 이미 진행 중이던 요청들의 완료를 보장한 뒤 다른 Shutdown 작업을 진행한다.

    진행 중이던 서비스가 너무 오래 걸릴 경우 무한정 기다릴 수 없으므로 서버에 Shutdown 명령을 내릴 때 타임아웃 옵션을 설정할 수 있다. Graceful Shutdown에 대한 자세한 내용은 JEUS Server 안내서”의 “3.1.3. Managed Server 종료”를 참고한다.

    참고

    JEUS 6까지 제공하던 WEBMain.xml의 shutdown-timeout 설정은 더 이상 제공하지 않는다. 대신 콘솔 툴(jeusadmin)에서 shutdown timeout 옵션을 설정하면 동일한 기능을 수행한다.

  • 웹 공격 대응

    DoS(Denial of Service) 공격과 같은 웹 공격으로 인한 JEUS 서버의 부담을 덜기 위한 설정을 제공한다.

    웹 공격을 방지하는 설정으로 POST 요청의 크기 제한 설정, GET/POST 요청에 포함된 파라미터들의 개수 제한, 하나의 요청에 표함된 헤더의 개수 제한, 하나의 요청 내에 포함된 헤더 하나의 크기 제한, 그리고 GET 요청의 Query String의 크기 제한을 설정할 수 있다. 이들에 대한 자세한 설정은 “1.6.13. 웹 공격 대응 설정”을 참고한다.

본 절에서는 웹 엔진의 제어 및 모니터링 기능을 제공하는 도구에 대해 설명한다.

운영 도구를 이용하여 웹 엔진의 제어 및 모니터링이 가능하다.

웹 엔진 제어

웹 엔진을 제어한다는 것은 웹 엔진의 시작과 종료를 제어한다는 의미와 같다. 이 2가지 작업은 WebAdmin과 콘솔 툴을 사용하여 가능하다.

웹 엔진 모니터링

WebAdmin과 콘솔 툴을 사용해서 웹 엔진을 모니터링할 수 있다.

JEUS 디렉터리에서의 웹 엔진 구조는 다음과 같다.


JEUS_HOME

JEUS 설치 홈 디렉터리이다.

domains/domain1/config/

JEUS_HOME의 domains 디렉터리 하위에는 각 도메인 이름을 기준으로 디렉터리가 존재한다. 이 중에서 웹 엔진의 설정과 관련되는 내용이 config 디렉터리 아래에 위치한다. domain1은 예시로 사용한 도메인 이름이다. JEUS 7부터는 더 이상 WEBMain.xml을 사용하지 않고, 하나의 서버 JVM에는 하나의 웹 엔진만 존재하므로 엔진별 설정 디렉터리가 필요없다.

  • domain.xml

    통합된 설정 파일이다. 해당 파일에 도메인에 속한 모든 서버의 설정이 있으며, 각 서버별로 웹 엔진을 설정할 수 있다. domain.xml에 관한 자세한 내용은 "JEUS Server 안내서"를 참고한다.

  • servlet/

    도메인에 속한 모든 서버들이 각 웹 애플리케이션을 deploy할 때 기본적으로 참조하는 XML 설정 파일이 위치한다. 이 디렉터리에 있는 web.xml과 webcommon.xml은 도메인에 속한 서버들이 부팅될 때 도메인 관리 서버로부터 받아오게되므로 도메인의 서버들은 같은 파일을 유지하게 된다.

    파일설명
    web.xmlServlet 3.0부터는 web.xml이 기본적으로 없어도 된다. 그러나 JSP Parser인 Tomcat Jasper에서는 이 파일을 기반으로 웹 애플리케이션의 버전을 확인하므로 되도록 그대로 유지해야 한다. web.xml 파일을 가지고 있지 않은 웹 애플리케이션에서 이 파일을 참고한다.
    webcommon.xml모든 웹 애플리케이션들에 적용되는 공통 설정 파일이다. 이 파일의 형식은 web.xml 형식과 동일하다.
  • servlet/server1/

    servlet 설정 디렉터리 아래에 특정 서버 이름으로 디렉터리를 생성하고 그 아래에 webcommon.xml, web.xml을 위치시키면 특정 서버에 대해서만 적용할 수 있다. 이 디렉터리의 설정이 상위 디렉터리에 있는 설정에 우선한다. 특정 서버 이름의 디렉터리에 있는 web.xml과 webcommon.xml은 JEUS가 자동으로 관리하지 않는다. 그러므로 이 설정 파일들은 서버 관리자가 수동으로 관리해야 한다.

domains/domain1/servers/server1/logs

도메인에 속한 각 서버가 동작할 때 생성되는 파일들은 모두 servers 아래에 각 서버별 이름으로 생성된 디렉터리 아래에 존재한다. 이에 관한 자세한 내용은 JEUS Server 안내서”의 “제8장 Logging”을 참고한다.

로그 파일은 기본적으로 logs 디렉터리 아래에 있다. 웹 엔진에서 생성한 로그는 JeusServer.log에 저장된다. 단, 로그 로테이션 기능에 의해 파일 이름은 변경될 수 있지만 항상 JeusServer로 시작한다.

  • servlet/

    웹 애플리케이션 액세스 로그인 access.log를 저장한다. 만약 가상 호스트별로 액세스 로그를 설정했을 경우에는 기본적으로 이 디렉터리 아래에 가상 호스트 이름으로 디렉터리를 생성하고, 해당 가상 호스트에 deploy된 웹 애플리케이션들의 액세스 로그를 저장한다. 자세한 내용은 “제5장 가상 호스트”를 참고한다.

    또한, 이 디렉터리에는 웹 애플리케이션에서 ServletContext API의 log 메소드를 통해서 남기는 유저 로그인 user.log 또는 user_appname.log 파일을 저장한다. 유저 로그는 설정에 따라서 user.log 파일에 남을 수도 있고, 웹 애플리케이션 별도의 파일인 user_appname.log에 남을 수도 있다.

본 절에서는 웹 엔진와 관련된 환경 설정 파일과 웹 엔진 설정에 대해 설명한다.

웹 엔진에 대한 설정은 WebAdmin을 사용해서 진행할 것을 권장한다. WebAdmin을 사용한 설정은 다음과 같은 몇 가지 설정 관련 공통적인 사항에 대한 지식이 필요하다. WebAdmin의 사용 방법에 대한 자세한 내용은 "JEUS WebAdmin 안내서"를 참고한다.

다음은 웹 엔진과 관련된 XML 설정 파일들에 대한 설명이다.

XML 스키마 파일들은 JEUS_HOME/lib/schemas/jeus/ 디렉터리에 위치한다. 위 파일들의 내용은 반드시 JEUS에서 정의된 XML 헤더로 시작되어야 한다. 또한 Root Element는 JEUS XML 스키마의 namespace로 지정해야 한다.

각 파일에 사용되는 헤더는 다음과 같다. web.xml의 XML 헤더는 서블릿 표준에 포함되어 있다.

참고

본 안내서에서 사용되는 모든 태그 순서는 XML 스키마의 설정 순서대로 작성되어 있다. 실제 사용할 때는 순서를 제대로 지키기가 쉽지 않으므로, JEUS에서는 태그 순서를 자동으로 정렬해주는 기능을 제공한다. 그러므로 XML 설정 파일을 작성할 때, 순서를 정확하게 지키지 않아도 무방하다. 태그 순서는 "JEUS XML Reference"를 참고한다.

위 파일들의 예제가 본 안내서에서 사용될 때에는 표준 헤더가 편의상 생략되어 사용되고 있다. 실제 XML 설정 파일에는 이 헤더들이 포함되어 있다는 것에 주의한다.

웹 엔진은 내부 Thread와 클래스 변경사항, 세션의 변경사항을 모니터링할 수 있고, 이들의 모니터링 주기를 변경할 수 있다.

WebAdmin을 사용해서 모니터링 주기를 설정하는 방법은 다음과 같다.

  1. WebAdmin 왼쪽 메뉴에서 [Servers]를 선택하면 서버 목록 조회 화면으로 이동한다. 서버 목록에서 실행할 서버를 선택하면 서버 설정 화면으로 이동한다. 설정 화면에서 [Engine] > [Web Engine] > [Basic] 메뉴를 선택한다.


  2. 설정 및 설정 변경을 위해 화면 왼쪽의 [LOCK & EDIT] 버튼을 클릭해서 설정변경 모드로 전환한다. ([그림 1.7] 참고)

  3. Web Engine 설정 화면고급 선택사항 영역에서 다음과 같이 Monitoring의 각 항목을 설정하고 [확인] 버튼을 클릭한다.


    각 설정 항목에 대한 설명은 다음과 같다.

    항목설명
    Check Thread Pool

    요청 처리 스레드들의 상태를 점검하기 위한 시간 간격을 설정한다.

    (기본값: 300000(5분))

    Check Class Reload

    웹 컨텍스트를 자동으로 리로드하기 위해 클래스 변경 여부를 체크하는 주기를 설정한다. (기본값: 300000(5분))

    이 설정은 jeus-web-dd.xml에 <auto-reload><enable-reload> 기능을 설정해야 의미를 갖는다. <check-on-demand>를 true로 설정한 웹 컨텍스트의 경우에는 점검하지 않는다.

    Check Session세션의 타임아웃 상태 점검 주기를 설정한다. 세션의 타임아웃은 웹 엔진의 세션 설정이나 web.xml에 설정된다. (기본값: 300000(5분))
  4. 설정을 완료한 뒤 설정 내용의 반영을 위해 [Activate Changes] 버튼([그림 1.8] 참고)을 클릭하면 다음과 같이 화면에 반영 결과가 나타난다. 모니터링 설정은 동적 반영이 되지 않으므로 반영 결과에 표시된 것처럼 서버를 재시작해야 설정 내용이 반영된다.


웹 요쳥은 웹 컨텍스트가 존재하는 경우에 오류가 발생하면 해당 웹 컨텍스트에서 오류를 처리한다. 그러나 웹 컨텍스트가 존재하지 않는 경우에는 웹 엔진이 내부적으로 에러 페이지를 보내주는 방법으로 오류를 처리해야 한다. 이 경우 오류 페이지가 사용자가 원하는 형식이 아닐 수 있으므로 이런 사용자의 요구사항을 처리할 수 있는 오류 페이지의 절대 경로를 지정할 수 있는 설정을 제공한다.

단, 이 경우에는 html 또는 htm 파일만 설정이 가능하다. 여기에 설정된 값은 HTTP 응답 내용으로만 사용될 뿐이며 forward 개념이 아니다.

WebAdmin을 사용해서 기본 오류 페이지를 설정하는 방법은 다음과 같다.

  1. WebAdmin 왼쪽 메뉴에서 [Servers]를 선택하면 서버 목록 조회 화면으로 이동한다. 서버 목록에서 실행할 서버를 선택하면 서버 설정 화면으로 이동한다. 설정 화면에서 [Engine] > [Web Engine] > [Basic] 메뉴를 선택한다. ([그림 1.10] 참고)

  2. 설정 및 설정 변경을 위해 화면 왼쪽의 [LOCK & EDIT] 버튼을 클릭해서 설정변경 모드로 전환한다. ([그림 1.7] 참고)

  3. Web Engine 화면에서 기본 오류 페이지와 관련된 'Default Error Page' 항목에 다음과 같이 오류 페이지의 절대 경로를 설정하고 [확인] 버튼을 클릭한다.


  4. 설정을 완료한 뒤 설정 내용의 반영을 위해 [Activate Changes] 버튼([그림 1.8] 참고)을 클릭하면 다음과 같이 화면에 반영 결과가 나타난다. 'Default Error Page'는 동적 설정 항목이 아니므로 반영 결과에 표시된 것처럼 서버를 재시작해야 설정 내용이 반영된다.


웹 요청 처리 중 웹 엔진에 문제가 발생했을 때 오류의 상세 내역을 JEUS가 기본적으로 제공하는 오류 페이지에 표시할 것인지에 대한 설정이다. 이 메시지는 개발할 때는 유용하지만, 운영할 때는 제거하는 것이 바람직하다. 이에 대한 설정은 WebAdmin을 사용하여 웹 엔진에 적용하거나 각 애플리케이션별 jeus-web-dd.xml에서 설정 가능하다. jeus-web-dd.xml의 설정은 “3.3.1. jeus-web-dd.xml 설정”을 참고한다.

WebAdmin을 사용하여 오류가 발생한 경우의 Stack Trace 첨부 여부를 설정하는 방법은 다음과 같다.

  1. WebAdmin 왼쪽 메뉴에서 [Servers]를 선택하면 서버 목록 조회 화면으로 이동한다. 서버 목록에서 실행할 서버를 선택하면 서버 설정 화면으로 이동한다. 설정 화면에서 [Engine] > [Web Engine] > [Basic] 메뉴를 선택한다. ([그림 1.10] 참고)

  2. 설정 및 설정 변경을 위해 화면 왼쪽의 [LOCK & EDIT] 버튼을 클릭해서 설정변경 모드로 전환한다. ([그림 1.7] 참고)

  3. Web Engine 화면에서 'Attach Stacktrace on Error' 항목을 체크하고 [확인] 버튼을 클릭한다.

    기본값은 false이고, 항목을 체크하면 기본 오류 페이지에 Stack Trace가 표시된다. 단, 'Default Error Page' 항목이 설정된 경우에는 설정된 Error Page가 표시된다. 기본 오류 페이지 관련 설정에 대한 자세한 내용은 “1.6.3. 기본 오류 페이지 설정”을 참고한다.


  4. 설정을 완료한 뒤 설정 내용의 반영을 위해 [Activate Changes] 버튼([그림 1.8] 참고)을 클릭하면 다음과 같이 화면에 반영 결과가 나타난다. 'Attach Stacktrace on Error'는 동적 설정 항목이 아니므로 반영 결과에 표시된 것처럼 서버를 재시작해야 설정 내용이 반영된다.


웹 엔진은 엔진 내의 모든 컨텍스트에 의해 사용될 수 있는 3가지 인코딩 설정을 가지고 있다. 이는 모두 jeus-web-dd.xml을 통해서 각 애플리케이션별로 적용하거나, 가상 호스트별 또는 서버별로 설정 가능하다. 언급한 순서대로 xml 설정 우선순위가 적용된다. 관리자는 WebAdmin과 같은 관리툴을 통해서 domain.xml에 인코딩 설정을 할 수 있다. 인코딩 설정은 웹 애플리케이션별로 다를 가능성이 매우 높으므로 jeus-web-dd.xml에 설정할 것을 권장한다.

WebAdmin 사용

WebAdmin을 사용하여 인코딩을 설정하는 방법은 다음과 같다.

  1. WebAdmin 왼쪽 메뉴에서 [Servers]를 선택하면 서버 목록 조회 화면으로 이동한다. 서버 목록에서 실행할 서버를 선택하면 서버 설정 화면으로 이동한다. 설정 화면에서 [Engine] > [Web Engine] > [Basic] 메뉴를 선택한다. ([그림 1.10] 참고)

  2. 설정 및 설정 변경을 위해 화면 왼쪽의 [LOCK & EDIT] 버튼을 클릭해서 설정변경 모드로 전환한다. ([그림 1.7] 참고)

  3. 고급 선택사항Encoding 영역에서 'Request Url Encoding', 'Request Encoding', 'Response Encoding' 항목을 설정하고 [확인] 버튼을 클릭한다.

    'Request Url Encoding'을 제외하고 jeus-web-dd.xml에서도 설정이 가능하다.


    각 항목별로 'Default', 'Forced' 혹은 Request Encoding의 경우 'Client Override' 중 하나를 선택하여 활성화한 후 설정할 인코딩명을 입력한다.

    설정값설명
    Default어떤 인코딩도 없을 경우에 기본값으로 사용한다.
    Client Override지정된 Encoding이 없을 경우 클라이언트에서 보내는 Content-Type 헤더의 charset을 사용한다.
    Forced해당 인코딩을 모든 경우에 항상 강제적으로 사용한다.
  4. 설정을 완료한 뒤 설정 내용의 반영을 위해 [Activate Changes] 버튼([그림 1.8] 참고)을 클릭하면 다음과 같이 화면에 반영 결과가 나타난다. 'Encoding'은 동적 설정 항목이 아니므로 반영 결과에 표시된 것처럼 서버를 재시작해야 설정 내용이 반영된다.


문자 인코딩(Character Encoding) 설정 및 호환 가이드

JEUS는 애플리케이션 개발자에게 개발 편의성을 제공하고 애플리케이션 사용자 또는 서비스 관리자에게 관리 편의성 제공을 위해 XML을 통해 인코딩 설정을 제공해 왔다. 그러나 이에 대한 정책을 결정하고 구현해 나가는 과정에서 Request Encoding과 Response Encoding 간의 forced 설정 의미가 서로 일치하지 않거나 서블릿 표준과 맞지 않는 문제점들이 나타났다.

참고

JEUS는 JEUS 7부터 정책을 일관성 있게 유지하고 바로 잡고자 하였다. 이로 인해서 기존에 작성한 애플리케이션들의 동작 호환성에 문제가 발생할 수 있다. 이 가이드를 통해서 애플리케이션을 수정하거나 호환성 옵션을 이용해서 동작을 유지하길 바란다. 호환성 옵션을 사용할 때는 jeus-web-dd.xml에 설정하기를 권장한다. domain.xml에 서버별로 설정하면 해당 서버에 디플로이하는 모든 웹 애플리케이션이 영향을 받는다.

사용자 임의의 HTTP Response Header를 이름과 값의 짝으로 정의할 수 있다.

WebAdmin을 사용하여 응답에 기본적으로 포함될 사용자 정의 헤더를 설정하는 방법은 다음과 같다.

  1. WebAdmin 왼쪽 메뉴에서 [Servers]를 선택하면 서버 목록 조회 화면으로 이동한다. 서버 목록에서 실행할 서버를 선택하면 서버 설정 화면으로 이동한다. 설정 화면에서 [Engine] > [Web Engine] > [Basic] 메뉴를 선택한다. ([그림 1.10] 참고)

  2. 설정 및 설정 변경을 위해 화면 왼쪽의 [LOCK & EDIT] 버튼을 클릭해서 설정변경 모드로 전환한다. ([그림 1.7] 참고)

  3. 고급 선택사항Response Header 영역의 항목을 설정하고 [확인] 버튼을 클릭한다.

    다음은 응답에 2개의 사용자 정의 헤더를 설정한 예제이다. 1개 이상의 응답 헤더를 설정할 경우에는 각 헤더들의 헤더명과 헤더값을 등호(=)로 연결하고, 라인별로 구분한다.


    설정 항목에 대한 설명은 다음과 같다.

    항목설명
    Custom HeaderHTTP 응답 메시지에 포함하기 위한 커스텀 필드를 정의한다.
  4. 설정을 완료한 뒤 설정 내용의 반영을 위해 [Activate Changes] 버튼([그림 1.8] 참고)을 클릭하면 다음과 같이 화면에 반영 결과가 나타난다. 'Custom Header'는 동적 설정 항목이 아니므로 반영 결과에 표시된 것처럼 서버를 재시작해야 설정 내용이 반영된다.


HTTP Request Header의 쿠키를 읽거나 애플리케이션이 생성한 새로운 쿠키를 HTTP 응답으로 보낼 때 적용하는 정책을 설정할 수 있다. 쿠키 정책 설정은 웹 엔진에 대하여 WebAdmin을 통하여 설정할 수 있고, 또한 각 애플리케이션별로 jeus-web-dd.xml에서 설정 가능하다.

WebAdmin을 사용하여 쿠키 정책을 설정하는 방법은 다음과 같다.

  1. WebAdmin 왼쪽 메뉴에서 [Servers]를 선택하면 서버 목록 조회 화면으로 이동한다. 서버 목록에서 실행할 서버를 선택하면 서버 설정 화면으로 이동한다. 설정 화면에서 [Engine] > [Web Engine] > [Basic]메뉴를 선택한다. ([그림 1.10] 참고)

  2. 설정 및 설정 변경을 위해 화면 왼쪽의 [LOCK & EDIT] 버튼을 클릭해서 설정변경 모드로 전환한다. ([그림 1.7] 참고)

  3. 고급 선택사항Cookie Policy 영역의 항목을 설정하고 [확인] 버튼을 클릭한다.

    다음은 쿠키 정책으로 UTF-8 인코딩을 사용하여 쿠키 인코딩 수행을 설정한 예제이다.


    항목설명
    Apply Url Encoding RuleURL Encoding Rule의 적용 여부를 설정한다.
    Charset EncodingURL Encoding Rule을 적용 여부에 상관없이 쿠키를 응답에 쓰거나 해석할 때 사용하는 Character Encoding이다. 설정하지 않을 경우 Request Encoding의 값을 따른다.
  4. 설정을 완료한 뒤 설정 내용의 반영을 위해 [Activate Changes] 버튼([그림 1.8] 참고)을 클릭하면 다음과 같이 화면에 반영 결과가 나타난다. 쿠키 정책은 동적 설정 항목이 아니므로 반영 결과에 표시된 것처럼 서버를 재시작해야 설정 내용이 반영된다.


웹 엔진의 세션 관리를 위한 세션 객체의 공유 여부, 세션 쿠키 설정, 타임아웃 등 웹 엔진의 세션과 관련된 모든 사항을 설정한다.

웹 엔진 레벨에서 세션이 설정되어 있다면, 컨텍스트 레벨에서 세션을 설정하지 않아도 공통적으로 웹 엔진의 세션 설정이 적용된다. 웹 엔진 레벨, 컨텍스트 레벨의 설정이 중복되었을 경우 하위 레벨의 세부적인 설정에 가장 높은 우선순위를 부여한다. 즉, 모두 설정이 되어있다면 컨텍스트 레벨 > 웹 엔진 레벨 순으로 설정값이 적용된다. 만약 하위 레벨에서 특정 설정을 하지 않았다면 상위 레벨의 설정값을 적용하고 모든 레벨에서 설정하지 않은 값은 엔진 내부적인 기본값으로 동작한다.

참고

클러스터링된 환경에서의 세션 관련 사항에 대한 자세한 내용은 JEUS 세션 관리 안내서”의 “제1장 세션 트래킹”을 참고한다.

본 절에서는 각 로그들의 설정 방법에 대해 설명한다.

서버 로그 설정

서버 로그 설정에 대한 자세한 내용은 JEUS Server 안내서”의 “제8장 Logging”을 참고한다.

액세스 로그 기본 설정

웹 엔진 액세스 로그는 WebAdmin을 통해 설정한다. 특별히 설정하지 않아도 기본적으로 액세스 로그를 파일로 남기도록 설정되어 있다.

WebAdmin을 사용한 액세스 로그 기본 설정 방법은 다음과 같다.

  1. WebAdmin 왼쪽 메뉴에서 [Servers]를 선택하면 서버 목록 조회 화면으로 이동한다. 서버 목록에서 실행할 서버를 선택하면 서버 설정 화면으로 이동한다. 설정 화면에서 [Engine] > [Web Engine] > [Access Log] 메뉴를 선택한다.


  2. 설정 및 설정 변경을 위해 화면 왼쪽의 [LOCK & EDIT] 버튼을 클릭해서 설정변경 모드로 전환한다. ([그림 1.7] 참고)

  3. 설정 항목 중 필요한 항목을 설정한다. 기본 설정을 사용할 경우에는 특별히 수정할 필요가 없다. 주로 액세스 로그의 포맷을 변경할 경우나 특정 확장자의 접근을 액세스 로그에 포함시키지 않을 경우에 필요한 설정을 할 수 있다. 기본적으로 존재하는 파일 핸들러 이외에 다른 핸들러를 추가하려면 설정 화면의 아래의 Handlers 영역에서 추가한다. 핸들러에 대한 자세한 내용은 JEUS Server 안내서”의 “제8장 Logging”을 참고한다.

    다음은 액세스 로그의 형식을 기본 형식에서 사용자가 원하는 형식으로 수정하는 예제이다.


    고급 선택사항의 각 항목에 대한 설명은 다음과 같다.

    항목설명
    Filter ClassLogger에 지정할 필터 클래스의 이름을 설정한다.
    Formatter Class해당 Logger의 핸들러에 지정할 Formatter 클래스의 이름을 설정한다.
  4. 설정을 완료한 뒤 설정 내용의 반영을 위해 [Activate Changes] 버튼([그림 1.8] 참고)을 클릭하면 다음과 같이 화면에 반영 결과가 나타난다. 액세스 로그 설정 중 일부 항목은 동적 설정 항목이 아니므로 반영 결과에 따라 필요한 경우 서버를 재시작해야 설정 내용이 반영된다.


가상 호스트별 액세스 로그 설정

가상 호스트별로 액세스 로그를 남기려면 각 가상 호스트 설정에 액세스 로그를 설정해야 한다. 이에 대한 자세한 내용은 “5.4. 가상 호스트 설정”을 참고한다.

액세스 로그 포맷 설정

WebAdmin을 사용해서 액세스 로그의 포맷을 설정할 수 있다. WebAdmin의 [Servers] 메뉴를 클릭하여 나타나는 서버 목록에서 서버를 선택하고, [Engine] > [Web Engine] > [Access Log] 메뉴로 이동하여 Access Log 화면'Format' 항목을 설정할 수 있다. ([그림 1.24] 참고)

포맷에는 기본적으로 '%' 기호를 이용해서 데이터를 나타내며, 임의의 문자열도 가능하다.

웹 엔진은 다음과 같은 포맷 Alias를 제공한다.

위의 포맷 Alias를 이용해서 다음과 같은 형식으로 포맷을 지정할 수도 있다.

default %S

이 경우에 웹 엔진에서 common을 치환해서 다음과 같이 등록한다.

%h %l %u %t \"%r\" %s %b %D %S

이 포맷 설정은 서비스 도중에도 변경이 가능하며, 그 변경 사항이 적용된다. 따라서 현재 제공하는 서비스에 문제가 있는 경우 debug 포맷을 설정해서 세션 ID, 응답 처리 Thread 이름을 액세스 로그에 남길 수 있다.

액세스 로그 필터 설정

액세스 로그의 필터 기능은 액세스 로그의 양이 지나치게 많을 경우 특정 형식 또는 조건을 만족하는 내용만 로그로 기록하고 싶을 경우를 위해 제공되는 기능이다. <exclude-ext>를 통해서 특정 확장자로 끝나는 요청에 대해서 필터링을 지원하고 있다.

참고

JEUS 7부터는 jeus.servlet.util 패키지에서 jeus.servlet.logger 패키지로 변경되었다.

JEUS에서는 jeus.servlet.logger.AccessLoggerFilter 인터페이스 및 jeus.servlet.logger.AbstractAccessLoggerFilter 추상 클래스를 제공하고 있다.

[예 1.8] jeus.servlet.logger.AccessLoggerFilter 인터페이스의 상세 내용 : <<AccessLoggerFilter.java>>

package jeus.servlet.logger;

import java.util.logging.Filter;
import java.util.logging.LogRecord;

/**
 * Access Logger의 내용을 필터링하기 위해 필요한 정보들을 제공하는 인터페이스.
 * {@link Filter}를 상속한 필터 인터페이스로서 부수적으로 제공되는 인터페이스를 통해
 * {@link Filter#isLoggable(java.util.logging.LogRecord)}안에서 다양하게 필터링 정책을 정하도록 가이드한다.
 */
public interface AccessLoggerFilter extends Filter {
    /**
     * 서버에 접속한 remote client의 address 정보를 반환한다.     
     *
     * @param record a LogRecord
     * @return remote client의 address. 만약 올바른 값을 얻지 못할 경우 null을 반환한다.
     */
    public String getRemoteAddr( LogRecord record );

    /**
     * 요청의 메소드를 반환한다. ex) GET, POST, PUT, etc...
     *
     * @param record a LogRecord
     * @return request method. 만약 올바른 값을 얻지 못할 경우 null을 반환한다.
     */
    public String getMethod( LogRecord record );

    /**
     * 요청의 uri를 반환한다.
     *
     * @param record a LogRecord
     * @return request uri. 만약 올바른 값을 얻지 못할 경우 null을 반환한다.
     */
    public String getRequestURI( LogRecord record );

    /**
     * 응답의 status값을 반환한다. ex) 200, 404
     *
     * @param record a LogRecord
     * @return status.
     */
    public int getStatus( LogRecord record );

    /**
     * 요청에 따른 처리시간을 ms단위로 반환한다.
     *
     * @param record a LogRecord
     * @return processing time. 만약 올바른 값을 얻지 못할 경우 -1을 반환한다.
     */
    public long getProcessingTimeMillis( LogRecord record );
}


사용자가 액세스 로그의 특정 패턴에 대해 필터링하는 경우 위의 AccessLoggerFilter 인터페이스 및 AbstractAccessLoggerFilter 추상 클래스를 이용하여 쉽게 필터를 구현하고 적용할 수 있다.

사용자의 필터 클래스는 jeus.servlet.logger.AbstractAccessLoggerFilter를 상속하고, java.util.logging.Filter의 isLoggable() 메소드를 구현해야 한다. isLoggable() 메소드를 구현할 때, 위의 jeus.servlet.logger.AccessLoggerFilter의 API 중에서 사용자가 필요한 정보를 적절히 선택하여 이용 및 구현한다.

다음은 요청 확장자가 .gif인 경우 액세스 로그로 기록하지 않는 필터 클래스를 정의한 예이다.


클래스 정의가 완료되면 해당 클래스를 컴파일한다. 그 다음 JAR 파일 형태로 JEUS_HOME/domains/DOMAIN_HOME/lib/application 디렉터리에 포함시키고, 웹 엔진 액세스 로그 설정에 해당 필터를 설정한다. 액세스 로그 설정 방법은 "액세스 로그 기본 설정"을 참고한다.

유저 로그 설정

아무런 설정을 하지 않을 경우에는 서버 로그 파일(JeusServer.log)에 로그가 남는다. 만약 별도의 로그 파일을 남기고 싶은 경우에는 유저 로그를 설정한다. 유저 로그의 기본 위치 및 파일은 “1.5. 디렉터리 구조”를 참고한다.

유저 로그는 서버 로그와 마찬가지로 JEUS 서버 레벨에서 등록할 수 있고, 웹 애플리케이션의 jeus-web-dd.xml에 등록할 수도 있다. 또한 각 웹 애플리케이션별로 남길 수도 있고, 특정 로그 파일에 모아서 남길 수도 있다.

WebAdmin을 사용한 유저 로그 설정 방법은 다음과 같다.

  1. WebAdmin 왼쪽 메뉴에서 [Servers]를 선택하면 서버 목록 조회 화면으로 이동한다. 서버 목록에서 실행할 서버를 선택하면 서버 설정 화면으로 이동한다. 설정 화면에서 [Basic] > [User Logging] 메뉴를 선택한다.

  2. 설정 및 설정 변경을 위해 화면 왼쪽의 [LOCK & EDIT] 버튼을 클릭해서 설정변경 모드로 전환한다. ([그림 1.7] 참고)

  3. webapp이라는 이름의 웹 애플리케이션만의 로그를 생성하기 위해 'Name' 항목을 다음과 같이 설정한다. webapp 이름없이 'jeus.systemuser'를 입력하면 모든 웹 애플리케이션에 유저 로그가 적용된다.

    고급 선택사항의 각 항목에 대한 설명은 "액세스 로그 기본 설정"을 참고한다. 그 외에 'Level'이나 고급 선택사항은 필요한 경우 설정한다.


  4. 유저 로그명을 설정한 다음 [확인] 버튼을 클릭하면, Handlers 영역 아래에 핸들러를 추가할 수 있는 버튼이 추가된다. [FILE HANDLER], [SMTP HANDLER], [SOCKET HANDLER], [USER HANDLER] 중 추가할 핸들러의 종류에 맞는 버튼을 클릭해서 유저 로그의 핸들러를 추가한다. 각 핸들러의 설정 방법은 JEUS Server 안내서”의 “제8장 Logging”을 참고한다.

    본 예제에서는 파일 핸들러 추가를 위해 [FILE HANDLER] 버튼을 클릭한다.


  5. 유저 로그 핸들러 추가를 위해 File Handler 화면에서 각 항목을 설정한 후 [확인] 버튼을 클릭한다.


  6. 핸들러 추가가 완료되면 다음과 같이 추가된 핸들러가 표시된다.


  7. 설정을 완료한 뒤 설정 내용의 반영을 위해 [Activate Changes] 버튼([그림 1.8] 참고)을 클릭하면 다음과 같이 화면에 반영 결과가 나타난다. 유저 로그 설정 중 일부 항목은 동적 설정 항목이 아니므로 반영 결과에 표시된 것처럼 서버를 재시작해야 설정 내용이 반영된다.


WebAdmin을 사용해서 JEUS에서 정의한 프로퍼티들을 설정할 수 있다. 웹 엔진 프로퍼티에 대한 자세한 내용은 JEUS Reference Book”의 “1.7. 웹 엔진 프로퍼티”를 참고한다.

WebAdmin을 사용한 프로퍼티 설정 방법은 다음과 같다.

  1. WebAdmin 왼쪽 메뉴에서 [Servers]를 선택하면 서버 목록 조회 화면으로 이동한다. 서버 목록에서 실행할 서버를 선택하면 서버 설정 화면으로 이동한다. 설정 화면에서 [Engine] > [Web Engine] > [Basic] 메뉴를 선택한다. ([그림 1.10] 참고)

  2. 설정 및 설정 변경을 위해 화면 왼쪽의 [LOCK & EDIT] 버튼을 클릭해서 설정변경 모드로 전환한다. ([그림 1.7] 참고)

  3. 다음과 같이 'Properties' 항목을 설정한다. 프로퍼티 이름과 값을 등호(=)로 연결한 후 행으로 구분하여 이름과 값의 쌍으로 입력한다. 입력이 완료되면 [확인] 버튼을 클릭한다.


    참고

    WebAdmin을 사용한 프로퍼티 설정은 'Properties' 항목을 통해 설정하는 것을 권장한다. 그러나 [Servers] > [Basic] > [Basic Info] 메뉴의 'Jvm Option' 항목을 통한 설정도 가능하다.

  4. 설정을 완료한 뒤 설정 내용의 반영을 위해 [Activate Changes] 버튼([그림 1.8] 참고)을 클릭하면 다음과 같이 화면에 반영 결과가 나타난다. 프로퍼티 설정은 동적 설정 항목이 아니므로 반영 결과에 표시된 것처럼 서버를 재시작해야 설정 내용이 반영된다.


사용자가 악의적인 목적으로 JEUS에 요청 처리 부담을 주기 위해 일정 크기 이상의 요청들을 대량으로 보내는 공격을 받으면 정상적인 요청들의 응답이 늦어지거나 요청을 처리하지 못하게 되는 현상이 발생한다.

이런 현상을 방지하기 위하여 JEUS 관리자가 JEUS 서버를 기준으로 악의적인 요청에 대한 기준을 설정하여, 이들의 요청 처리로 인한 서버의 부담을 덜어줄 수 있다. 이 설정들은 기본적으로 서버의 웹 엔진 내부에 설정되며, 웹 엔진의 요청을 받아들이는 리스너나 커넥터별로 설정한다. 즉, HTTP 요청을 받아들이는 HTTP 리스너, WebtoB 커넥터, AJP13 커넥터별로 설정한다. 각 리스터나 커넥터별 설정은 “2.3.1. 리스너 공통 설정”을 참고한다.

제한하려는 웹 공격에 대해 다음의 설정들을 적절하게 조합하여 설정하면 웹 공격에 대응할 수 있다.

WebAdmin을 사용한 웹 공격 대응 설정 방법은 다음과 같다.

  1. WebAdmin 왼쪽 메뉴에서 [Servers]를 선택하면 서버 목록 조회 화면으로 이동한다. 서버 목록에서 실행할 서버를 선택하면 서버 설정 화면으로 이동한다. 설정 화면에서 [Engine] > [Web Engine] > [Web Connections] 메뉴를 선택하면 웹 커넥션 목록 조회 화면으로 이동한다. 웹 커넥션 목록에서 웹 커넥션을 선택한다.


  2. 설정 및 설정 변경을 위해 화면 왼쪽의 [LOCK & EDIT] 버튼을 클릭해서 설정변경 모드로 전환한다. ([그림 1.7] 참고)

  3. 다음과 같이 고급 선택사항Http Listener 설정 영역에서 각 항목을 설정한다. 화면에 표시된 항목의 설정을 통해 각 리스너별로 웹 공격에 대하여 대응을 할 수 있다. 각 설정 항목에 대한 자세한 설명은 “2.3.1. 리스너 공통 설정”을 참고한다.


특정 URL 패턴의 HTTP 요청 방지를 위해 HTTP 클라이언트가 다음과 같은 요청을 보냈다고 가정한다.

GET /examples/%2e%2e%2fdb.txt HTTP/1.1

웹 컨테이너는 먼저 요청 URI를 URL Decode해야 한다.

/examples/../db.txt

이렇게 되면 실제 HTTP 서비스와는 관련없는 파일들을 접근할 수 있게 된다. 주로 악의적인 목적을 가진 클라이언트가 이런 식으로 요청 URI을 보낸다.

웹 컨테이너에서 모든 악의적인 요청 패턴을 파악할 수 없으므로 사용자가 직접 악의적인 패턴을 막을 수 있도록 설정을 제공한다. HTTP 요청인 경우에만 동작하며, Query String을 제외한 URI에 대해 특정 문자열을 매칭해서 무조건 "404 Not Found"로 처리한다.

참고

JEUS 6 및 JEUS 7 Fix#1까지는 프로퍼티 파일을 사용했지만, JEUS 7 Fix#2부터는 domain.xml에 설정한다.

WebAdmin을 통한 설정 방법은 다음과 같다.

참고

아무런 설정을 하지 않을 경우 웹 컨테이너는 Encoded Pattern의 경우 %00, %23, %2e, %2f, %5c, Decoded Pattern은 #, \에 대해서 404 응답 처리한다. 패턴은 대소문자를 구분하지 않는다. 항상 소문자로 변환해서 처리한다.

웹 엔진의 최적화된 성능을 위해서는 다음의 몇 가지 사항을 고려해야 한다.

  • <output-buffer-size>를 적절한 크기로 지정한다. WebtoB와 함께 사용할 경우에는 <webtob-connector>에 <send-buffer-size>와 <receive-buffer-size>를 적절하게 지정한다.

  • <check-included-jspfile>는 include된 JSP들이 변경되지 않는다면 설정을 false로 유지한다. 이것은 include된 JSP 파일들에 대한 변경 점검을 하지 않기 때문에 성능 향상에 도움이 된다.

  • JSP 파일이 변경되지 않는다면 jeus.servlet.jsp.reload 프로퍼티를 false로 설정한다. 매번 JSP 호출할 때마다 파일 시스템에 메타 데이터를 조회하지 않는다.