이번 프로젝트에서 JWT 인증 구조를 도입하게 되었고, Access Token과 Refresh Token을 함께 사용하는 구조로 전환하게 되었습니다.
Refresh Token은 상대적으로 수명이 길고, 클라이언트가 직접 저장하고 있기에는 보안적인 이슈가 있어 서버측의 저장소가 필요했습니다.
처음에는 현재 사용중인 관계형 DB(PostgreSQL)를 고려했습니다. 사용자의 이메일을 키로 삼아 토큰 값을 저장하고, 만료시간은 별도 필드로 지정하는 방식입니다.
그러나 이 방식은 토큰 저장·검증·삭제 과정에서 불필요하게 DB 트래픽을 유발하고, 만료 처리를 위해 별도의 배치 작업이 필요하다는 단점이 있었습니다.
이 문제를 해결하고자, Redis를 Refresh Token 저장소로 도입하게 되었습니다.
Refresh Token에 대한 자세한 내용은 별도의 포스트에서 다룰 예정입니다.
Refresh Token은 일반적으로 수명이 길고, 유출 시 보안 사고로 이어질 수 있기 때문에 서버 측에서 안전하고 효율적으로 관리되어야 합니다. 그렇기에 다음과 같은 이유로 Redis를 선택했습니다.
이처럼 Redis는 Refresh Token 저장에 필요한 조건들을 대부분 만족시키면서, 시스템 전반의 복잡도를 높이지 않습니다.
사용자의 수가 적은 시스템에서는 id, refreshToken, expiresAt 필드를 가진 테이블을 만들어 사용할 수 있습니다. 하지만 실무 수준에서는 다음과 같은 문제들이 발생할 수 있습니다.
이러한 이유로 Refresh Token은 일반 RDB가 아닌 TTL 기반의 인메모리 저장소인 Redis에서 관리하는 것이 보안성과 성능, 유지관리 효율성 측면에서 훨씬 더 적합한 선택임을 확인할 수 있었습니다."
다음 포스트에서는 Refresh Token의 필요성과 역할을 짚고, 전체 인증 구조 내에서 어떻게 설계되고 적용되는지 정리하겠습니다.