티스토리 뷰

728x90
728x90

JWT 갱신 토큰과 슬라이딩 세션은 사용자 인증에 널리 사용되는 두 가지 전략입니다. 이들을 결합하여 사용하면 더욱 강력한 보안 전략을 구성할 수 있습니다.

JWT 갱신 토큰: JWT 갱신 토큰은 보통 긴 유효 기간을 가지며, 이 토큰을 사용해 짧은 유효 기간을 가진 액세스 토큰을 새로 발급받을 수 있습니다. 이 방식은 갱신 토큰이 탈취되더라도 공격자가 지속적으로 시스템에 액세스하는 것을 막아줍니다. 갱신 토큰이 사용될 때마다 새 갱신 토큰이 발급되고, 이전 갱신 토큰은 무효화되므로, 갱신 토큰이 한 번 탈취되면 곧바로 무효화될 것입니다.

슬라이딩 세션: 슬라이딩 세션 전략에서는, 사용자가 활동을 할 때마다 세션의 유효 기간이 연장됩니다. 이렇게 하면 사용자가 계속 활동 중인 동안에는 로그아웃되지 않습니다. 반면, 사용자가 일정 기간 동안 활동이 없으면 자동으로 로그아웃됩니다.

JWT 갱신 토큰과 슬라이딩 세션 전략을 결합하여 사용하면, 사용자가 활동 중일 때는 계속 인증 상태를 유지하면서도, JWT의 특성을 이용해 보안을 강화할 수 있습니다.

다음은 이를 구현하는 Node.js 코드입니다. 이 코드에서는 JWT를 이용해 인증하고, Redis를 이용해 갱신 토큰을 관리하며, 슬라이딩 세션 전략을 적용합니다.

먼저, 필요한 모듈을 설치합니다:

npm install express jsonwebtoken redis
const express = require('express');
const jwt = require('jsonwebtoken');
const redis = require('redis');

const redisClient = redis.createClient();
const app = express();

app.use(express.json());

app.post('/login', (req, res) => {
  // 사용자 인증 로직
  const userId = 'user1'; // 임의로 설정한 사용자 ID
  const accessToken = jwt.sign({ userId }, 'access_secret', { expiresIn: '1m' }); // 1분 동안 유효한 액세스 토큰
  const refreshToken = jwt.sign({ userId }, 'refresh_secret', { expiresIn: '7d' }); // 7일 동안 유효한 갱신 토큰

  // Redis에 갱신 토큰 저장
  redisClient.set(userId, refreshToken, 'EX', 7 * 24 * 60 * 60); // 키 유효 기간 설정

  res.json({ accessToken, refreshToken });
});

app.post('/refresh', (req, res) => {
  const { refreshToken } = req.body;

  jwt.verify(refreshToken, 'refresh_secret', (err, user) => {
    if (err) return res.sendStatus(403);
    redisClient.get(user.userId, (err, token) => {
      if (err || token !== refreshToken) return res.sendStatus(403);

      const newAccessToken = jwt.sign({ userId: user.userId }, 'access_secret', { expiresIn: '1m' }); // 새 액세스 토큰 발급
      const newRefreshToken = jwt.sign({ userId: user.userId }, 'refresh_secret', { expiresIn: '7d' }); // 새 갱신 토큰 발급

      // Redis에 새 갱신 토큰 저장
      redisClient.set(user.userId, newRefreshToken, 'EX', 7 * 24 * 60 * 60); // 키 유효 기간 설정

      res.json({ accessToken: newAccessToken, refreshToken: newRefreshToken });
    });
  });
});

app.listen(3000);

이 코드에서는 '/login' 엔드포인트가 액세스 토큰과 갱신 토큰을 생성하고, Redis에 갱신 토큰을 저장합니다. 사용자가 '/refresh' 엔드포인트로 요청을 보내면, 갱신 토큰이 검증되고 새로운 토큰들이 발급됩니다.

여기서 갱신 토큰의 유효 기간이 '7d'로 설정되어 있지만, 이는 임의로 설정한 값입니다. 실제 애플리케이션에서는 이 값을 조정하여, 사용자의 활동 패턴, 보안 요구 사항 등에 따른 최적의 유효 기간을 설정해야 합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함