이번 글에서는 JWT, Redis에 대한 개념을 숙지를 하고 있다는 전제하에 글을 작성할 예정이다.
얼마 전, 회원 탈퇴한 회원의 JWT 토큰(만료 기간 유효)으로 서비스 접근할 수 있는 지에 대한 면접 질문을 통해서 인증 부분에 대해서 다시 고민해보게 되었다.
지금까지 내가 구현했던 방식으로는 서비스 접근이 가능했었고 생각하지 못했던 부분이었다. 접근이 가능한 이유는 암호화키로 내가 발급한 토큰이 맞는지에 대한 검증만 했었기 때문이다. 접근하지 못하게 하기 위해서는 요청을 받은 후 토큰에 담겨있는 회원의 식별번호로 존재하는 회원인지에 대한 확인을 하는 처리를 해줘야만 했다. 이러한 보안적인 부분을 보완하기 위해서 매 요청 시 토큰에 들어있는 회원 정보를 추출하여 존재하는 회원인지 Mysql DB 조회를 해야하는 것이 맞나?라는 생각이 들었다. 매 요청마다 추가적으로 Mysql DB를 1번씩 더 조회하게 되기 때문에 이는 성능상으로 좋지 않다고 판단을 했다. 그러면 어떤 방식으로 인증을 구현해야 할까?하고 조사를 한 결과!! Redis 공식 홈페이지에서 세션을 위해서 JWT 토큰을 사용하지 말아야 하는 이유를 정리해보고자 한다.

토큰 폐기 관련 문제이다. 토큰은 만료될 때까지 유효하고 서버에서 폐기할 수가 없다.그렇다면, 이러한 문제를 해결하기 위해서는 어떻게 해야할까?
폐기된 토큰들을 데이터베이스에 저장하고, 매 호출마다 확인해야한다. 폐기된 토큰일 경우에는 해당 사용자가 접근하는 것을 막으면 된다. 이 말은, 결국 유효한 토큰인지 확인하는 추가적인 DB 조회를 하게 된다는 이야기가 된다. 그러면 처음 JWT의 목적인 Stateless, 추가적인 DB 조회를 하지 않는다는 장점이 없어지게 된다.
성능, Restful한 API도 중요하지만, 보안이 더 중요하기 때문에 JWT 토큰은 사용하지 않는 것이 좋다. 그렇다면 보안 + 성능 모두 보장하는 좋은 방법은 없을까?!