[์นํ์] ์์ ์ค
๐ก ๋ชฉํ
๊ธฐ์กด์ ํ์ตํ๋ 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 ๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค.