Access Token과 Refresh Token

BirdsOnTree·2022년 11월 13일
0

Web

목록 보기
6/8
post-thumbnail

JWT는 탈취의 위험성이 있기 때문에, 그대로 사용하는것이 아닌 Access Token, Refresh Token 으로 이중으로 나누어 인증을 하는 방식을 현업에선 취한다고 한다. 그리하여 이번 포스팅에서는 이 두개에 대해서 알아보았다.

정리:
로그인을 하면 Access Token과 Refresh Token을 준다.
Access Token은 접근에 관여하는 토큰이고, Refresh Token은 재발급에 관여하는 토큰
서버에서는 Refresh Token 만 저장
서버에서는 Access Token만을 검사하다 만료가 되었음을 확인하면 사용자로부터 Refresh Token과 Access Token을 둘다 받아오고 Access Token이 조작되었는지 확인, Refresh Token이 서버에 저장해놓은것과 비교, 유효기간이라면 Access Token 재발급
둘다 만료면 재 로그인해야함

Refresh token이 필요한 이유?

이름이 다르지만 형태 자체는 Refresh Token은 Access Token과 똑같은 JWT다.
단지 Access Token은 접근에 관여하는 토큰이고, Refresh Token은 재발급에 관여하는 토큰 이므로 행하는 역할이 다르다고 보면 된다.

기존의 Access Token 만을 통한 인증 방식의 문제는 만일 제 3자에게 탈취당할 경우 보안에 취약하다는 점이다.
Access Token은 발급된 이후, 서버에 저장되지 않고 토큰 자체로 검증을 하며 사용자 권한을 인증하기 떄문에, Access Token이 탈취되면 토큰이 만료되기 전 까지, 토큰을 획득한 사람은 누구나 권한 접근이 가능해 지기 때문이다.
JWT는 발급한 후 삭제가 불가능하기 때문에, 접근에 관여하는 토큰에 유효시간을 부여하는 식으로 탈취 문제에 대해 대응을 하여야 한다.

이처럼 토큰 유효기간을 짧게하면 토큰 남용을 방지하는 것이 해결책이 될 수 있지만, 유효기간이 짧은 Token의 경우 그만큼 사용자는 로그인을 자주 해서 새롭게 Token을 발급받아야 하므로 불편하다는 단점이 있다. 그렇다고 무턱대고 유효기간을 늘리자면, 토큰을 탈취당했을 때 보안에 더 취약해지게 된다.

이때 “그러면 유효기간을 짧게 하면서 좋은 방법이 있지는 않을까?”라는 질문의 답이 바로 Refresh Token이다.

인증 방식

  1. 처음 로그인을 하면 서버는 클라이언트에게 Access Token과 Refresh Token을 동시에 발급해준다.
  2. 서버는 데이터베이스에 Refresh Token을 저장하고, 클라이언트는 Access Token과 Refresh Token을 쿠키, 세션 혹은 웹스토리지에 저장하고 요청이 있을때마다 이 둘을 헤더에 담아서 보낸다.
  3. Refresh Token은 긴 유효기간을 가지면서, Access Token이 만료됐을 때 새로 재발급해주는 열쇠가 된다.
  4. 만료된 Access Token을 서버에 보내면, 서버는 같이 보내진 Refresh Token을 DB에 있는 것과 비교해서 일치하면 다시 Access Token을 재발급해준다.
  5. 사용자가 로그아웃을 하면 저장소에서 Refresh Token을 삭제하여 사용이 불가능하도록 하고 새로 로그인하면 서버에서 다시 재발급해서 DB에 저장한다.

Refresh Token의 유효기간은 2주, Access Token의 유효기간은 1시간이라 가정하고,
1. 사용자는 API 요청을 하다가 1시간이 지나게 되면, Access Token은 만료
2. Refresh Token의 유효기간 전까지는 Access Token을 새롭게 발급이 가능
즉, Refresh Token은 접근에 대한 권한을 주는 것이 아니라 Access Token 재발급에만 관여하는 것
만약, Refresh Token의 유효기간(2주)이 만료됐다면, 사용자는 새로 로그인해야 한다.

Access / Refresh Token 재발급 원리

  1. 기본적으로 로그인 같은 과정을 하면 Access Token과 Refresh Token을 모두 발급한다.
    Refresh Token만 서버측의 DB에 저장, Refresh Token과 Access Token을 쿠키 혹은 웹스토리지에 저장
  2. 사용자가 인증이 필요한 API에 접근하고자 하면, 가장 먼저 토큰을 검사
    이때, 토큰을 검사함과 동시에 각 경우에 대해서 토큰의 유효기간을 확인하여 재발급 여부를 결정한다.
  • Access token과 Refresh token 모두가 만료된 경우 → 에러 발생 (재 로그인하여 둘다 새로 발급)
  • Access token은 만료됐지만, Refresh token은 유효한 경우 → Refresh token을 검증하여 Access token 재발급
  • Access token은 유효하지만, Refresh token은 만료된 경우 → Access token을 검증하여 Refresh token 재발급
  • Access token과 Refresh token 모두가 유효한 경우 → 정상 처리
  1. 로그아웃을 하면 Access Token과 Refresh Token을 모두 만료시킨다.

Refresh Token 인증 과정

  1. 사용자 로그인.

  2. 사용자 확인, 서버에서는 회원 DB에서 값을 비교

3~4. Access Token, Refresh Token을 발급, 회원DB에도 Refresh Token을 저장

  1. 사용자는 Refresh Token은 안전한 저장소에 저장, Access Token을 헤더에 실어 요청

6~7. Access Token을 검증하여 이에 맞는 데이터를 전송

  1. 시간이 지나 Access Token이 만료

  2. 사용자는 이전과 동일하게 Access Token을 헤더에 실어 요청

10~11. 서버는 Access Token이 만료됨을 확인하고 권한없음을 신호를 줌

Access Token 만료가 될 때마다 계속 과정 9~11을 거칠 필요는 없다.
사용자(프론트엔드)에서 Access Token의 Payload를 통해 유효기간을 알 수 있어서 API 요청 전에 토큰이 만료됐다면 곧바로 재발급 요청을 할 수도 있다.

  1. 사용자는 Refresh Token과 Access Token을 함께 서버로 전송

  2. 서버는 받은 Access Token이 조작되지 않았는지 확인한후, Refresh Token과 사용자의 DB에 저장되어 있던 Refresh Token을 비교, Token이 동일하고 유효기간도 지나지 않았다면 새로운 Access Token을 발급.

  3. 서버는 새로운 Access Token을 헤더에 실어 다시 API 요청 응답을 진행

출처:
[Dev Scroll]
https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Access-Token-Refresh-Token-%EC%9B%90%EB%A6%AC-feat-JWT

0개의 댓글