Access Token과 Refresh Token

Wonjun Seo·2024년 2월 27일
0

HTTP의 특성

그런데 로그인 후에 왜 매번 JWT를 헤더에 넣어서 보내야 할까? 비효율적이라는 생각이 들 수 있다. 매번 인증 과정을 거쳐야하는 이유는 HTTP의 특성 때문이다.

Connectionless: 통신이 이뤄지고 난 후에 연결이 바로 끊어진다.
Stateless: 이전 상태를 유지/기억하지 않는다.

웹 페이지를 열 때도, 휴대폰 앱을 사용할 때도, 클라우드를 사용할 때도 HTTP 통신으로 서버와 클라이언트가 데이터를 주고 받는다. 그런데 이런 HTTP는 connectionlessstateless하다는 특성이 있어 한 번 통신이 일어나고 나면 연결이 끊어지고, 다시 연결해도 이전 상태를 유지하지 않아 과거에 어떤 정보를 보냈는지 기억하지 못한다. 즉, 화면을 이동하며 새로운 API를 요청하면 다시 신뢰할만한 사용자인지 인증하는 과정을 거쳐야 한다는 것이다.

매번 사용자가 인증하는 절차는 번거롭고 통신이 느려지는 원인이 될 수 있다. 따라서, 인증된 사용자가 특정 기간동안 재인증하지 않아도 로그인 상태가 유지되도록 해주는 것이 Access Token이다.


AccessToken / RefreshToken

JWT는 제 3자에게 토큰 탈취의 위험이 있기 때문에, 그대로 사용하는 것이 아니라 Access Token과 Refresh Token으로 나누어 인증을 하는 방식을 사용한다.
Access Token과 Refresh Token은 모두 똑같은 JWT이다. 다만, 토큰의 저장 위치와 관리 방식에 따른 용도의 차이일 뿐이다.

  • Access Token: 클라이언트가 갖고있는 유저의 정보가 담긴 토큰으로, 클라이언트에서 요청이 오면 서버에서 해당 토큰에 있는 정보를 활용하여 사용자의 정보에 맞게 응답한다.
  • Refresh Token: Access Token이 만료될 경우에 새로운 토큰을 발급해주기 위해 사용한다. Refresh Token은 Access Token보다 유효 시간이 길어야 한다.

정리하자면 Access Token은 접근에 관여하는 토큰이고, Refresh Token은 토큰 재발급에 관여하는 역할로 사용되는 JWT라고 말할 수 있다.


Refresh Token 재발급 원리

  1. 기본적으로 로그인을 하면 Access Token과 Refresh Token이 발급된다.
    Refresh Token은 서버측의 DB에 저장되고, Access Token과 Refresh Token 모두 클라이언트의 로컬에 저장된다.
  2. 사용자가 인증이 필요한 API에 접근하면, 가장 먼저 토큰을 검사한다.
    • Access Token과 Refresh Token 모두 만료된 경우: 에러 발생 (재 로그인)
    • Access Token만 만료된 경우: Refresh Token을 검증하여 Access Token 재발급
    • Refresh Token만 만료된 경우: Access Token을 검증하여 Refresh Token 재발급
    • Access Token과 Refresh Token 모두 유효한 경우: 정상 처리
  3. 로그아웃을 하면 Access Token과 Refresh Token을 모두 만료시킨다.

프로세스

기본적인 개념은 다음과 같다.

  • Access Token은 유효 시간이 짧다.
  • Refresh Token은 유효 시간이 길다.
  • 평소에 API와 통신할 때는 Access Token을 사용하고, Refresh Token은 토큰을 재발급받기 위한 용도로 사용한다.

즉, 통신 과정에서 탈취당할 위험이 큰 Access Token은 만료 시간을 짧게 두고, 토큰을 주기적으로 재발급받아 피해를 최소화 해야한다.

  1. 로그인이 성공하면 클라이언트는 Access TokenRefresh Token을 발급 받는다.
  2. 발급 받은 두 개의 토큰은 로컬에 저장된다.
  3. 클라이언트는 Header (Authorization)에 Access Token을 넣고 API 통신을 한다.
  4. 유효기간이 지나면 Access Token이 만료된다.
    4.1. 토큰이 더 이상 유효하지 않으므로 권한이 없는 사용자가 된다.
    4.2. 서버는 401 (Unauthorized) 에러 코드를 반환한다.
  5. 토큰을 재발급 받기 위해 헤더에 Refresh Token을 넣어 API에 요청을 보낸다.
  6. Refresh Token유효하다면 서버는 클라이언트에게 새로운 토큰을 발급한다.
  7. 만약 Refresh Token만료되었다면 클라이언트는 재로그인 해야한다.

정리

  • Access Token은 유효 기간이 짧고 평소 API 통신을 할 때 사용한다.
  • Refresh Token은 토큰 탈취 위험을 최소화하고, 사용자 경험을 향상 시키기 위해 나온 것이다.
  • Refresh Token은 Access Token을 재발급 받을 때 사용한다.

참고 자료

https://velog.io/@chuu1019/Access-Token%EA%B3%BC-Refresh-Token%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC

0개의 댓글