제5장 Session Tracking

내용 목차

5.1. 개요
5.2. Session Tracking의 주요 기능
5.2.1. 기본 기능
5.2.2. 클러스터 환경에서 Session Tracking
5.2.3. Session Routing(Sticky Session)
5.2.4. Session Server
5.2.5. 혼합 모드
5.2.6. 분산 Session Server
5.2.7. URL Rewriting과 Cookie
5.2.8. Shared Session 데이터
5.3. Session Tracking 설정
5.3.1. 중앙 Session Server 설정
5.3.2. 분산 Session Server 설정
5.4. Session Tracking 튜닝

본 장에서는 Session Tracking의 주요 기능과 설정 방법, 튜닝에 대해서 설명한다.

5.1. 개요

Session Tracking에 관련된 기본적인 개념에 대한 소개부터 시작한다. 각 주제들은 Session, Session ID, Session Cookie, URL rewriting등에 대한 정의를 내리고 JEUS 웹 컨테이너에 Session Tracking을 어떻게 구현하는지에 대해 설명한다. 또한 보다 복잡한 분산 환경인 웹 서버 클러스터링 환경에서는 어떻게 Session Tracking이 구현되고 설정되는지도 살펴본다.

이러한 클러스터링 환경에서 Session Tracking을 지원하는 메커니즘에는 Session Routing과 Session Server의 사용 2가지가 있다. Session Server를 사용하는 방법에는 동작 방식에 따라 중앙 집중식, 분산식 두 가지 방식이 있다.

5.2. Session Tracking의 주요 기능

본 절에서는 Session Tracking이 무엇이고 JEUS 웹 컨테이너에서 어떻게 지원되는지에 대하여 알아본다. 매우 간단한 설명만이 제공되기 때문에 익숙하지 않은 사용자들은 본 절의 내용을 이해하려고 시도하기 전에 Servlet과 Session Tracking에 대한 서적을 참고한다.

다음 그림은 Session Tracking과 Session 관리에 관련된 웹 컨테이너의 컴포넌트를 보여주고 있다. Session에 관련된 부분들이 강조되어 있다.

[그림 5.1] JEUS 웹 컨테이너의 구조 중 Session에 관련된 부분들

JEUS 웹 컨테이너의 구조 중 Session에 관련된 부분들


참고

웹 서버도 Session Tracking에 관련되어 있음을 주의한다.

(HTTP) Session은 동일한 클라이언트(예를 들면 웹 브라우저)의 HTTP 요청과 연관된 일련의 작업들이다. 여러 클라이언트가 이런 요청을 표준 HTTP를 통하여 보낼 때 웹 서버는 이 클라이언트들을 구별할 수 없다. 이 문제는 기본적으로 HTTP 헤더에 유일한 “Client ID”가 없기 때문이다.

따라서 웹 서버는 관련된 사용자 요청을 하나의 Session으로 Tracking할 수 없다. 이것은 HTTP가 stateless(무상태)와 connectionless(무연결) 프로토콜이기 때문이다.

이것은 기본적으로 다음과 같이 작동한다.

  1. 클라이언트는 웹 서버에 연결을 한다.

  2. 클라이언트는 무상태 HTTP 요청을 생성한다.

  3. 클라이언트는 응답을 받는다.

  4. HTTP 연결이 끊어진다.

Client ID나 지속적인 Session의 개념은 HTTP 프로토콜에 포함되어 있지 않다. 따라서 웹 서버는 HTTP 연결이 끊어지거나 요청에 대한 응답 수신을 종료한 순간, 각 요청에 대한 사항들을 잃어버린다(단일 요청을 하는 경우 발생). 복잡한 웹 애플리케이션에서 사용자가 지속적으로 서로 연관된 요청을 수행하는 경우에는 사용할 수 없는 것이다.

이 문제를 극복하기 위하여, Session ID라는 특수 string을 각 HTTP 요청에 추가한다. 이 유일한 ID는 클라이언트가 최초 요청을 할 때 필요에 따라 생성되어 클라이언트에 전달된다. 이후 클라이언트의 요청에 이 Session ID가 지속적으로 붙여진다. 이렇게 함으로써, 웹 컨테이너는 각 요청의 근원을 파악할 수 있기 때문에 사용자가 거래를 하는 동안에 대화성 상태(Conversational state)를 유지할 수 있게 된다. 따라서 Session의 기능이 없는 HTTP 프로토콜을 이용하여 Session의 개념을 지원할 수 있는 것이다.

Session ID는 Cookie 또는 클라이언트에게 반환되는 HTML 페이지의 각 URL 링크의 파라미터로 자동으로 추가(이것을 URL rewriting이라고 한다)된다. 또 다른 옵션은 hidden field로 HTML 폼에 Session ID를 저장하는 방법이 있다. 물론, Servlet 프로그래머의 관점에서 봤을 때, 이 논점들은 강력한 Servlet API에 의해 모두 구현되는 것들이다.

5.2.1. 기본 기능

JEUS 웹 컨테이너는 URL rewriting과 Cookie를 모두 지원하여 Session Tracking을 가능하게 하기 위해서 기본적으로 Cookie가 사용된다. Session ID를 운반할 때 사용되는 Cookie를 Session Cookie라고 한다.

웹 컨테이너에서 하나의 Session은 하나의 Servlet API인 HttpSession 클래스의 인스턴스로 표현된다. 이 인스턴스는 Session Cookie(또는 URL rewriting의 결과로 생긴 URL 파라미터)의 Session ID와 연관되어 있다. HttpSession 객체는 기본적으로 그것을 생성하는 웹 컨테이너에 존재하고 이것은 사용자 선호 성향이나 사용자가 전자 상거래 사이트에서 구매하고 싶은 물품의 목록 등과 같은 사용자에 대한 데이터를 가지고 있다.

지금부터 JEUS의 웹 컨테이너에서 어떻게 Session Cookie와 HttpSession 객체가 사용되어 Session을 Tracking하는지에 대하여 알아보자. URL rewriting은 여기서 설명한 기술의 개념과 유사한 것임을 알아두자. 단, Session ID가 HTML 페이지의 URL 링크에 포함되어 있다는 것이 별도의 Cookie header에 담겨진다는 것과 다르다.

다음은 한 클라이언트가 JEUS 웹 컨테이너가 관리하는 리소스를 요청하는 과정에 대한 설명이다.

[그림 5.2] 웹 컨테이너가 Session Cookie를 발급하는 과정

웹 컨테이너가 Session Cookie를 발급하는 과정

  1. 클라이언트는 웹 서버에 초기 요청을 한다.

  2. 웹 서버는 웹 컨테이너에게 요청을 전달한다.

  3. 웹 컨테이너는 해당 클라이언트를 위한 HttpSession 객체와 해당 HttpSession의 Session ID를 지닌 Session Cookie를 생성한다. 이 ID는 동일한 클라이언트가 지속적인 요청을 할 때 메모리에서 생성한 HttpSession 객체를 가져오기 위해 사용된다.

  4. 응답 데이터와 Session Cookie는 웹 서버에 전달된다.

  5. Session Cookie는 클라이언트의 웹 브라우저에 응답과 함께 전달되고 HTTP 연결은 끊어진다.

  6. SessionID를 포함하는 Session Cookie는 클라이언트의 웹 브라우저에 저장된다.

이제 클라이언트는 Session Cookie를 지니고 있고, 같은 웹 컨테이너에 또 다른 요청할 때 Cookie를 포함해서 보낼 수 있다. 웹 컨테이너는 클라이언트를 인식할 수 있고(Cookie의 Session ID를 보고), 클라이언트의 HttpSession 객체를 가져올 수 있다.

다음은 이 과정에 대한 설명이다.

[그림 5.3] Session ID Cookie로 웹 컨테이너에 두 번째 요청을 보내는 과정

Session ID Cookie로 웹 컨테이너에 두 번째 요청을 보내는 과정

  1. 클라이언트는 같은 웹 서버에게 또 다른 요청을 보낸다. 이번에는 전에 받은 Session Cookie를 웹 브라우저에서 받아 요청에 첨부한다.

  2. 웹 서버는 요청을 받아 처음의 요청과 같이 동일한 웹 컨테이너에 요청(Cookie도 포함하여)을 전달한다.

  3. 웹 컨테이너는 요청과 Session Cookie를 받는다. Session Cookie에서 발견된 Session ID에 해당하는 HttpSession 객체를 자신의 메모리 영역에서 찾아온다. 웹 컨테이너는 그 HttpSession 데이터를 사용하여 요청을 처리한다.

  4. 응답 데이터와 Session Cookie는 웹 서버에 전달된다.

  5. HTTP 응답이 웹 브라우저에게 전달된다. 그리고 HTTP 연결은 끊어진다. 이 응답에 Cookie가 같이 전달될 필요는 없다. Cookie는 처음 연결이 생성될 때만 응답에 포함되어 전달되면 된다.

5.2.2. 클러스터 환경에서 Session Tracking

이전 절에서는 단 하나의 클라이언트, 하나의 웹 서버, 하나의 웹 컨테이너가 연계된 간단한 상황에서 Session Tracking이 이루어지는 것을 살펴보았다. 그러나 실제 운영 환경에서는 이러한 간단한 구조는 충분하지 않은 경우가 많다. 많은 양의 사용자 요청을 수용하기 위해서는 부하 분산과 웹 서버 클러스터링이 구현되어야 한다.

어떻게 클러스터가 구성되는지에 대한 자세한 내용은 “제4장 웹 서버 연결과 클러스터링”을 참고한다.

웹 서버 클러스터에 있어서 Session Tracking 메커니즘을 구성하고 설정할 때에는 특별한 주의가 필요하다. 분산된 클러스터에서 Session을 관리할 때에는 3가지의 주요 사항들이 쟁점이 된다.

  1. Session Cookie를 가지는 요청을 처음 요청했던 웹 컨테이너에게 어떻게 전달되게 할까?

  2. Session으로 제한적인 요청을 모든 웹 컨테이너가 처리할 수 있게 하기 위해서 어떻게 하나의 컨테이너에서 생성된 HttpSession 객체를 다른 웹 컨테이너에서도 사용할 수 있게 할까?

  3. 내부 또는 외부적인 장애로 웹 컨테이너가 다운되었을 때 어떻게 Session 데이터를 백업할까?

첫 번째 논점은 Session Routing(Sticky Session)이라는 기능으로 대처 가능하고 나머지 2가지 논점들은 Session Server로 대처 가능하다. 지금부터 이 3가지의 문제와 해결 방법에 대하여 설명한다.

참고

위의 1, 2번은 근본적으로 같은 문제이지만 2가지 방법으로 해결한다.

5.2.3. Session Routing(Sticky Session)

Session Routing(Sticky Session)은 클러스터된 환경에서 Client ID뿐만 아니라 웹 컨테이너 ID와 함께 Session ID Cookie로 꼬리표를 붙이기 위해 사용된다. Container ID는 Session Cookie를 처음 생성했던 컨테이너에 의해 추가되고, 웹 서버가 원래의 웹 컨테이너에게 요청을 전달해 줄 수 있게 한다.

예를 들면, 2개의 웹 컨테이너 A, B가 하나의 웹 서버에 연결된 클라이언트 요청 상황을 고려해보자.

이 과정은 다음과 같이 나타낼 수 있다.

[그림 5.4] Session ID Cookie를 이용하여 2개의 웹 컨테이너와 Session을 시작하는 경우

Session ID Cookie를 이용하여 2개의 웹 컨테이너와 Session을 시작하는 경우


  1. 클라이언트는 웹 서버에게 초기 요청을 한다.

  2. 웹 서버는 임의적으로 요청 전달을 위해 1개의 웹 컨테이너를 선택한다. 여기서는 웹 컨테이너 A가 선택되었다.

  3. 요청은 웹 컨테이너 A로 전달된다.

  4. 웹 컨테이너 A는 HttpSession 객체를 생성하고 응답과 함께 SessionID Cookie를 돌려 보낸다. 이 ID는 다음에 오는 같은 클라이언트의 요청을 처리할 HttpSession 객체를 메모리에서 불러 올 때 사용된다.

  5. 웹 컨테이너는 응답을 하고 웹 서버에 Session Cookie가 반환된다.

  6. Session Cookie는 응답과 함께 클라이언트의 웹 브라우저로 전달된다. HTTP 연결은 이제 끊겼다.

지금까지 모든 것이 정상적이었다. 심각한 문제는 두 번째 요청이 같은 클라이언트로부터 생성될 때 발생하기 시작한다. 이 문제의 시나리오는 다음과 같이 그림으로 표현이 가능하다.

[그림 5.5] Session Routing이 없는 경우 클라이언트 Session 삭제

Session Routing이 없는 경우 클라이언트 Session 삭제

  1. 클라이언트는 같은 웹 서버에 또 다른 요청을 한다. 이번에는 이전에 반환된 Session Cookie가 웹 브라우저로부터 가져와 요청에 붙여진다.

  2. 웹 서버는 요청을 받아 들인다. 웹 서버는 임의로 2개 중 1개의 웹 컨테이너를 선택한다. 이번에는 웹 컨테이너 B가 선택되었다.

  3. 그 요청과 Session Cookie는 웹 컨테이너 B에 전달된다.

  4. 웹 컨테이너 B는 요청과 Session Cookie를 받는다. 이것은 자신의 메모리 영역에서 Cookie에 대응하는 HTTPSession을 가져오려고 시도한다. 웹 컨테이너 B는 그러한 HTTPSession 객체가 없기 때문에 가져올 수 없다. 따라서 웹 컨테이너 B는 클라이언트 Session을 유지할 수 없고 새로운 Session을 강제로 생성하거나 또는 오류 메시지를 반환한다(물론 두 옵션 모두 권장하지 않는다).

이 문제를 해결하기 위하여 처음에 HttpSession 객체를 생성했던 동일한 웹 컨테이너에게 Session으로 제한된 요청을 올바르게 Routing해 줄 방법이 필요하다. 이것은 Session Cookie에게 추가의 웹 컨테이너 ID를 부여함으로써 해결된다. 다음은 이 해결 과정을 그림으로 나타낸 것이다.

[그림 5.6] Session Cookie에 추가의 웹 컨테이너 ID 부여

Session Cookie에 추가의 웹 컨테이너 ID 부여

  1. 클라이언트는 웹 서버에 초기 요청을 맺는다.

  2. 웹 서버는 임의의 웹 컨테이너를 선택한다. 여기서는 웹 컨테이너 A가 선택된다.

  3. 요청은 웹 컨테이너 A에 전달된다.

  4. 웹 컨테이너 A는 HttpSession, Session ID Cookie를 생성하고 웹 컨테이너 ID(CID)를 Cookie에 삽입한다.

  5. 웹 서버에 응답과 Session Cookie를 반환한다.

  6. 웹 브라우저에 응답과 Session Cookie를 반환한다.

  7. 웹 컨테이너ID(CID)를 포함하는 Session Cookie는 웹 브라우저에 저장된다.

이렇게 함으로써 Routing 문제가 쉽게 해결된다. 다음은 Session Routing의 작동에 대한 그림이다.

[그림 5.7] Session Routing의 작동

Session Routing의 작동


두 번째 요청에 웹 서버는 Session Cookie와 Container ID 값(CID)을 찾아낸다. 웹 서버는 해당 HttpSession이 존재하는 원래의 웹 컨테이너로 요청을 Routing시킨다.

웹 서버에서 표준이 아닌 Container ID를 식별하기 위해서 Apache, IIS, SunOne(Iplanet)과 같은 다른 웹 서버의 경우에는 mod_jk 모듈을 설치해야 한다. WebtoB 웹 서버에게는 이 기능은 내장되어 있다. 자세한 내용은 “4.4. 리스너 연동과 클러스터링을 위한 웹 서버 설정” 부분의 설명을 참고한다.

참고

Session Routing 기능을 위해서는 모든 웹 서버가 모든 웹 컨테이너와 연결을 맺어야 한다. 부하 분산기를 사용할 경우, 여러 대의 웹 서버 중에서 요청을 받은 웹 서버가 해당 웹 컨테이너에 접속을 하지 못하면 Session이 끊길 수 있기 때문이다.

그러나 부하 분산기가 Session Routing을 자체적으로 지원하고 있다면, 위처럼 서로 간에 모두 연결될 필요가 없다. 예를 들어 WebtoB를 부하 분산기로 사용하고 있다면, Session Routing은 클러스터링이 완벽하게 연결되어 있지 않아도 사용할 수 있다.

5.2.4. Session Server

간단한 Session Routing을 사용하는 것보다 한 층 더 강력한 것이 Session Server를 사용하는 것이다.

Session Server를 사용할 때에는 모든 웹 컨테이너가 클러스터 내의 모든 웹 서버에 연결될 필요는 없다. 또한, Session Server는 클러스터 내의 모든 Session 데이터에게 신뢰적인 백업 기능을 제공한다. 따라서 특정 웹 컨테이너에 장애가 발생하더라도 Session 데이터는 저장되고 다른 정상적인 웹 컨테이너가 장애가 발생한 웹 컨테이너의 요청을 대신 처리한다.

다음 그림에는 장애가 발생한 웹 컨테이너의 문제가 표현되어 있다. 이 시나리오에서는 웹 컨테이너에 존재하는 모든 사용자 Session 데이터가 소멸된다. 이런 상황은 운영 환경에서는 반드시 피해야 하는 것이다.

[그림 5.8] 장애가 발생한 웹 컨테이너의 문제

장애가 발생한 웹 컨테이너의 문제


이와 같이 특정 웹 컨테이너에 장애가 발생하는 상황에서도 Session을 지속시키기 위해서 Session Server가 클러스터에 추가되었다. 이런 Session Server가 사용될 경우에는 클라이언트의 첫 HTTP 요청이 다음과 같은 방법으로 처리된다.

[그림 5.9] Session Server가 사용될 경우 클라이언트의 첫 HTTP 요청 처리

Session Server가 사용될 경우 클라이언트의 첫 HTTP 요청 처리


  1. 클라이언트는 웹 서버에게 요청을 보낸다.

  2. 웹 서버는 웹 컨테이너 A를 클러스터 내에서 선택하여 요청을 처리하게 한다.

  3. 웹 서버는 웹 컨테이너 A에게 요청을 전달한다.

  4. 웹 컨테이너는 HttpSession 객체와 Session Cookie를 생성한다. 이 ID는 다음에 같은 클라이언트로부터 요청이 왔을 때 Session Server로부터 생성된 HttpSession 객체를 꺼내기 위해 사용된다.

  5. 요청에 대한 처리가 완료되면 웹 컨테이너는 HttpSession 객체와 SessionID를 Session Server에 저장한다.

  6. 응답 데이터와 Session Cookie는 웹 서버로 전달된다.

  7. SessionIDCookie는 응답과 함께 웹 브라우저로 전달되고 HTTP 연결이 끊긴다.

  8. 웹 브라우저는 이 Session Cookie를 저장한다.

후에 웹 컨테이너 B가 무작위로 웹 서버에 의해 클라이언트 A의 요청을 처리하도록 선택되거나 웹 컨테이너 A에 장애가 발생하더라도 Session 데이터는 Session Server에서 가져올 수 있다.

[그림 5.10] Session 데이터의 요청 처리

Session 데이터의 요청 처리


게다가, Session 데이터 저장소를 좀 더 안정적으로 만들기 위하여 백업 Session Server가 설정될 수 있다. 자세한 내용은 “5.3. Session Tracking 설정”에서 간략하게 다시 설명한다.

실제로 Session Server는 JEUSMain.xml에서 설정하며 특정 Context가 Session Server를 사용할지의 여부는 Context 레벨의 웹 애플리케이션의 설정 즉, jeus-web-dd.xml에서 설정한다.

일반적으로 Context 레벨에서 설정을 하지만 WEBMain.xml에서 Web Container 레벨, Context Group 레벨의 설정도 가능하다. 이와 관련된 자세한 내용은 “2.3.7. Session”을 참고한다.

참고

중앙 집중식 Session 클러스터링 설정에 대한 자세한 내용은 JEUS Server 안내서”의 “10.2. 중앙 세션 서버”를 참고한다.

5.2.5. 혼합 모드

위에서 설명한 Session Routing 방법과 Session Server 방법이 혼합된 것이 혼합 모드이다.

Session Routing(Sticky Session) 방법은 웹 컨테이너의 Session 객체를 접근하므로 빠르다. 그러나 문제가 발생할 경우에 웹 컨테이너의 모든 Session 데이터는 소멸되고 복구가 불가능하게 될 것이다.

Session Server를 사용하면 Session Server에 모든 Session 객체가 서버에 저장되므로 특정 웹 컨테이너에 문제가 생기더라 하더라도 Session 객체의 소멸은 없다. 특정 웹 컨테이너에 문제가 발생하더라도 Session Server는 Session을 유지할 수 있다. 그러나 이 기술은 Session이 필요한 요청이 들어왔을 경우에 Session 객체를 Session Server로부터 가져와야 하는 부담이 있다. 또한 HTTPSession 객체가 변경되었을 경우 Session Server에 다시 저장되어야 한다. 그러므로 Session Server를 사용하는 단점은 Session Routing의 방법보다 처리 속도가 늦다는 것이다.

혼합 방식을 사용함으로써 2가지 방식의 장점을 모두 살릴 수 있다. 만약에 2가지 방법이 혼합되면 Session 객체는 Session Server와 Session 객체를 생성한 웹 컨테이너에 모두 존재한다.

혼합 방식을 사용하여 웹 컨테이너는 필요할 때만 Session Server에서 HTTP Session 객체를 꺼내서 변경한다. 따라서, 혼합 방식을 사용할 경우에는 사용되는 네트워크 대역폭도 Session Server만을 사용하는 방식에 비해 거의 절반 가량 줄이고 모든 Session 데이터의 안전한 백업도 보장받을 수 있다. 이 때문에 클러스터 환경에서는 혼합 방식의 Session 관리의 사용을 권장한다.

5.2.6. 분산 Session Server

Session Server를 사용하면 특정 웹 컨테이너에 장애가 발생하더라도 지속적으로 Session을 유지할 수 있는 장점이 있다. 그러나 Session Server를 사용하는 경우 소규모의 클러스터링 환경에서는 좋은 성능을 유지 할 수 있으나 클러스터링 규모가 커질수록 Session Server에 부담이 가중되어 선형적인 성능 향상을 얻을 수 없는 단점이 있다. 분산 Session Server는 대규모 클러스터링 환경에서 성능 향상을 위해 고안된 Session Server이다.

분산 Session Server란 각 웹 컨테이너마다 Session Server를 두는 방식을 말한다. 기본적으로 Session Routing 기술(Sticky Session)을 사용하며(물론 Session Routing(StickySession)이 적용되지 않는 환경에서도 이상 없이 동작한다) Session Server와 마찬가지로 Session 데이터 백업을 설정할 수 있어 웹 컨테이너에 장애가 발생하여도 지속적으로 Session을 유지할 수 있다.

소규모 클러스터링 환경에서는 중앙 Session Server를 사용하고 대규모 클러스터링 환경에서는 분산 Session Server를 사용하기를 권장한다. 분산 Session Server 설정은 JEUSMain.xml를 통해서 이루어지며, 특정 Context가 Session Server를 사용할지의 여부는 Context 레벨의 웹 애플리케이션의 설정 즉, jeus-web-dd.xml에서 설정한다. 일반적으로 Context 레벨에서 설정을 하지만 WEBMain.xml에서 웹 컨테이너, Context Group 레벨의 설정도 가능하다. 이와 관련된 자세한 내용은 “2.3.7. Session”을 참고한다.

참고

분산식 Session 클러스터링 설정에 대한 자세한 내용은JEUS Server 안내서”의 “10.3. 분산 세션 서버”를 참고한다.

5.2.7. URL Rewriting과 Cookie

기본적으로 웹 컨테이너는 클라이언트의 Session ID를 지속되는 요청동안 유지하기 위하여 Cookie를 사용한다. 한 가지 문제점은 대부분의 웹 브라우저가 새로운 요청에 대하여 Cookie가 원래 생성된 곳의 도메인 이름과 다른 도메인 이름을 가지고 요청을 하면 SessionID Cookie를 보내지 않는다는 것이다.

이런 이유로, jeus-web-dd.xml deployment descriptor에 특수한 태그가 필요한데, <url-rewriting> 태그가 그것이다. 이 태그가 사용되면, Session ID는 웹 브라우저가 Cookie를 지원하여도 URL rewriting을 사용하여 유지된다. 이런 방법으로, Session Tracking은 다른 도메인 이름이 몇 개의 요청에 사용되어도 작동한다. 이와 관련된 설정에 대해서는 Session 설정인 “2.3.7. Session”“제6장 Web Context(웹 애플리케이션)”를 참고한다.

5.2.8. Shared Session 데이터

일반적으로 Session은 같은 Context에서만 관리된다. 하지만 같은 Session을 다른 Context 간에 공유를 하기를 원한다면 Session 설정의 <shared>를 "true"로 설정한다. 이와 관련된 자세한 설정은 “2.3.7. Session”의 <shared> 부분을 참고한다.

참고

Session Server를 사용한다고 해서 모든 Session이 공유되는 것은 아니다. Session Server를 사용하더라도 서로 다른 Context 간에 Session을 공유하려면 Session 설정의 <shared>를 반드시 설정해야 한다.

5.3. Session Tracking 설정

본 절에서는 JEUS에서 Session Tracking을 위한 설정 파일들과 각 설정 방법에 대해서 설명한다. 또한 Apache 웹 서버는 어떻게 설정이 되어야 Session Routing(Sticky Session)이 지원되는지에 대해서도 설명한다.

참고

Session Tracking에 대한 설정은 WebAdmin을 이용하여도 동일하게 설정이 가능하다.

Session Tracking을 위해서는 Session Routing(Sticky Session)과 Session Server를 사용하는 방법이 있다고 위에서 설명하였다.

  • Sticky Session 사용 방법

    JEUS6에서는 기본적으로 Session Routing(Sticky Session)을 지원하므로 웹 서버에서 Session Routing(Sticky Session)이 지원된다면 특별한 설정을 하지 않아도 된다.

  • Session Server 사용 방법

    위에서 언급한 혼합 모드를 위해서는 JEUS가 제공하는 중앙 Session Server 또는 분산 Session Server를 설정하고 웹 컨테이너의 Session 설정의 <distributable>을 "true"로 설정해야 한다. Session 설정은 WEBMain.xml에서 Web Container 레벨, Context Group 레벨로 설정하거나 jeus-web-dd.xml에서 Context 레벨로 설정할 수 있다.

    이 부분에서는 Context 레벨의 설정만 설명한다. 좀 더 자세한 내용을 위해서는 “2.3.7. Session”부분을 참고한다.

5.3.1. 중앙 Session Server 설정

중앙 Session Server를 사용하는 경우 JEUSMain.xml에 중앙 Session Server 설정을 하고 JEUS 노드를 재시작해야 한다. 중앙식 Session Server는 사용한 Session 클러스터링이 노드 클러스터링 상태와 아닐 때 모두 가능하다. 2가지 경우에 따라 설정 방법은 다르며 구체적인 설정 방법은 다음과 같다.

참고

만약 중앙 Session Server와 분산 Session Server 설정이 동시에 JEUSMain.xml에 존재한다면 중앙 Session Server를 사용한다. 중앙 Session Server의 설정 방법은 JEUS Server 안내서”의 “10.2. 중앙 세션 서버”를 참고한다.

노드 클러스터링 상태일 때 설정

노드 클러스터링 상태일 때는 웹 컨테이너 설정을 위해 WEBMain.xml에서 다음의 예제와 같이 Session Server 사용 여부를 설정해 주기만 하면 된다. 다음은 Session Tracking 설정에 대한 예이다.

[예 5.1] Session Tracking 설정 : <<WEBMain.xml>>

<?xml version="1.0"?>
<web-container xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <session-config>
        <distributable>true</distributable>
        . . .
    </session-config>
    . . .
</jeus-web-dd>


노드 클러스터링 상태가 아닐 때 설정

노드 클러스터링 상태가 아닐 경우에는 웹 컨테이너 설정인 WEBMain.xml에 해당 컨테이너가 사용할 Session Server의 정보를 설정해야 한다. 그리고 Session Server 사용 여부를 [예 5.1]과 같이 설정한다.

노드 클러스터링을 하지 않은 상태에서 중앙 Session Server를 사용하기 위해서는 WEBMain.xml의 Session Server 설정은 다음과 같이 한다.

[예 5.2] 노드 클러스터링을 하지 않은 상태에서 중앙 Session Server 사용 : <<WEBMain.xml>>

<?xml version="1.0"?>
<web-container>
    . . .
    <session-server>
        <primary-server>node1</primary-server>
        <backup-server>node2</backup-server>
        <connect-timeout>120000</connect-timeout>
        <read-timeout>12000</read-timeout>
        <check-level>set</check-level>
    </session-server>
    . . .
</web-container>

다음은 설정 태그에 대한 설명이다.

  • <session-server>

    태그설명
    <primary-server>주 중앙 Session Server의 JEUS 노드 이름이다. 이 노드에 대한 물리적인 호스트 정보는 vhost.properties에 명시되어 있어야 한다.
    <backup-server>

    백업 Session Server의 JEUS 노드 이름이다.

    주 Session Server가 다운되었을 때 웹 컨테이너는 백업 Session Server로 take over를 실행한다. 이 노드에 대한 물리적인 호스트 정보는 vhost.properties에 명시되어 있어야 한다.

    <connect-timeout>Session Server와 웹 컨테이너 사이의 연결을 맺을 때 기다리는 최대시간을 나타낸다. (기본값: 20초, 단위: ms)
    <read-timeout>Session Server와 웹 컨테이너 사이의 통신에 있어서 응답을 기다리는 최대시간을 나타낸다. (기본값: 20초, 단위: ms)
    <check-level>

    Session Server로 Session을 업데이트하기 위한 Session 객체의 수정 정도를 설정한다.

    • all : getSession 후에 Session 객체의 수정과 관련없이 모든 Session을 Session Server로 업데이트한다.

    • modified : getSession 후에 Session 객체의 수정 사항을 검사해서 변경된 경우에 업데이트한다.

    • set : 해당 Session의 setAttribute/putValue/removaAttribute/removeValue/setMaxInactiveInterval을 호출한 경우에만 Session을 업데이트한다. (기본값)

WEBMain.xml를 설정할 때 <primary-server>와 <backup-server>에 설정되는 JEUS 노드 정보를 설정하는 vhost.properties의 설정 예는 다음과 같다.

[예 5.3] <<vhost.properties>>

jeus.vhost.enable=true
node1=xxx.xxx.xxx.xxx:10003
node2=yyy.yyy.yyy.yyy:10004

각 설정값들의 의미는 다음과 같다.

항목설명
jeus.vhost.enabletrue로 설정한다.
노드 정보

노드의 실제 물리적 설정으로 node1과 node2의 설정을 한 예이다.

"IP : port" 형식으로 작성한다.

5.3.2. 분산 Session Server 설정

분산 Session Server를 사용하고자 할 때에도 JEUSMain.xml에 설정을 하고 JEUS 노드를 재시작한다. 자세한 설정 방법은 JEUS Server 안내서”의 “10.3. 분산 세션 서버”를 참고한다.

참고

여러 분산 Session Server가 클러스터링되는 환경을 위해서는 JEUS의 노드 클러스터링이 전제되야 한다. 만약 중앙 Session Server와 분산 Session Server 설정이 동시에 JEUSMain.xml에 존재한다면 중앙 Session Server를 사용한다.

5.4. Session Tracking 튜닝

클러스터된 환경에서 최적의 성능을 위해 다음과 같이 수행한다.

  • 항상 Session Routing(Sticky Session)과 Session Server를 혼합하여 사용하도록 노력한다.

    이는 좋은 성능과 안정적인 운영을 보장한다.

  • 웹 서버 연결들이 잘 설정되고 튜닝되어 있어야 한다.

  • 사용자의 요청이 폭주하는 사이트에서는 분산 Session Server를 사용할 것을 권장한다.