48 lines
1.5 KiB
Java
48 lines
1.5 KiB
Java
package com.kamco.cd.kamcoback.auth;
|
|
|
|
import java.time.Duration;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
|
import org.springframework.data.redis.core.ValueOperations;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
/** redis token handler */
|
|
@Service
|
|
@RequiredArgsConstructor
|
|
public class RefreshTokenService {
|
|
|
|
private final StringRedisTemplate redisTemplate;
|
|
private static final String PREFIX = "RT:";
|
|
|
|
/**
|
|
* Refresh Token 저장
|
|
*
|
|
* @param username 사용자 식별값 (보통 username or userId)
|
|
* @param refreshToken 발급된 Refresh Token
|
|
* @param ttlMillis 토큰 만료 시간 (밀리초 단위)
|
|
*/
|
|
public void save(String username, String refreshToken, long ttlMillis) {
|
|
ValueOperations<String, String> ops = redisTemplate.opsForValue();
|
|
ops.set(PREFIX + username, refreshToken, Duration.ofMillis(ttlMillis));
|
|
}
|
|
|
|
/**
|
|
* Refresh Token 검증
|
|
*
|
|
* <p>1. Redis에 저장된 값 조회 2. 클라이언트가 보낸 refreshToken과 비교 3. 동일하면 true
|
|
*/
|
|
public boolean validate(String username, String refreshToken) {
|
|
String stored = redisTemplate.opsForValue().get(PREFIX + username);
|
|
return stored != null && stored.equals(refreshToken);
|
|
}
|
|
|
|
/**
|
|
* Refresh Token 삭제
|
|
*
|
|
* <p>로그아웃 시 호출 Redis에서 해당 사용자 토큰 제거
|
|
*/
|
|
public void delete(String username) {
|
|
redisTemplate.delete(PREFIX + username);
|
|
}
|
|
}
|