Redis는 만료 시간이 되면 자동 삭제 처리
컨셉: 1억명 ← redis가 감당될지? →
클러스터링(여러 노드에 분산저장하여 부하 줄이기)
redis-server --cluster-enabled yes # 클러스터 모드를 활성화
# 버전에 따라 문법이 조금씩 다를 수 있음
spring:
redis:
cluster:
nodes:
- 127.0.0.1:7000
- 127.0.0.1:7001
- 127.0.0.1:7002
password: your_password # 필요시 비밀번호 설정
로그인 시(액세스/리프레쉬 토큰) 발급 + redis에 토큰 저장(리프레쉬토큰 말고 액세스토큰도 처리해야될지?)
로그아웃 시 기존 리프레쉬 토큰 만료 처리(어차피 재로그인 하면 새로 발급될텐데 만료처리 필요할지), 액세스 토큰 사용 못하게 처리
로그인 되있을 때 리프레쉬 만료 안되었을때 액세스 토큰 재발급 (리프레쉬 토큰을 요청값으로 전달 받음)
key - uuid / value - 리프레쉬토큰값
현재 JWT 토큰 생성 시 필요값 : 생성 시간, 만료 시간, 서명키(jwt 비밀키 발급받아 사용)
RedisConfig 수정
@Configuration
public class RedisConfig {
// @Configuration은 클래스 수준에서 Spring 설정을 나타냄
// @Bean은 메서드 수준에서 그 메서드가 반환하는 객체를 빈으로 등록
// 설정된 빈은 다른 컴포넌트에서 의존성 주입을 통해 사용
// RedisTemplate 빈 생성
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
// 키는 String으로 설정
template.setKeySerializer(new StringRedisSerializer());
// 값은 RefreshToken 객체로 설정
Jackson2JsonRedisSerializer<RefreshToken> serializer = new Jackson2JsonRedisSerializer<>(RefreshToken.class);
template.setValueSerializer(serializer); // Redis의 값을 RefreshToken 객체로 직렬화
// 해시 키와 값도 설정
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer); // 해시의 값을 RefreshToken 객체로 직렬화
return template;
}
}
redis 에 저장된 리프레쉬토큰 검증 후 새로운 액세스 토큰 발급