Project/์‹นํ‹”์›€

[์‹นํ‹”์›€] ์ˆ˜์ • ์ค‘

ํ•œ33 2024. 11. 17. 17:28

๐Ÿ’ก ๋ชฉํ‘œ

๊ธฐ์กด์— ํ•™์Šตํ–ˆ๋˜ refresh token ์„ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ƒ์Šน์‹œํ‚ค๊ณ  ๋ณด์•ˆ๋„ ์ฑ™๊ธฐ๋ ค๊ณ  ํ•œ๋‹ค.

 

https://hanstory33.tistory.com/238

 

[CS] ACCESS ํ† ํฐ๊ณผ REFRESH ํ† ํฐ

๐Ÿ’ก Refresh ํ† ํฐ์ด ๋ญ์—์š” Access ํ† ํฐ๊ณผ ๋น„๊ตํ•ด์„œ ์•Œ์•„๋ด…์‹œ๋‹ค.๊ตฌ๋ถ„์•ก์„ธ์Šค ํ† ํฐ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์—ญํ• API ํ˜ธ์ถœ ์‹œ ์ธ์ฆ์•ก์„ธ์Šค ํ† ํฐ ์žฌ๋ฐœ๊ธ‰์ˆ˜๋ช…์งง์Œ ( ๋ช‡ ๋ถ„ ~ ๋ช‡ ์‹œ๊ฐ„ )๊น€ ( ๋ฉฐ์น  ~ ์ˆ˜๊ฐœ์›” )์‚ฌ์šฉ ์œ„์น˜๋ชจ๋“ 

hanstory33.tistory.com

 

์œ„ ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๊ฐœ๋…์„ ๊ณต๋ถ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ์ ์šฉ ๋“ค์–ด๊ฐ€๋ณด๋„๋ก ํ–ˆ๋‹ค.

 

๐Ÿ’ก ์ฝ”๋“œ ์ ์šฉ

1. ๊ธฐ์กด createToken ๋ฉ”์„œ๋“œ๊ฐ€ Access Token ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ์ธ๋ฐ, ์ด๋ฅผ createAccessToken ์œผ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์ฃผ๊ณ , ์ถ”๊ฐ€๋กœ Refresh Token ์„ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

 

JwtUtil

    // Refresh Token ์ƒ์„ฑ
    public String createRefreshToken(Long userId) {
        Date date = new Date();

        String refreshToken =  BEARER_PREFIX +
                Jwts.builder()
                        .setSubject(String.valueOf(userId))
                        .setExpiration(new Date(date.getTime() + TOKEN_TIME))
                        .setIssuedAt(date) // ๋ฐœ๊ธ‰์ผ
                        .signWith(key, signatureAlgorithm)
                        .compact();

        redisUserService.saveRefreshToken(userId.toString(), refreshToken, REFRESH_TOKEN_TIME);
        return refreshToken;
    }

 

refreshToken ์ด userId ์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ ์ฑ„ ์ƒ์„ฑ์ด ๋˜๊ณ , ์ƒ์„ฑ์ด ๋˜๋ฉด ์ง€์ •ํ•œ TTL ์‹œ๊ฐ„๊ณผ ํ•จ๊ป˜ redis ์— ์ €์žฅ์ด ๋œ๋‹ค.

 

AuthService

String accessToken = jwtUtil.createAccessToken(user.getId(), user.getEmail(), user.getUserName(), user.getUserRole());
String refreshToken = jwtUtil.createRefreshToken(user.getId());

log.info("๋กœ๊ทธ์ธ ์„ฑ๊ณต");
log.info(accessToken);
log.info(refreshToken);

 

๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ ๊ธฐ์กด์— accessToken ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ refreshToken ๋„ ๋ฐœ๊ธ‰๋˜๋„๋ก ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

 

RedisUserService

@Service
@RequiredArgsConstructor
public class RedisUserService {

    private final RedisTemplate<String, String> redisTemplate;

    // Redis ์— Refresh Token ์ €์žฅ
    public void saveRefreshToken(String userId, String refreshToken, long ttlInMillis) {
        String key = "refresh_Token : " + userId;
        redisTemplate.opsForValue().set(key, refreshToken, ttlInMillis, TimeUnit.MILLISECONDS);
    }

    // Refresh Token ์กฐํšŒ
    public String getRefreshToken(String userId) {
        String key = "refresh_Token : " + userId;
        return redisTemplate.opsForValue().get(key);
    }
}

 

RedisUserService ๋ฅผ ๋งŒ๋“ค์–ด์„œ, refreshToken ์ด ๋ฐœ๊ธ‰๋˜์—ˆ์„ ๋•Œ redis ์— ์ €์žฅ์ด ๋˜๊ณ , ๋กœ๊ทธ์•„์›ƒ ๋˜์—ˆ์„ ๋• redis ์—์„œ ์‚ญ์ œ๋ฅผ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก Service Class ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.