백엔드/Spring

jwt refresh token 을 Redis로 리팩토링하기

happy_life 2024. 3. 4. 14:18

기존에 db 테이블에 저장하여 조회하던 refresh Token을 Redis 인메모리 데이터 구조 저장소로 리팩토링하는 과정을 기록하는 포스팅입니다.

 

기존의 코드는 아래와 같습니다. 

1. requestBody에 담긴 accessToken을 바탕으로  DB에서 refreshToken을 체크합니다

2. 만약 refreshToken이 valid하다면 accessToken을 발급합니다.

기존코드

 

 

 

DB에서 Redis로 리팩토링 하는 이유

1. refreshToken은 만료기간이 있는 token인데 DB에 저장할 필요가 있는지에 대한 의문이 들었습니다.

-> DB는 또한 디스크의 읽기 쓰기와 관련되므로 api 응답속도도 느립니다.

-> 인메모리를 사용하는 것으로 리팩토링하기

 

 

DB에서 Redis로 리팩토링 하는 과정

1. member 테이블의 refreshToken field를 삭제

2. refreshToken Class 생성 후 @RedisHash로 전용 entity로 개발 

3. 관련 repository, service 생성 후 이를 바탕으로 리팩토링 

 

 

DB에서 Redis로 리팩토링 하는 코드

1. RefreshToken

 

refreshToken

 

 

 

2. RefreshTokenRespository

 

respository

 

 

accessToken을 바탕으로 refreshToken을 꺼낼 수 있어야하므로 위와 같은 코드를 작성하였습니다.

 

 

 

3. refreshTokenService 

 

refreshTokenService

 

 

 

4. refresh시 accessToken을 위한 getAccessToken

getAccessToken refactoring

 

 

기존에는 find를 통해 DB를 한번 거치는 것에서 redis 캐시를 이용하게 코드를 리팩토링하였습니다.

 

 

DB에서 Redis로 리팩토링 한 결과

전/후

 

 

30 ~ 40 ms -> 15 ~ 20 ms로 성능을 약 2배 향상시켰으며 DB에 refreshToken을 불필요하게 저장하지 않도록 구현하였습니다.