작성
·
279
답변 1
1
rrallvv .J님 안녕하세요 :)
좋은 질문입니다. 음 일반적으로는 둘다 괜찮은데 상황에 따라 좀 더 적합한게 있을 수 있어요.
일단 세션의 가장 큰 점은 이 유저의 상태를 실시간으로 관리할 수 있다는 점이에요. 예를 들어 해커가 JWT 토큰을 탈취를 하게 되면 토큰이 만료되기 전까지는 저희가 요청을 차단할 수 있는 방법이 없어요. 그래서 JWT를 사용하게 되면 이런 악행을 최소화시키기 위해 만료기간이 짧은 accessToken과 만료기간이 긴 refreshToken을 두게 되죠. accessToken이 만료되면 refreshToken으로 새로운 accessToken을 발급하게 되는데 이 때 데이터베이스에 저장되어 있는 유저의 상태(예를 들어 해킹유무)를 확인하고 refreshToken이 있음에도 불구하고 accessToken 발급을 차단하게 됩니다.
또 하나의 예시로는 만약 제3자가 저에게 권한들을 부여한다고 했을 때 이런 권한정보들을 JWT에 담아주는게 좋은데요. 문제는 accessToken이 만료되고 재발급되기 전까지는 즉시 반영이 되지 않을 수도 있다는거에요. 하지만 세션에 이런 해킹유무, 권한 업데이트와 같은 정보들이 실시간으로 반영된다면 요청마다 즉시 반영되겠죠.
그리고 강의에서처럼 꼭 레디스가 아니라 몽고디비와 같은 메인 데이터베이스로 세션을 관리해도 되긴 해요. 레디스로 하는건 요청마다 반복적으로 호출이 되는데 이걸 조금이라도 빨리 불러오고 메인 디비에 부하를 줄이기 위해서니까요. 그래서 만약 세션 기반으로 가실거면 처음에는 메인 디비로 했다가 서비스가 성장하면서 레디스 같은걸로 옮길 수 있겠죠.
대부분의 서비스들은 JWT로 개발을 해도 특별히 문제 되지 않아요. 말씀하신대로 요청마다 세션을 확인해야하는 부하도 줄고 복잡성도 그만큼 주는 단점이 일단 제일 매력적이죠. 저도 JWT를 실제로 더 선호하고 왠만하면 JWT기반으로 개발하고 있습니다. 세션 기반을 모르고 JWT를 사용하는거랑 알고 사용하는거랑 다르다고 생각해요. 그리고 세션 기반으로 돌아가는 서비스들도 아직 많기 때문에 기본적으로 알고 있으면 좋다고 봐요. 둘 다 알고 적재적소로 사용하시면 좋을 것 같아요.
GraphQL 백엔드 강의를 준비하고 있는데 여기서는 JWT기반(access & refresh) 인증인가를 다룰 예정이에요 :)
답변 감사합니다.
많은 도움이 되고있어요^^