AI를 통해 nestjs에서 구현한 JWT 인증 방식에는 한가지 의문점이 있었습니다. 서명 검증을 하고 유효한 토큰임을 확인한 뒤 JWT 페이로드를 통해 얻은 이메일을 가지고 디비에 해당 계정이 존재하는지를 조회하는 로직입니다.
인가가 필요한 페이지 이곳저곳을 돌아다니게 되면, 한번 움직일 때마다 1번의 디비 조회가 일어나게 됩니다. 사용자가 많은 서비스는 아닌 곳에서는 크게 무리가 되지 않을 수는 있겠지만, 꽤나 효율적인 동작 방식이 아니라는 생각이 들었습니다.
조금 더 확인해보니, 이는 전통적인 방식의 인증 방식인 세션 인증 방식과 비슷하다는 것을 알게 됐습니다. JWT는 StateLess 하게 동작시킬 수 있습니다. 세션 인증 방식은 발급된 세션이 유효한지를 서버 내에서 세션을 관리하는 곳에서 데이터를 찾아야 한다면, JWT는 그냥 서명이 유효한지를 확인하고, 유효하다면 JWT에 담겨있는 데이터를 통해 필요한 작업을 진행하면 됩니다.
그러나, StateLess로 동작시킬 경우에는 로그아웃 기능을 구현할 수가 없습니다. JWT가 유효하지 않다는 것을 알기 위해서는 서버 내에서 그걸 판단할 수 있는 데이터를 저장해야한다는 의미가 되는데, 그러면 StateLess한 상황이 아니게 되어버립니다. 실무에서는 완전한 StateLess로 동작하도록 JWT 인가를 구성하는 게 아닌, 일부 상황에서는 서버 내에 JWT를 처리하기 위해 데이터 관리를 해야함을 이해하게 됐습니다.