JWT(JSON Web Token)


JWT 소개 Velog 마스터 블로그
Django REST framework simplejwt GIT 문서
jwt.io 공식문서

JWT를 사용하게 되면 유저의 세션을 유지할 필요가 없고 서버 자원을 절약할 수 있다. JWT에서 제공하는 Acess Token & Refresh Token, Sliding Session에 대해 정리하였다.

1. Acess Token & Refresh Token

단일 Acess Token 방식의 문제점

토큰 만료시간 전 토큰이 탈취되는 경우 서버에서는 조치를 할 수 없다. 그렇다고 해서 만료시간을 짧게 설정하면 사용자는 로그인을 자주 해서 새로운 Token을 발급받아야 할 것이다. 그래서 등장한 것이 Refresh Token.

Refresh Token

만료주기가 짧은 Access Token과 이 토큰을 재 발급 받을 수 있는 만료주기가 긴 Refresh Token을 사용한다. Access Token이 탈취 되더라도 피해를 줄 일수있다. 유효기간이 지나더라도 Refresh Token덕에 토큰을 재 발급받을 수 있기 때문. 주로 Acess Token은 30분 내외, Refresh Token은 2주에서 한달 이내의 기간을 부여한다고 한다.

Refresh Token은 새로운 Access Token을 발급받기 위한 토큰이다. Refresh Token의 유효기간 전 까지는 Access Token을 발급 받을 수 있다. Refresh Token은 외부에 노출되지 않도록 관리해야하므로 데이터베이스에 저장한다. 클라이언트에서는 보안이 유지되는 공간에 저장해두어야 한다.

이 과정으로 Access Token의 만료에 대한 재 발급 처리를 구현해야 한다. 과정이 조금 더 복잡해지게 되었다. 또한 클라이언트에서 어떠한 작업과정 중 토큰이 만료되는 경우에 대비하여 Sliding Session 처리가 필요하다.

2. Sliding Session 전략

Sliding Session 이란

세션을 유지하는 유저에 만료기한을 늘려주는 방법. Access Token 또는 Refresh Token의 만료주기를 늘려주게 된다. 유효기간을 늘려주는 시점은 개발자가 어떻게 구현하느냐에 따라 달린 것.

토큰인증방식 처리 Flow


004. token 방식.png

  1. Client에서 Server로 인증 요청을 보낸다. (로그인)
  2. Server에서는 계정정보가 일치하다면 Client에게 토큰(Aceess, Refresh)을 전송한다. Refresh토큰을 DB에 저장한다. 그리고 Client에서는 안전한 저장소에 토큰을 저장한다.
  3. Client에서는 HTTP 요청의 header에 Access Token을 포함시켜 Server에 요청을 보낸다.
  4. Server에서는 토큰을 검증하고 요청에 응답한다.
  5. Access Token이 만료된 경우라면 Server에서는 Unauthorized 로 응답한다. 그러면 Client에서는 Refresh, Access Token을 다시 포함시켜 Server로 전송한다.
  6. Server 에서는 토큰 검증작업이 완료되면 재 발급된 Access Token을 응답하고 Client 에서는 응답받은 Access Token을 포함시켜 다시 Server로 요청을 보낸다. 그리고 응답을 받는다.

발급받은 토큰은 어디에 저장할까


서버로부터 토큰을 발급받으면 웹 스토리지 또는 쿠키에 저장하는 방법이 있다

1. HTML5 Web Storage

  1. Local Storage : 모두 문자열로 저장된다. 데이터를 지우기 전까지는 계속 저장되어있다.
  2. Session Storage : Local Storage와는 달리 브라우처 창이 닫히면 데이터가 제거된다.

Web Storage는 HTML5부터 지원된다. 쿠키에 비해 보안성이 좀 더 우수하며 웹사이트 성능에 영향이 없이 많은 데이터를 저장할 수 있다. 이 방식은 구현하기는 쉽지만, XSS(Cross-Site Scripting) 해킹 공격을 통하여 악성스크립트에 노출이되는 경우 쉽게 토큰이 탈취 될 수 있다. JS로 접근이 가능하기 때문. 이에 대한 대안은 아래 설명할 쿠키에 넣는 방식이다.

2. Cookies

JS에서 접근할 수 있는 Web Storage 보다는 JS에서 접근할 수 없는 HttpOnly cookie에 저장하여 XSS공격에 대비를 할 수 있다. 하지만 CSRF(Cross-Site Request Forgery) 공격에 취약하다. 다행히 CSRF 보안에 신경을 쓰면 공격을 차단할 수 있다.