꾸물꾸물 졔의 개발공부

[Springboot] JWT(2)_refresh 토큰 redis 저장 본문

SPRING

[Springboot] JWT(2)_refresh 토큰 redis 저장

체제 2022. 8. 16. 17:23

이전 포스팅에서 로그인 요청한 사용자에게 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일이 지나면 자동 삭제