세션(Session)과 토큰(Token)

naruddl·2024년 9월 22일

💡 추석이나 설 명절 시즌에 열리는 코레일의 추석 티켓 예매를 떠올려보면, 3분의 유효 시간이 지나면 자동으로 메인 페이지로 돌아가는 상황을 경험했을 것이다.
우리 프로젝트에서도 이러한 상황에서 어떻게 대기열을 효율적으로 처리하고, 세션 만료 시 적절히 대응할 수 있을지 고민했다.
이번 글에서는 세션 관리와 토큰 만료 처리를 통해 대기열 시스템을 어떻게 구현할 수 있을지에 대해 공부한 내용을 정리해보려고 한다.

1. 세션과 토큰의 역할

  • 세션(Session)토큰(Token)은 웹 애플리케이션에서 사용자를 인증하고 그들의 상태를 유지하는 데 중요한 역할을 한다. 두 가지 개념을 간단히 설명하자면
  • 세션: 서버에서 사용자 정보를 관리하며, 사용자가 로그인한 상태를 일정 시간 동안 유지하는 방식이다. 사용자가 웹사이트를 방문하거나 로그인하면 세션이 생성되고, 일정 시간이 지나면 세션이 만료된다.
  • 토큰: 클라이언트 측에서 관리되며, 특히 JWT(JSON Web Token) 방식은 사용자가 서버와의 상호작용 없이도 인증 상태를 유지할 수 있게 한다. JWT는 사용자가 로그인을 하면 발행되고, 일정 시간 후 만료된다.

2. 대기열에서 세션 및 토큰 만료가 중요한 이유

핫딜 이벤트에서 사용자들이 몰리면, 서버는 대기열 시스템을 통해 순차적으로 사용자를 처리한다. 대기열에 들어간 사용자는 일정 시간이 지나기 전에 자신의 차례가 되어야 상품을 구매할 수 있다. 하지만 대기 중 사용자의 세션이 만료되거나 토큰이 만료되면, 더 이상 인증되지 않은 상태가 되기 때문에 대기열에서 사용자를 처리할 수 없다.

이런 상황에서, 사용자에게 유효 시간 내에 응답을 요구하고 그렇지 않으면 자동으로 대기열에서 빠져나가게 하는 처리가 필요하다.

3. 세션 만료 처리

세션 만료는 서버 측에서 관리되며, 사용자가 대기열에 진입하면 서버는 해당 사용자에게 세션을 할당하고 세션 만료 시간을 설정한다. 이 세션은 사용자가 서버와 상호작용하는 동안 유지되며, 만료되기 전까지 유효한 상태를 유지한다.

대기열 시스템에서의 세션 만료 처리는 다음과 같은 방식으로 이루어진다:

  1. 세션 타이머 설정: 사용자가 대기열에 들어가면 세션에 타이머를 설정한다. 이 타이머는 일정 시간이 지나면 세션을 만료시키며, 예를 들어 3분 동안 유지되도록 설정할 수 있다.
  2. 세션 만료 시 리다이렉트: 세션 타이머가 만료되면 사용자는 대기열에서 자동으로 빠져나가며, 서버는 사용자를 메인 페이지로 리다이렉트한다.
  3. 세션 연장: 사용자가 대기 중에 상호작용을 할 경우, 세션이 자동으로 연장되도록 처리할 수 있다. 이를 통해 사용자가 대기 중 세션이 만료되지 않도록 관리한다.
app.use(session({
  secret: 'mySecret',
  resave: false,
  saveUninitialized: true,
  cookie: { maxAge: 180000 } // 세션 유효 시간: 3분
}));

app.get('/queue', (req, res) => {
  if (!req.session.user) {
    return res.redirect('/login');
  }
  
  // 대기열 로직...
});

4. 토큰 만료 처리

JWT(JSON Web Token)와 같은 토큰 방식은 클라이언트 측에서 관리되며, 서버에서 발행된 후 일정 시간 동안 유효한 상태를 유지한다. 대기열 시스템에서 사용자가 대기 중에 토큰이 만료되면 재인증이 필요하다.

대기열 시스템에서의 토큰 만료 처리는 다음과 같은 방법으로 이루어진다:

  1. 토큰 발행 시 만료 시간 설정: JWT는 발행될 때 만료 시간을 포함하여 발행된다. 예를 들어, 15분짜리 토큰이 발행되었다면 15분 후에는 해당 토큰이 만료되며 더 이상 유효하지 않다.
  2. 토큰 만료 시 리다이렉트: 토큰이 만료된 경우, 클라이언트는 자동으로 메인 페이지나 로그인 페이지로 리다이렉트되며, 사용자는 재로그인하거나 대기열에 다시 진입해야 한다.
  3. 토큰 갱신: 토큰 만료 시간이 다가오면, 클라이언트가 서버에 갱신 요청을 보내 토큰을 연장할 수 있다. 이를 통해 사용자가 대기열에서 오랜 시간 대기할 때도 인증 상태를 유지할 수 있다.
const jwt = require('jsonwebtoken');

// JWT 발행
const token = jwt.sign({ userId: user.id }, 'mySecretKey', { expiresIn: '15m' });

// JWT 검증 미들웨어
const verifyToken = (req, res, next) => {
  const token = req.headers['authorization'];
  if (!token) return res.redirect('/login');
  
  jwt.verify(token, 'mySecretKey', (err, decoded) => {
    if (err) return res.redirect('/login');
    req.user = decoded;
    next();
  });
};

// 대기열 접근 시 토큰 검증
app.get('/queue', verifyToken, (req, res) => {
  // 대기열 로직...
});

5. 대기열 시스템에서의 유효 시간 관리 전략

대기열 시스템을 설계할 때는 사용자의 세션 또는 토큰이 만료될 때 어떻게 처리할지를 정해야 하는데, 방법은 아래처럼 여러가지 방법이 있다!

  • 짧은 세션/토큰 시간 설정: 대기열에서 오래 머무를 경우 시스템 리소스가 낭비될 수 있으므로 짧은 세션 또는 토큰 시간을 설정해 사용자가 빠르게 처리될 수 있도록 한다.
  • 자동 연장 기능: 대기 중에 상호작용이 발생할 때마다 세션 또는 토큰 시간을 자동으로 연장해 사용자의 인증 상태를 유지한다.
  • 리다이렉트 처리: 세션 또는 토큰이 만료되면 사용자를 메인 페이지로 리다이렉트하여 재로그인 또는 대기열 재진입을 유도한다.
profile
아자!아자! 개발자!

0개의 댓글