본문 바로가기
Spring Security

JWT 로그인 시 Refresh-Token 저장소를 Redis로 변경하는 이유

by asdft 2024. 5. 20.

 

이전에 진행했던 프로젝트에서 JWT 로그인을 구현하였습니다.

JWT 토큰을 이용한 로그인에는 Access-Token과 Refresh-Token이 쓰이는데,

Access-Token은 인증을 위한 토큰으로 사용되고, Refresh-Token은 액세스 토큰을 재발급 하는데 사용됩니다.

 

[기존의 Refresh Token 사용 방식]

입력한 회원정보와 가입한 회원정보가 일치할 시, Login을 할때, Refresh-Token을 서버에서 만들어 MySQL database에 저장하고, 액세스 토큰의 유효기간 만료로 인한 토큰 재발급 시, 리프레시 토큰값을 비교하여 일치 할 경우, 새로운 액세스 토큰과 리프레시 토큰을 발급합니다.

 

위에서 아쉬운 점은, Refresh-Token을 발급한 이후, 별도의 로그아웃 API 호출이 없는 경우 깔끔하게 토큰이 DB에서 삭제되지 못한다는 점입니다.

 

그래서 프로젝트 리팩토링을 진행하면서, MySQL에 저장했던 Refresh-Token을 Redis로 바꾸려고 합니다.

 


왜 Redis 인가? Redis vs RDB

Redis 는 리스트, 배열 형식의 데이터 처리에 특화되어있습니다. 리스트 형 데이터의 입력과 삭제가 MySQL보다 10배 정도 빠릅니다. 이런 Redis 를 RefreshToken 의 저장소로 사용할 경우, 빠른 접근 속도로 사용자가 로그인시(리프레시 토큰 발급시) 병목이 발생할 가능성을 낮출 수 있습니다.

 

또 Refresh Token 은 발급된 이후 일정시간 이후 만료가 되어야합니다. 리프레시 토큰을 RDB 등에 저장하면, 스케줄러등을 사용해서 만료된 토큰을 주기적으로 DB 에서 제거해 줘야 합니다.

그러나 Redis 는 기본적으로 데이터의 유효기간(time to live) 을 지정할 수 있습니다. 이런 특징들이 바로 Refresh Token 을 저장하기에 적합한 특징들이죠.

 

또한 Redis 는 휘발성이라는 특징으로 인해 데이터가 손실될수도 있는 위험이 있으나, Redis 에 저장될 리프레시 토큰은 손실되더라도 그리 손해가 큰 편은 아닙니다. 기껏해봤자 RefreshToken 이 없어져서 다시 로그인을 시도해야 하는 정도 입니다. Trand-Off를 고려했을 때, 이는 큰 문제가 아니라 생각해서 Redis에 Refresh-Token을 저장하려는 결정을 내렸습니다.

 


Redis 사용 시 이점

1. 빠른 액세스와 만료 관리

Redis는 메모리 기반 데이터 저장소이므로 매우 빠른 읽기/쓰기를 제공합니다. 이를 통해 refreshToken의 유효성을 빠르게 확인하고 필요 시 만료시킬 수 있습니다. 짧은 응답 시간은 보안 이벤트(예: 토큰 탈취 시도)에 빠르게 대응할 수 있게 해줍니다.

 

2. 간편한 만료 및 삭제

Redis는 TTL(Time to Live) 기능을 제공하여 키에 유효기간을 설정할 수 있습니다. 이를 통해 refreshToken의 자동 만료가 가능하며, 특정 조건에서 토큰을 신속히 무효화할 수 있습니다. 이는 RDBMS보다 효율적이며 보안 사고 시 피해를 줄일 수 있습니다

 

3. 세션 무효화 용이성

유저가 로그아웃하거나 비정상적인 활동이 감지될 경우 Redis에서 특정 refreshToken을 쉽게 삭제할 수 있습니다. RDBMS에서는 복잡한 쿼리와 트랜잭션 처리가 필요할 수 있지만, Redis에서는 단일 명령으로 처리할 수 있어 더 빠르고 효과적입니다.

 

4. 스케일링의 용이성

Redis는 분산 캐시 시스템을 지원하며, 이를 통해 큰 규모의 사용자를 처리할 때에도 성능을 유지할 수 있습니다. 이는 특히 대규모 시스템에서 보안 모니터링과 대응 속도를 유지하는 데 중요합니다.

 

5. 분리된 저장소

refreshToken을 RDBMS가 아닌 Redis에 저장함으로써 데이터베이스와 캐시 간에 책임을 분리할 수 있습니다. 이는 데이터베이스에 대한 접근을 최소화하여 공격 벡터를 줄일 수 있습니다. 예를 들어, 데이터베이스가 공격을 받더라도 캐시에 저장된 토큰 정보는 노출되지 않을 수 있습니다.