Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발자공부일기

express-session 본문

TIL(Today I Learned)

express-session

JavaCPP 2024. 11. 26. 21:32

express-session은 Express.js 애플리케이션에서 세션을 관리하기 위한 미들웨어입니다. 세션은 사용자가 웹사이트에 접속한 후, 서버와 사용자 간에 상태 정보를 유지할 수 있게 해줍니다. 예를 들어, 로그인 상태나 장바구니 정보를 저장하는 데 유용합니다.

주요 개념

  1. 세션 (Session): 서버 측에서 클라이언트와 관련된 정보를 저장합니다. 각 클라이언트는 고유한 세션 ID를 가지고 있으며, 이 ID는 쿠키로 클라이언트 측에 저장됩니다.
  2. 세션 ID: 클라이언트와 서버 간의 세션을 식별하는 고유한 값입니다.
  3. 세션 데이터: 사용자의 세션에 저장되는 실제 데이터입니다. 예를 들어, 로그인한 사용자 정보나 사용자의 활동 기록이 포함될 수 있습니다.

기본 사용법

  1. 설치 먼저 express-session을 설치합니다:
npm install express-session

미들웨어 설정 express-session을 Express 앱에 추가하려면 다음과 같이 설정합니다:

 

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

const app = express();

// 세션 미들웨어 설정
app.use(session({
  secret: 'mySecretKey',       // 세션을 암호화하는 데 사용할 비밀 키
  resave: false,               // 세션을 매 요청마다 다시 저장할지 여부
  saveUninitialized: true,     // 초기화되지 않은 세션도 저장할지 여부
  cookie: { secure: false }    // HTTPS 환경에서 true로 설정 (개발 환경에서는 false)
}));

// 라우트 설정
app.get('/', (req, res) => {
  if (req.session.views) {
    req.session.views++
    res.send(`<p>Views: ${req.session.views}</p>`)
  } else {
    req.session.views = 1
    res.send('Welcome to the session demo. Refresh to track views.')
  }
});

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

주요 옵션

  • secret: 세션을 암호화할 때 사용할 비밀 키입니다. 이 키는 외부에 노출되지 않도록 주의해야 합니다.
  • resave: 세션을 매 요청마다 다시 저장할지 여부를 결정합니다. false로 설정하면 세션 데이터가 수정되지 않은 경우 저장하지 않습니다.
  • saveUninitialized: 초기화되지 않은 세션을 저장할지 여부입니다. true로 설정하면 세션 데이터가 설정되지 않은 상태라도 세션이 저장됩니다.
  • cookie: 세션 쿠키의 설정을 제어합니다. 예를 들어, secure: true는 HTTPS 연결에서만 세션 쿠키를 전송하도록 합니다.

세션 사용 예시

세션을 사용하여 로그인 상태를 관리할 수 있습니다. 로그인 처리 후 세션에 사용자 정보를 저장하고, 이를 다른 라우트에서 참조할 수 있습니다.

app.post('/login', (req, res) => {
  // 로그인 로직
  req.session.user = { username: 'example' };  // 세션에 사용자 정보 저장
  res.send('Logged in');
});

app.get('/profile', (req, res) => {
  if (req.session.user) {
    res.send(`Hello, ${req.session.user.username}`);
  } else {
    res.send('Not logged in');
  }
});

세션 종료

세션을 종료하려면 req.session.destroy()를 사용합니다. 이 메서드는 세션 데이터를 삭제하고 세션을 종료합니다.

app.get('/logout', (req, res) => {
  req.session.destroy((err) => {
    if (err) {
      return res.send('Error while logging out');
    }
    res.send('Logged out');
  });
});

express-session은 서버 측에 세션 정보를 저장하므로, 데이터를 클라이언트에 저장하지 않고 보안이 중요한 애플리케이션에서 유용합니다. 세션 데이터를 데이터베이스에 저장하거나, Redis와 같은 외부 스토리지에 저장할 수도 있습니다.

 
 

 

 

express-session과 JWT (JSON Web Token)는 모두 웹 애플리케이션에서 사용자 인증을 관리하는 데 사용되지만, 그 방식은 다릅니다. 각각의 특징을 비교해보겠습니다.

1. 세션 기반 인증 (express-session)

express-session은 서버 측에 세션 데이터를 저장하여 사용자의 인증 상태를 유지하는 방식입니다.

특징:

  • 서버에 저장된 세션: 사용자에 대한 인증 정보를 서버 측에서 관리합니다. 사용자는 세션 ID를 클라이언트에 저장하고, 서버는 이를 기반으로 세션 데이터를 찾아 인증을 처리합니다.
  • 세션 ID: 클라이언트는 서버로부터 받은 세션 ID를 쿠키에 저장하고, 이후 요청 시 해당 세션 ID를 함께 보냅니다.
  • 서버 상태 유지: 서버는 각 사용자에 대해 세션 상태를 저장하고 관리합니다. 이는 메모리나 데이터베이스에 세션 데이터를 저장할 수 있습니다.
  • 세션 데이터 관리: 서버에서 세션 데이터가 유지되므로, 세션을 종료하거나 갱신하는 것이 서버 측에서 관리됩니다.

장점:

  • 보안: 세션 데이터가 서버에 저장되므로 민감한 정보가 클라이언트에 노출되지 않습니다.
  • 세션 종료 용이: 서버에서 세션을 종료하면 즉시 로그아웃이 됩니다.

단점:

  • 서버 부하: 서버는 모든 사용자에 대한 세션 정보를 저장하고 관리해야 하므로, 대규모 애플리케이션에서는 서버에 부담이 될 수 있습니다.
  • 스케일링 어려움: 서버를 확장하려면 세션 정보를 여러 서버 간에 공유하거나, Redis 같은 외부 저장소를 사용해야 할 수 있습니다.

2. 토큰 기반 인증 (JWT)

JWT는 클라이언트 측에서 인증 정보를 저장하고 관리하는 방식입니다. 사용자는 인증 후 서버로부터 JWT를 받고, 이를 클라이언트(보통 쿠키나 로컬 스토리지)에 저장하여 인증 정보를 관리합니다.

특징:

  • 토큰 기반: 서버는 인증된 사용자에게 JWT를 발급합니다. 이 토큰은 클라이언트 측에서 저장되어, 이후 요청 시마다 서버로 보내져 사용자를 인증합니다.
  • 자체 포함형 토큰: JWT는 자체적으로 필요한 인증 정보를 담고 있는 JSON 객체입니다. 서버는 토큰을 검증하는 것만으로 사용자를 인증할 수 있습니다.
  • 무상태성: JWT는 서버에서 상태를 유지하지 않으며, 모든 정보가 토큰 안에 포함되어 있기 때문에 서버는 별도의 세션 정보를 저장할 필요가 없습니다.

장점:

  • 서버 부하 감소: 세션 데이터를 서버에서 관리하지 않으므로 서버에 부하가 적습니다.
  • 확장성: 서버가 여러 대일 때도 중앙에서 세션 정보를 관리할 필요 없이, JWT 토큰만으로 인증을 처리할 수 있습니다.
  • RESTful API에 적합: 무상태 방식으로 RESTful API와 잘 맞습니다.

단점:

  • 보안: JWT는 기본적으로 암호화되지 않으므로 민감한 정보를 포함하면 안 됩니다. 토큰이 탈취될 경우, 해당 토큰을 가진 사람이 인증된 사용자로 활동할 수 있습니다. (HTTPS를 사용하는 것이 필수적입니다.)
  • 만료 처리: 토큰의 만료 시간이 지난 후 새 토큰을 발급받지 않으면 사용자가 로그아웃 상태가 됩니다. 세션과 달리 서버에서 상태를 추적할 수 없기 때문에 만료된 토큰을 관리하는 것이 어렵습니다.

비교


특징 express-session JWT (JSON Web Token)
저장 위치 서버에 세션 데이터 저장 클라이언트(보통 쿠키나 로컬 스토리지)에 저장
상태 상태를 서버에서 관리 (상태 저장) 상태를 서버에서 관리하지 않음 (무상태)
확장성 서버 간 세션 정보 공유 필요 쉽게 확장 가능, 서버 간 상태 공유 불필요
보안 서버 측 세션 데이터 관리로 보안성 높음 민감한 정보가 노출되지 않도록 암호화 필요
세션 만료 처리 서버에서 세션 만료 및 갱신 관리 클라이언트 측에서 토큰 만료 처리
장점 보안이 뛰어나고, 서버에서 세션을 쉽게 관리 서버 부하가 적고, RESTful API에 적합
단점 서버에 세션 상태를 저장해야 하므로 서버 부하 보안에 취약하고, 만료된 토큰 처리 어려움

언제 어느 방식을 선택할까?

  • express-session을 사용하는 경우:
    • 서버에서 사용자 상태를 관리해야 할 경우
    • 보안이 중요하고, 세션 데이터를 서버 측에서 안전하게 관리하려는 경우
    • 주로 서버 내에서 상태를 유지해야 하는 애플리케이션 (예: 전통적인 웹 애플리케이션)
  • JWT를 사용하는 경우:
    • 분산된 시스템 또는 여러 서버가 있는 경우
    • 상태를 유지하지 않고, 클라이언트가 인증 정보를 관리하도록 하려는 경우
    • 주로 API 기반의 애플리케이션 (예: 모바일 애플리케이션, SPA 등)

각 방식은 사용 목적과 시스템의 요구 사항에 따라 선택하는 것이 중요합니다.

'TIL(Today I Learned)' 카테고리의 다른 글

Prisma Transaction  (0) 2024.11.27
OSI 7계층  (0) 2024.11.26
Prisma  (0) 2024.11.25
RDBS, MySQL  (0) 2024.11.22
AWS배포하기 프로세스가 종료되지 않는 문제  (0) 2024.11.21