Project/์‹นํ‹”์›€

[์‹นํ‹”์›€] Refresh Token ๊ตฌํ˜„

ํ•œ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 ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

 

 

'Project > ์‹นํ‹”์›€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์‹นํ‹”์›€] 11/14 ๊ฐœ๋ฐœ์ผ์ง€ ์ฟ ํฐ ๋ฐœ๊ธ‰ ์‹œ ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ 2 : ๋น„๊ด€์  ๋ฝ, ๋ถ„์‚ฐ ๋ฝ ( Redisson ), Redis, Lua Script ์ ์šฉ ๋ฐ ์˜์‚ฌ๊ฒฐ์ •  (1) 2024.11.18
[์‹นํ‹”์›€] 11/13 ๊ฐœ๋ฐœ์ผ์ง€ ์ฟ ํฐ ๋ฐœ๊ธ‰ ์‹œ ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ 1 : ๋™์‹œ์„ฑ ๋ฌธ์ œ ๋ฐœ์ƒ ๋ฐ ๋‚™๊ด€์ , ๋น„๊ด€์ , ๋ถ„์‚ฐ ๋ฝ  (1) 2024.11.17
[์‹นํ‹”์›€] 11/08 ๊ฐœ๋ฐœ์ผ์ง€ ํšŒ์›๊ฐ€์ž…์‹œ ์ด๋ฉ”์ผ ์ธ์ฆ ๋ฐ›๊ธฐ 3 : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ๊ฐœ์„   (0) 2024.11.11
[์‹นํ‹”์›€] 11/07 ๊ฐœ๋ฐœ์ผ์ง€ ํšŒ์›๊ฐ€์ž…์‹œ ์ด๋ฉ”์ผ ์ธ์ฆ ๋ฐ›๊ธฐ 2 : ์ด๋ฉ”์ผ ์ธ์ฆ์ฝ”๋“œ ๊ฒ€์ฆ  (1) 2024.11.10
[์‹นํ‹”์›€] 11/07 ๊ฐœ๋ฐœ์ผ์ง€ ํšŒ์›๊ฐ€์ž…์‹œ ์ด๋ฉ”์ผ ์ธ์ฆ ๋ฐ›๊ธฐ 1 : ์ด๋ฉ”์ผ ์ธ์ฆ์ฝ”๋“œ ์ „์†ก  (0) 2024.11.10