[개발] JWT Refresh token 만료기간 갱신steemCreated with Sketch.

in hive-101145 •  2 years ago 

안녕하세요 @realmankwon 입니다.

Refresh Token의 만료 기간을 주기적으로 갱신하는 방법은 다양하게 있지만, 일반적으로는 다음과 같이 구현할 수 있습니다.

Refresh Token 발급 시에 해당 Refresh Token의 만료 기간을 기록합니다.
주기적으로 Refresh Token을 검사하면서 만료 기간이 일정 기간 미만으로 남아있으면, 해당 Refresh Token을 갱신합니다.
Refresh Token을 갱신할 때는 새로운 Refresh Token을 발급하고, 이전에 사용한 Refresh Token은 더 이상 유효하지 않도록 만듭니다.
만료 기간이 남아있는 Refresh Token을 갱신할 때는 사용자가 로그인되어 있어야 합니다.
다음은 Node.js와 Express 프레임워크를 사용하여 Refresh Token의 만료 기간을 주기적으로 갱신하는 간단한 코드 예시입니다.

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();

// Refresh Token 발급 및 갱신 API
app.post('/auth/token/refresh', (req, res) => {
  const refreshToken = req.body.token;

  // Refresh Token을 검증
  jwt.verify(refreshToken, process.env.REFRESH_TOKEN_SECRET, (err, user) => {
    if (err) return res.sendStatus(403);

    // 만료 기간이 일정 기간 미만으로 남아있으면 Refresh Token을 갱신
    const currentTime = Math.floor(Date.now() / 1000);
    const refreshTokenExp = jwt.decode(refreshToken).exp;
    if (refreshTokenExp - currentTime < process.env.REFRESH_TOKEN_EXPIRATION_THRESHOLD) {
      // 이전 Refresh Token은 더 이상 유효하지 않도록 만듦
      // 실제로는 데이터베이스에서 해당 Refresh Token을 만료 상태로 설정하는 등의 처리가 필요
      expireRefreshToken(refreshToken);

      // 새로운 Refresh Token 발급
      const newRefreshToken = jwt.sign(user, process.env.REFRESH_TOKEN_SECRET, { expiresIn: '7d' });

      res.json({ refreshToken: newRefreshToken });
    } else {
      // Refresh Token이 유효하면 새로운 Refresh Token을 발급하지 않고 기존 Refresh Token을 반환
      res.json({ refreshToken });
    }
  });
});

app.listen(3000, () => console.log('Server started on port 3000'));

위 코드에서는 /auth/token/refresh API에서 Refresh Token을 검증하고 만료 기간이 일정 기간 미만으로 남아있으면 새로운 Refresh Token을 발급하여 반환합니다. Refresh Token이 만료될 때는 이전 Refresh Token을 더 이상 유효하지 않도록 만드는 expireRefreshToken() 함수를 호출하는 등의 추가 처리가 필요합니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!