티스토리 뷰

개발

Redis를 사용한 JWT 갱신 토큰 관리방법

마왕슬라임 2023. 7. 4. 00:05
728x90

JWT (JSON Web Tokens) 인증 시스템에서 갱신 토큰을 관리하는 일반적인 방법 중 하나는 Redis와 같은 메모리 내 데이터베이스를 사용하는 것입니다. Redis는 키-값 쌍을 저장하고, 빠른 읽기/쓰기 성능을 제공하며, 데이터의 만료 시간을 설정하는 기능을 제공합니다. 이러한 특징들은 갱신 토큰의 관리에 매우 적합합니다.

Redis를 사용하여 갱신 토큰을 관리하면, 갱신 토큰을 즉시 무효화하거나, 사용자 계정이 삭제되거나 정지된 경우 모든 갱신 토큰을 무효화하는 등의 추가적인 유연성을 얻을 수 있습니다. 또한, Redis는 메모리 내 데이터베이스이기 때문에, 디스크 기반 데이터베이스에 비해 훨씬 빠른 읽기/쓰기 성능을 제공합니다.

다음은 Node.js 및 Redis를 사용하여 JWT 갱신 토큰을 관리하는 간단한 예제입니다.

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

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 = '123'; // 사용자 ID

  const accessToken = jwt.sign({ userId }, 'access_secret', { expiresIn: '15m' });
  const refreshToken = jwt.sign({ userId }, 'refresh_secret', { expiresIn: '7d' });

  // Redis에 갱신 토큰 저장
  redisClient.set(userId, refreshToken);

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

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

  try {
    const { userId } = jwt.verify(refreshToken, 'refresh_secret');

    redisClient.get(userId, (err, token) => {
      if (err || token !== refreshToken) {
        res.sendStatus(403); // Forbidden
      } else {
        const newAccessToken = jwt.sign({ userId }, 'access_secret', { expiresIn: '15m' });
        res.json({ accessToken: newAccessToken });
      }
    });
  } catch {
    res.sendStatus(403); // Forbidden
  }
});

app.listen(3000);

이 코드에서 '/login' 엔드포인트는 액세스 토큰과 갱신 토큰을 생성하고, Redis에 갱신 토큰을 저장합니다. '/refresh' 엔드포인트는 제공된 갱신 토큰을 검증하고, Redis에 저장된 토큰과 일치하는지 확인한 후 새로운 액세스 토큰을 생성합니다.

이 예제에서는 간단하게 하기 위해 사용자 인증을 건너뛰었지만, 실제 애플리케이션에서는 사용자 이름과 비밀번호를 검증하는 인증 로직이 필요합니다. 또한, Redis에 저장된 갱신 토큰을 정기적으로 삭제하는 등의 로직도 필요할 수 있습니다.

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