꾸물꾸물 졔의 개발공부
[Springboot] JWT(2)_refresh 토큰 redis 저장 본문
이전 포스팅에서 로그인 요청한 사용자에게 access , refresh 토큰을 발급하였다.
사용자는 AccessToken 을 가지고 있다가, 유효기간이 만료되면 재발급 요청을 한다.
그때 refreshToken 을 사용하게 되는데, Refresh Token은 로그인 성공시 발급하면서 저장소에 저장하여 관리된다.
저장소를 Redis 로 하여 저장해보자.
+ redis를 설치하여, 서버에 올려두었고 redis cli 를 통해서 접근하였다.
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
application.properties
#redis
spring.redis.host=`호스트번호`
spring.redis.port=6379
RedisConfig.java
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}
@Bean
public RedisTemplate<String, String> redisTemplate(){
// redisTemplate 에서 set, get,delete 사용
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
//redis-cli를 통해 데이터 조회 시, 알아볼 수 없는 형태로 출력되는 것을 방지
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
}
- application.properties 에 설정해놓은 host,post 값으로 redis 연결
- RedisTemplate 메서드를 bean 으로 등록 → Redis 서버에 명령어 수행 가능
RedisService.java
@Service
@RequiredArgsConstructor
public class RedisService {
private final RedisTemplate<String, String> redisTemplate;
public void setValues(String key, String data) {
ValueOperations<String, String> values= redisTemplate.opsForValue();
values.set(key,data);
}
public void setValues(String key, String data, Duration duration) {
ValueOperations<String, String> values= redisTemplate.opsForValue();
values.set(key,data,duration);
}
public String getValues(String key) {
ValueOperations<String, String> values= redisTemplate.opsForValue();
return values.get(key);
}
public void deleteValues(String key) {
redisTemplate.delete(key);
}
}
- RedisTemplate 을 사용하여, set / get / delete 메서드 생성
- set : key 값의 value 로 data 저장
- set ( Duration ) : set 에 저장기한 설정
→ 리프레시 토큰 유효기간 동안만 레디스에 저장, 유효기간 지나면 자동 삭제
- get : key 값의 value 불러오기
- delete : key 값의 value 삭제
JwtTokenUtil.java
public String createRefreshToken(String id) {
Long tokenInvalidTime = 1000L * 60 * 60 * 24 * 30; // 30일
String refreshToken = this.getToken(id, tokenInvalidTime);
redisService.setValues(id, refreshToken, Duration.ofMillis(tokenInvalidTime));
return refreshToken;
}
▶ refreshToken 생성 부분
1. 토큰의 유효기간을 30일로 설정
2. refresh Token 설정 ( getToken 함수는 이전 포스팅 참조 )
3. Redis 에 저장 { key : id값, value : refresh 토큰 , Duration : 유효기간(30일) }
→ 30일이 지나면 자동 삭제
'SPRING' 카테고리의 다른 글
[Springboot] JWT(4)_ JWT 필터를 통해 토큰 만료시간 / 토큰 유효성 예외 발생시키기 (0) | 2022.08.23 |
---|---|
[Springboot] JWT(3)_filter 적용 및 토큰 검사/인증 부여 (0) | 2022.08.23 |
[Springboot] JWT(1)_로그인, 토큰 발급하기 ( access + refresh ) (0) | 2022.08.16 |
[Springboot] 회원가입 이메일 인증하기 (네이버) (0) | 2022.08.06 |
[Spring] Spring Cache 란 ? 스프링캐시 (0) | 2022.07.31 |