개발자 도전기/[STUDY] JS || TS

node.js | JWT | 실무에서 JWT 적용하는 방식 살펴보기. 쿠키 vs 로컬스토리지, 리프레시 토큰 구현

답수 2022. 12. 19. 17:19
728x90
반응형

 

웹 관련 토이 프로젝트를 진행해봤던 사람들이라면 무조건 사용자 인증/인가 방식을 구현하기 위해 SESSION과 JWT를 마주했을 것이라고 생각한다. 그리고 JWT를 선택했다면, 토큰을 어디에 저장해야할지 많이 고민해봤을 것이다.

 

나 역시 개발자로 취업 전 웹개발 프로젝트들을 진행하면서 JWT를 사용했었고, access token과 refresh token 구현, 각 토큰의 저장 위치 때문에 많은 어려움을 겪었다. 특히 가장 이해가 되지 않았던 부분은 JWT가 세션 대신 사용되는 이유는 인증/인가 처리 시 서버 자원 사용의 부담을 줄이기 위해서인데, 엑세스 토큰과 리프레시 토큰을 모두 클라이언트 사이드에서 처리하게 된다면 보안 측면에서 매우 취약하다는 것이고, 그렇다고 DB에 저장하게 된다면 JWT를 사용하는 이유가 무색해진다는 것이다.

 

그러나 사용자 인증을 하는 근본적인 이유는 "보안"이고, 안정적으로 보안을 유지하기 위해서는 결국 리프레시 토큰을 DB에 저장하는 것이 최선이라고 생각했었다. 서버측에서 데이터를 가지고 있어야 다른 디바이스 접속이나 다른 아이피 접속 등 특수한 상황일 때 서버가 임의로 토큰을 만료시킬 수 있다고 판단했기 때문이다. 결국 전통적인(?) JWT 방식에 세션과 비슷한 개념을 섞어서 사용했던 것이다.

 


 

개발자가 되고 나서 우리 팀 코드를 보면서 실제 현업에서도 refresh token을 서버에서 관리한다는 것을 알게 되었다. 물론 팀 상황마다 다르겠지만, 역시 인증/인가를 컨트롤하기 위해서는 서버에서 데이터를 가지고 있는 것이 확실히 보안적으로 좋다고 생각한다.

 

우리 팀은 다음과 같은 과정을 거쳐서 인증/인가를 진행한다. 

 

요약하자면, 리프레시 토큰은 쿠키에 담고, 엑세스 토큰은 서버측에서 http 헤더의 authorization에 담아서 response를 전달한다. 이때 httpOnly를 true로 하고 referer 검증으로 보안을 설정한다(+ helmet() 미들웨어 사용!).

 

 

 

728x90
반응형
LIST