세션 타임아웃 설정(Session timeout) - WAS, web.xml, Node.js

세션이란?

세션(Session)은 웹 애플리케이션에서 사용자와 서버 간의 연결을 관리하고, 특정 사용자가 웹사이트를 탐색하는 동안 상태를 유지하는 기술입니다. HTTP 프로토콜은 기본적으로 무상태(stateless) 이므로, 각 요청은 독립적이고 이전 요청과 연결되지 않습니다. 세션은 이를 해결하기 위해 사용되며, 주로 사용자 상태 저장을 목적으로 합니다.

세션의 주요 특징:

  1. 상태 유지:
    • 세션은 사용자가 웹사이트를 탐색하는 동안 서버에 데이터를 저장하여 사용자의 상태를 유지할 수 있게 합니다. 예를 들어, 사용자가 로그인했는지, 장바구니에 어떤 상품이 담겨 있는지 등의 정보를 추적할 수 있습니다.
  2. 서버에 저장:
    • 세션 데이터는 일반적으로 서버에 저장되며, 클라이언트는 세션 ID를 포함한 쿠키를 통해 해당 세션에 접근합니다. 이를 통해 서버는 사용자가 보낸 요청을 구별하고, 특정 사용자에 대한 정보를 유지합니다.
  3. 세션 ID:
    • 각 세션은 고유한 세션 ID를 가집니다. 이 세션 ID는 서버에서 생성되어 클라이언트에게 전달되며, 이후의 모든 요청에서 해당 ID가 사용됩니다. 클라이언트는 이 ID를 쿠키로 저장하거나 URL 파라미터로 전송할 수 있습니다.
  4. 만료 및 종료:
    • 세션은 시간 만료를 설정할 수 있습니다. 일정 시간이 지나면 세션이 자동으로 만료되어 사용자의 상태 정보가 사라지거나 삭제됩니다.
    • 또한, 사용자가 로그아웃하거나 세션을 명시적으로 종료하면 세션 데이터가 삭제됩니다.

세션의 활용 예시:

  • 로그인 상태 관리: 사용자가 로그인하면 세션을 통해 로그인 정보를 서버에 저장하고, 이후 요청에서 이 정보를 사용하여 사용자가 인증된 상태인지 확인합니다.
  • 장바구니: 쇼핑몰 사이트에서 사용자가 장바구니에 상품을 추가하면, 세션을 통해 해당 정보를 서버에 저장하여 사용자가 다른 페이지로 이동하더라도 장바구니의 상태를 유지할 수 있습니다.
  • 사용자 개인화: 사용자의 선호도나 방문 기록 등을 세션에 저장하여 맞춤형 콘텐츠를 제공할 수 있습니다.

세션과 쿠키의 차이점:

  • 세션은 서버에 데이터를 저장하며, 쿠키는 클라이언트(브라우저)에 데이터를 저장합니다.
  • 세션은 보안이 더 뛰어나며, 서버에서 데이터를 관리하므로 클라이언트에 중요한 정보를 저장하지 않습니다.
  • 쿠키는 클라이언트 측에서 수정할 수 있지만, 세션은 서버 측에서 관리되어 더 안전하게 데이터를 저장할 수 있습니다.

세션의 단점:

  • 서버 리소스: 서버에 세션 데이터를 저장하기 때문에, 서버의 리소스를 소비할 수 있습니다.
  • 스케일링 문제: 세션 데이터를 여러 서버에 분산시키는 것이 복잡할 수 있어, 로드 밸런서와 세션 스토리지를 적절히 설정해야 할 수 있습니다.

이러한 이유로 세션은 웹 애플리케이션에서 사용자 상태를 관리하는 중요한 도구로 사용됩니다.
 

세션과 JWT 비교

특성세션 (Session)JWT (JSON Web Token)
저장 위치서버 측 (세션 ID는 클라이언트 쿠키에 저장)클라이언트 측 (쿠키, 로컬 스토리지 등)
상태 관리서버에서 상태 관리클라이언트에서 상태 관리 (상태 비저장)
보안서버에서 데이터를 보호, 클라이언트에 최소한의 정보만 저장클라이언트에 정보가 저장되므로 보안에 취약할 수 있음
서버 리소스 사용서버에 세션 정보 저장 (리소스 소모)서버 리소스를 절약, 토큰을 클라이언트에서 관리
스케일링세션 스토리지를 여러 서버에 분배해야 함서버 간 세션 공유 필요 없음, 확장 용이
만료 및 갱신세션 만료 시 서버에서 상태 삭제토큰 자체에 만료 시간이 있음, 만료 후 갱신 필요

 
 
 

1. Web.xml에서 설정

JEUS에서 실행되는 웹 애플리케이션의 web.xml 파일에서 session-timeout 값을 설정할 수 있습니다.

<web-app>
    <session-config>
        <session-timeout>30</session-timeout>  <!-- 단위: 분 -->
    </session-config>
</web-app>
 

위 설정은 사용자가 30분 동안 아무런 활동이 없으면 세션을 만료시킵니다.
 

2. JEUS 관리 콘솔에서 설정

JEUS 관리 콘솔에서 세션 타임아웃을 변경할 수도 있습니다.
 
JEUS 8 버전 기준

  1. JEUS Admin Console 접속
  2. Servers > Engine > Session Config
  3. Session Timeout 설정 변경 - Defalut 는 30
  4. 저장 후 서버 재시작
Jeus Webadmin - Session Config

 
 

3. JEUS 설정 파일에서 변경

JEUS의 jeus-web.xml에서 세션 타임아웃을 설정할 수도 있습니다.

<jeus-web-app>
    <session-config>
        <session-timeout>20</session-timeout>  <!-- 20분 설정 -->
    </session-config>
</jeus-web-app>

 
 

4. 프로그램 코드에서 동적으로 설정

서블릿 코드에서 HttpSession 객체를 사용하여 세션 타임아웃을 설정할 수도 있습니다.

HttpSession session = request.getSession();
session.setMaxInactiveInterval(1800); // 30분 (초 단위)

 

Node.js (Express.js)에 세션 설정

app.js 또는 server.js 파일에서 세션을 설정하는 방법은 다음과 같습니다:

const express = require('express');
const session = require('express-session');

const app = express();

// 세션 미들웨어 설정
app.use(session({
  secret: 'your-secret-key',      // 세션 암호화를 위한 비밀 키 (강력하고 고유한 값으로 변경)
  resave: false,                  // 세션이 수정되지 않으면 저장하지 않도록 설정
  saveUninitialized: true,        // 초기화되지 않은 세션도 저장
  cookie: { secure: false }       // HTTPS 환경에서는 true로 설정 (HTTP에서는 false)
}));

// 세션 데이터 설정
app.get('/set-session', (req, res) => {
  req.session.username = 'user123'; // 세션에 데이터 설정
  res.send('세션 데이터가 설정되었습니다.');
});

// 세션 데이터 가져오기
app.get('/get-session', (req, res) => {
  if (req.session.username) {
    res.send(`세션 데이터: ${req.session.username}`);
  } else {
    res.send('세션 데이터가 없습니다.');
  }
});

// 세션 삭제
app.get('/destroy-session', (req, res) => {
  req.session.destroy((err) => {
    if (err) {
      return res.send('세션 삭제 중 오류가 발생했습니다.');
    }
    res.send('세션이 삭제되었습니다.');
  });
});

// 서버 시작
app.listen(3000, () => {
  console.log('서버가 3000번 포트에서 실행 중입니다.');
});