💡 추석이나 설 명절 시즌에 열리는 코레일의 추석 티켓 예매를 떠올려보면, 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');
}
// 대기열 로직...
});
JWT(JSON Web Token)와 같은 토큰 방식은 클라이언트 측에서 관리되며, 서버에서 발행된 후 일정 시간 동안 유효한 상태를 유지한다. 대기열 시스템에서 사용자가 대기 중에 토큰이 만료되면 재인증이 필요하다.
대기열 시스템에서의 토큰 만료 처리는 다음과 같은 방법으로 이루어진다:
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) => {
// 대기열 로직...
});
대기열 시스템을 설계할 때는 사용자의 세션 또는 토큰이 만료될 때 어떻게 처리할지를 정해야 하는데, 방법은 아래처럼 여러가지 방법이 있다!