Express 세션 옵션 상세 가이드: 세션 관리의 모든 것

Express 세션 옵션 상세 설명

Express에서 세션 관리 시 사용되는 주요 옵션과 그 동작 방식을 상세히 알아봅니다. 기본적으로 express-session 미들웨어에서 설정 가능한 옵션들로, 이들을 적절히 활용하면 효율적이고 안전한 세션 관리를 구현할 수 있습니다.


1. secret

  • 설명: 세션 데이터를 암호화하기 위한 키입니다.
  • 역할: 세션 ID의 무결성을 보호하고, 클라이언트가 세션 ID를 위조하지 못하도록 방지합니다.
  • 설정 예시:
    secret: 'mySuperSecretKey'
    
  • 추가 팁:
    • 보안 강화를 위해 랜덤 문자열 생성기를 사용하여 키를 생성하세요.
    • 다중 키 사용 시:
      secret: ['key1', 'key2', 'key3']
      

2. resave

  • 설명: 세션 데이터가 변경되지 않아도 요청마다 세션을 저장할지 여부를 설정합니다.
  • 옵션 값:
    • true: 세션이 항상 저장됩니다.
    • false: 세션이 변경된 경우에만 저장됩니다.
  • 권장 설정:
    • false로 설정하여 불필요한 저장소와의 통신을 방지하고 성능을 향상시킵니다.
  • 설정 예시:
    resave: false
    

3. saveUninitialized

  • 설명: 초기화되지 않은 세션(데이터가 없는 세션)을 저장할지 여부를 설정합니다.
  • 옵션 값:
    • true: 초기 세션도 저장합니다.
    • false: 데이터가 없는 세션은 저장하지 않습니다.
  • 권장 설정:
    • false로 설정하여 사용자가 동의하지 않은 상태에서 세션을 생성하지 않도록 합니다.
  • 설정 예시:
    saveUninitialized: false
    

  • 설명: 세션 쿠키의 속성을 설정하는 객체입니다.
  • 세부 옵션:
    1. secure:
      • HTTPS 환경에서만 쿠키를 전송하도록 설정합니다.
      • 설정:
        cookie: { secure: true }
        
    2. httpOnly:
      • 클라이언트 측 JavaScript로 쿠키를 접근하지 못하도록 방지합니다.
      • 설정:
        cookie: { httpOnly: true }
        
    3. maxAge:
      • 쿠키의 만료 시간을 밀리초 단위로 설정합니다.
      • 설정:
        cookie: { maxAge: 60000 } // 1분
        
    4. sameSite:
      • 쿠키의 사이트 간 요청 동작을 설정합니다.
        • Strict: 동일 사이트에서만 쿠키가 전송됩니다.
        • Lax: 일부 크로스 사이트 요청(GET)에서만 전송됩니다.
        • None: 모든 요청에 쿠키가 포함됩니다(HTTPS 필요).
      • 설정:
        cookie: { sameSite: 'strict' }
        
    5. path:
      • 쿠키가 전송되는 경로를 설정합니다.
      • 기본값은 /입니다.

자주 사용되는 기타 옵션

1. store

  • 설명: 세션 데이터를 저장할 저장소를 지정합니다.
  • 기본값: 메모리 저장소(비추천)
  • 추천 저장소:
    • Redis, MongoDB, MySQL 등.
  • 설정 예시:
    const RedisStore = require('connect-redis')(session);
    const redisClient = require('redis').createClient();
    
    app.use(
      session({
        store: new RedisStore({ client: redisClient }),
        secret: 'mySecretKey',
        resave: false,
        saveUninitialized: false,
      })
    );
    

2. rolling

  • 설명: 사용자의 요청이 있을 때마다 세션 쿠키의 만료 시간을 갱신할지 여부를 설정합니다.
  • 옵션 값:
    • true: 요청마다 쿠키의 만료 시간을 갱신합니다.
    • false: 고정된 만료 시간을 유지합니다.
  • 설정 예시:
    rolling: true
    

3. unset

  • 설명: 세션이 삭제될 때 req.session의 상태를 정의합니다.
  • 옵션 값:
    • 'destroy': 세션 삭제 시 req.sessionnull로 설정.
    • 'keep': 세션 데이터를 삭제하지만 객체는 유지.
  • 설정 예시:
    unset: 'destroy'
    

4. proxy

  • 설명: 서버가 프록시 뒤에 있는 경우 쿠키의 보안을 설정합니다.
  • 옵션 값:
    • true: secure 쿠키가 올바르게 동작하도록 설정.
  • 설정 예시:
    app.set('trust proxy', 1);
    

종합 설정 예시

const session = require('express-session');
const RedisStore = require('connect-redis')(session);
const redisClient = require('redis').createClient();

app.use(
  session({
    secret: 'mySuperSecretKey',
    resave: false,
    saveUninitialized: false,
    rolling: true,
    unset: 'destroy',
    store: new RedisStore({ client: redisClient }),
    cookie: {
      secure: process.env.NODE_ENV === 'production',
      httpOnly: true,
      maxAge: 60000,
      sameSite: 'strict',
    },
  })
);

요약

  • 필수 옵션: secret, cookie, store (프로덕션 환경에서는 반드시 설정 필요)
  • 유용한 추가 옵션: rolling, unset, proxy

Express 세션 옵션을 적절히 설정하면 보안과 성능을 극대화할 수 있습니다. 세부 설정에 따라 애플리케이션의 요구사항에 맞춘 최적화가 가능합니다.

Leave a comment