JWT는 JSON Web Token의 약자로, 유저를 인증하고 식별하기 위한 토큰
기반 인증 방식이다. 토큰은 세션과 달리 클라이언트 측에서 저장
하므로 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 줄일 수 있다.
JWT는 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함(Self-contained) 되어 있다. 데이터가 많아지면 토큰이 커질 수도 있으며, 토큰이 한 번 발급된 이후 사용자의 정보를 바꾸더라도 토큰을 재발급하지 않는 이상 반영되지 않는다.
JWT를 사용하면 RESTful과 같은 무상태(Stateless)
인 환경에서 사용자 데이터를 주고 받을 수 있게 된다. JWT와 같은 토큰은 클라이언트에 저장하고 요청 시 단순히 HTTP 헤더에 토큰을 첨부하는 것만으로도 단순하게 데이터를 요청하고 응답을 받아올 수 있다.
JWT는 Header
, Payload
, Signature
로 구성된다. 이때, 각 요소는 .
으로 구분된다.
(1) Header
JWT(Access token)만을 사용한 인증 방식의 문제는 제 3자에게 탈취 당할 경우 보안에 취약하다는 점이다. Access token은 발급된 이후 서버에 저장되지 ㅇ낳고 토큰 자체로 검증을 하며 사용자 권한을 인증하므로 access token이 탈취되면 토큰이 만료되기 전까지 토큰을 획득한 사람은 누구나 접근 가능해진다.
JWT는 발급한 후 삭제가 불가능하므로 접근에 관여하는 토큰에 유효 시간을 부여
하는 식으로 탈취 문제에 대해 대응을 해야한다. 따라서 유효 기간을 짧게
하면서 오랜 시간 동안 로그인되어 있는 방식은 없을까라는 질문에 대한 답이 Refresh token
이다.
Access token과 Refresh token은 모두 JWT이다. 다만, Access token은 접근
에 관여하는 토큰이고, Refresh token은 재발급
에 관여하는 토큰이므로 역할이 다르다고 생각하면 된다.
1. 사용자가 ID , PW를 통해 로그인.
2. 서버에서는 회원 DB에서 값을 비교
3~4. 로그인이 완료되면 Access Token(JWT), Refresh Token을 발급한다. 이때 회원DB에도 Refresh Token을 저장해둔다다.
5. 사용자는 Refresh Token은 안전한 저장소에 저장 후, Access Token을 헤더에 실어 요청을 보낸다.
6~7. Access Token을 검증하여 이에 맞는 데이터를 보낸다.
8. 시간이 지나 Access Token이 만료됐다.
9. 사용자는 이전과 동일하게 Access Token을 헤더에 실어 요청을 보낸다.
10~11. 서버는 Access Token이 만료됨을 확인하고 권한없음을 신호로 보낸다.
12. 사용자는 Refresh Token과 Access Token을 함께 서버로 보낸다.
13. 서버는 받은 Access Token이 조작되지 않았는지 확인한후, Refresh Token과 사용자의 DB에 저장되어 있던 Refresh Token을 비교한다. Token이 동일하고 유효기간도 지나지 않았다면 새로운 Access Token을 발급해준다.
14. 서버는 새로운 Access Token을 헤더에 실어 다시 API 요청 응답을 진행한다.