본문 바로가기

Backend/WORK

토큰 검증시 캐시 처리하기

이번에 인증서버 작업을 신행하면서 리소스서버에 접근할시, 토큰을 검증하는 부분이 필연적으로 발생하게 되는데, 

페이로드안의 유저아이디가 db상에 존재하는지를 확인하기 위해 API 호출마다 쿼리가 발생하는 것을 보게되었다.

이 부분은 나중에 db 부하지점이 될 수 있고, 반복적인  읽기에 대한 호출이기에 캐시로 처리를 하기로 했다.

 

캐시의 읽기 전략은 look aside 패턴을 사용했다. 

플로우는 대략 아래와 같다.

 

- 데이터를 찾을때 우선 캐시된 데이터를 우선 확인하여 있으면(cache Hit) 캐시데이터를 제공한다.

- 캐시된 데이터가 없으면 DB에서 조회한다.

- DB에서 조회해온 데이터를 cache store에 업데이트 한다.

look aside 패턴

 

캐시의 만료시간 TTL을 accessToken의 만료 시간(1시간)으로 잡았다.

중간에 로그아웃이나 탈퇴를 하지 않는 이상, accesToken의 만료 시간이 다 될때까지 같은 토큰을 쓸것이기 때문이다.

 

혹시 token을 리프레시하여 새로운 토큰을 발급받는 경우, 새로운 키가 발급될 것이다. 키의 이름이 토큰의 페이로드를 반영하기 때문이다.

또한 로그아웃이 발생하거나 탈퇴를 하게되면(사용자의 상황이 변했을때) 토큰은 사라져, 토큰 유무 로직에서 막히기 때문에

데이터의 정합성에 대한 문제(더이상 존재하지 않는 유저지만 캐시에 데이터가 남아있는 상황)는 발생하지 않는다. 

 

해당 작업은 토큰 검증을 담당하는 JwtStrategy 서비스에 적용되었다.

 

결과적으로 클라이언트에서 API 호출마다 발생되던 쿼리를 0회로 줄일 수 있었다.

유저의 수가 늘어날수록 쿼리의 감소 효과는 매우 클 것이라 생각된다.