반응형

왜 Redis를 사용하는가?

Redis는 key-value 쌍으로 데이터를 관리할 수 있는 데이터 스토리지이다.

데이터베이스라고 표현하지 않은 이유는 기본적으로 Redis는 In-Memory 로 데이터를 관리하므로, 저장된 데이터가 영속적이지 않기 때문이다.

Redis는 Remote Dictionary Server의 약자로 키(Key) - 값(Value) 쌍의 해시 맵과 같은 구조를 가진 비관계형(NoSQL) 데이터베이스 관리 시스템(DBMS)이다.

데이터가 HDD나 SDD가 아니라 RAM에 저장되어지기 때문에 데이터를 영구적으로 저장할 수 없는 대신,
굉장히 빠른 액세스 속도를 보장받을 수 있다. 빠른 액세스 속도와 휘발성 이라는 특징으로 보통 캐시의 용도로 Redis를 사용한다.

Refresh Token의 저장소로 레디스를 선택한 이유도 위와 같다.
빠른 액세스 속도로 사용자 로그인시(Refresh Token 발급시) 병목이 되지 않는다.

또한 Refresh Token은 발급된 후 일정 시간 이후 만료되어야 한다. Refresh Token을 RDB등에 저장하면, 스케줄러등을 사용하여 주기적으로 만료된 토큰을 만료 처리하거나 제거해야한다. 하지만, Redis는 기본적으로 데이터의 유효기간(time to live)을 지정할 수 있다. 
Redis의 이러한 특징들은 Refresh Token을 저장하기에 적합하다.

그리고 Refresh Token 토큰은 실수로 제거되어도 다른 데이터에 비해 덜 치명적이다.
최악의 경우가 모든 회원들이 로그아웃 되는 정도이다.

물론 JWT와 같은 클레임 기반 토큰을 사용하면 Refresh Token을 서버에 저장할 필요가 없다.
하지만, 사용자 강제 로그아웃 기능, 유저 차단, 토큰 탈취시 대응을 해야한다면 서버(Redis)에서 리프레시 토큰을 저장하도록 선택하여 해결 해볼 수 있다.

출처 : puleugo.tistory

Access Token과 Refresh Token에 대한 자세한 내용은 Access Token의 문제점과 Refresh Token 글을 참고하길 바란다.

 

Redis 설치

기본적으로 Redis가 설치되어있어야 로컬 환경에서 돌려볼 수 있다.
그렇기 때문에 Redis를 설치해주도록 하자.

# 설치
brew install redis

# 버전확인
redis-server --version

# 실행
brew services start redis

# 터미널 접속
redis-cli -h localhost -p 6379

# 중단
brew services stop redis

# 전체 키 조회
keys *

# 키 전체 삭제
flushall

 

 

스프링과 함께 사용하기 위한 자세한 사용은 Spring Data Redis 공식 문서를 참고하자.

참고

https://docs.spring.io/spring-data/redis/docs/current/reference/html/#reference

 

Spring Data Redis

Some commands (such as SINTER and SUNION) can only be processed on the server side when all involved keys map to the same slot. Otherwise, computation has to be done on client side. Therefore, it is useful to pin keyspaces to a single slot, which lets make

docs.spring.io

 

반응형