토큰 제한시간은 30분
만료시간 10분 이내에 재발급 하면 토큰이 재생성 되는 방식이다.
만료시간 이전에 토큰을 발급하면 바뀌지 않은 기존의 토큰이 발급된다.
위 내용을 예시로 진행할 예정이다.
OS : Windows 10
Redis : docker, P3X Redis UI
Java 14
redis 위주의 코드를 적을 계획이다.
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public LettuceConnectionFactory lettuceConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}
@Bean
public RedisTemplate redisTemplate() {
RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(lettuceConnectionFactory());
return redisTemplate;
}
}
.yml 파일에 redis에 대한 접속 정보를 입력해줬다.
본 내용에서는 String 저장 방식을 활용하고 있다.
1. redis에 토큰이 있나?
String tokenKey = "원하는 키 이름";
String tokenExpireDate = "원하는 키 이름";
if (Boolean.TRUE.equals(redisTemplate.hasKey(tokenKey)) &&
Boolean.TRUE.equals(redisTemplate.hasKey(tokenExpireDate)))
토큰 제한시간은 30분
만료시간 10분 이내에 재발급을 해야하기 때문에
2개의 키를 사용하였다. (토큰, 토큰 발급 시간)
1.1. 토큰이 없는가?
redisTemplate.opsForValue()
.set(tokenKey, tokenService().getTokenNumber());
redisTemplate.opsForValue()
.set(tokenExpireDate, tokenService().getTokenExpirationDate().toString());
redis에 키 값이 없을 경우
tokenService() 라는 메서드를 실행 후 토큰을 발급하고
redis에 토큰과 날짜를 등록한다.
* tokenService() 는 토큰을 발급하는 메서드이다.
2. diff = 현재시간 - 토큰시간
tokenExpirationDate
= redisTemplate.opsForValue().get(tokenExpireDate);
assert tokenExpirationDate != null;
long minutes = ChronoUnit
.MINUTES.between(LocalDateTime.now(),
LocalDateTime.parse(tokenExpirationDate,
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")));
if (minutes < 10) {
redisTemplate.opsForValue()
.set(tokenKey, tokenService().getTokenNumber());
redisTemplate.opsForValue()
.set(tokenExpireDate, tokenService().getTokenExpirationDate().toString());
}
현재 시간과 토큰 시간을 between하여
10분 이내면
토큰을 새로 발급하여 redis에 set한다.
3. API 결과 리턴
각자 원하는 곳에
redisTemplate.opsForValue().get(key)
명령어를 활용하여
키를 입력하고 API 결과를 리턴하면 된다.