Redis를 통한 RefreshToken 관리, Redis를 통해 RefreshToken 구현하기
구글에 RefreshToken Redis를 검색하는 나오는 결과다.
항상 사람들은 RefreshToken을 Redis에 저장해야 한다고 말했다. 그런데 왜? RefreshToken을 Redis에 저장하냐고 물어보면 "그게 대중적인 방법이니까"라고 말하는 사람이 대부분일 것이다.
RefreshToken을 Redis에 저장하는 이유
1. TTL(Time-To-Live)
대부분의 사람들이 TTL 기능 때문에 Redis에 RefreshToken을 저장할 것이다.
Redis는 TTL 기능을 제공해, 데이터의 만료 시간을 설정할 수 있습니다.
redisTemplate.opsForValue().set(key, refreshToken, REFRESH_TOKEN_EXPIRATION, TimeUnit.SECONDS);
일정 시간이 지난 뒤에는 RefreshToken이 자동적으로 삭제되므로 보안성 측면에서 장점이 있다.
2. In-Memory
레지스터 - 캐시 - 메모리 - 디스크 순으로 속도가 빠른 것을 알 수 있다.
이때 Redis는 RAM(메모리)에 저장이 되고, 디스크에 저장되는 데이터베이스에 비해 속도 측면에서 장점이 있다.
"아니 그러면 Cache(캐시)에 저장하면 더 좋은거 아니야?"
- Cache는 어플리케이션이 재시작되거나 시스템이 다운되면 저장된 데이터가 삭제된다.
- Cache는 만료 설정을 해줄 수가 없다.
- Redis는 Cache에 비해 데이터 구조가 다양하다.(Hash, Set, String, Sorted, List)
3. OpsForValue
Redis를 사용해 보신 분이라면 "아 이거 좋지"라는 생각을 하실 수 있습니다.
OpsForValue란 Redis의 RedisTemplate 클래스에서 제공하는 메소드중 하나로, String 연산을 위한 연산자를 반환합니다. Set(값 설정), Get(값 조회), Increment(값 증가)등 다양한 연산을 할 수 있습니다.
redisTemplate.opsForValue().set(key, refreshToken, REFRESH_TOKEN_EXPIRATION, TimeUnit.SECONDS);
이렇게 redis에 (key, refreshToken) 형식으로 저장 한 뒤, key 값으로 조회 가능합니다.
redisTemplate.opsForValue().get(key);
파이썬의 Dictionary, 자바의 HashMap을 생각하시면 이해하기 쉽습니다.
4. 안정성
Redis는 디스크에 데이터를 저장할 수 있으므로 서버 재시작 또는 장애 발생 시에도 RefreshToken을 안전하게 보관할 수 있습니다. (인 메모리 방식이지만 디스크에 저장할 수 있다)