개발 공부 기록

[Spring / JWT] Access Token과 Refresh Token 본문

Spring/Development Log

[Spring / JWT] Access Token과 Refresh Token

나만없서고냥이 2023. 12. 9. 19:03

https://jieeeuun.tistory.com/72

 

[Spring] Session 기반과 JWT 기반의 인증

개인 프로젝트에서 인증 기능을 구현해야 하는데, 이때 SpringBoot에서 인증을 구현하는 주요 방식으로 Session 기반과 JWT(JSON Web Token) 기반이 있습니다. 구현을 하기 전에 두 방식에 대해 어느 정도

jieeeuun.tistory.com

이전 포스팅에서 JWT의 단점을 보완하기 위해 토큰 두 개를 함께 사용한다고 했었는데요, 그 부분에 대해 자세히 알아봅시다.

 


✔️ Access Token과 Refresh Token

토큰 두 개는 각각 access token과 refresh token으로 구성됩니다.

  • Access Token : 인증된 사용자에게 제공되는 짧은 유효기간을 갖는 토큰으로, 일반적으로 API 요청 시 사용자의 권한 및 인증을 증명하는 데에 사용됩니다.
  • Refresh Token : Access Token을 갱신하기 위한 토큰으로, 긴 유효기간을 갖습니다. Access Token과는 별도로 발급되며, 사용자의 인증 정보를 재발급받을 때 사용됩니다.

access token은 보안 상의 이유로 만료 기간이 짧기 때문에 매번 새로운 토큰을 발급해야 하고, 이 새로운 토큰을 얻기 위해선 다시 인증 과정을 거쳐야 합니다. 그 과정은 아래와 같습니다.

  1. 사용자가 로그인을 시도하면, 서버는 access token과 refresh token을 발급하여 클라이언트에게 전송합니다. 이때 서버는 refresh token을 안전한 저장소에 저장합니다.
  2. 이후 클라이언트가 access token을 가지고 서버에 요청을 보낼 때, access token이 만료되었거나 유효하지 않은 경우 서버는 해당 요청을 거부하고 실패 응답을 반환합니다.
  3. 클라이언트는 refresh token을 사용하여 서버에 대로운 access token을 요청합니다.
  4. 이때 서버는 refresh token의 유효성을 검증하고, 유효하다면 클라이언트에게 새로운 access roken을 발급합니다.
  5. 클라이언트는 새로운 access token을 사용하여 서버에 다시 요청을 보낼 수 있습니다.

이렇게 refresh token을 사용하여 access token을 갱신할 수 있으며 즉, 사용자는 다시 로그인할 필요 없이 인증 절차를 수행할 수 있습니다. 만일 access token이 탈취를 당해도 이는 유효 기간이 짧기에 금방 만료되어 더 이상 사용할 수 없게 됩니다. 또한, 누군가를 강제 로그아웃시켜야 할 일이 온다면 refresh token을 무효화하는 방법을 사용할 수 있습니다.

 


✔️ Access Token은 어떻게 재발급이 되나 ?

위에서 access token과 refresh token이 어떻게 활용되는지 대략적인 과정을 살펴봤습니다. 그렇다면, refresh token을 이용해 access token이 어떻게 재발급되는지에 대해 조금 더 자세히 살펴봅시다.

 

  1. 클라이언트가 서버에 요청을 보내면, 해당 요청에는 HTTP header의 Authorization 속성으로 refresh token이 포함됩니다.
  2. 서버는 클라이언트에게 받은 토큰의 payload를 확인하여, 토큰의 type을 확인합니다. 이때 type은 ATK(Access Token) 혹은 RTK(Refresh Token)으로 나뉩니다.
  3. 만약 토큰의 타입이 RTK이고, 요청 URI가 '/account/reissue'인 경우 재발급 프로세스를 시작합니다.
  4. ATK 재발급을 위해 RTK의 payload에서 사용자의 email을 추출합니다.
  5. 추출된 email을 사용하여 Redis와 같은 인메모리 데이터베이스에서 해당 사용자의 존재 여부를 확인합니다.
  6. 유저가 존재한다면 새로운 ATK를 생성하고, 새로운 ATK를포함한 TokenResponse를 클라이언트에게 응답합니다.

이후 클라이언트는 새로운 ATK를 요청 헤더에 포함하여 요청을 보내 서버에 인증합니다. 이렇게 RTK는 ATK의 재발급에만 관여를 하며, RTK를 사용하여 새로운 ATK를 발급하는 작업은 '/account/reissue' URI에서만 허용됩니다.

 

 

다음 포스팅에서 JWT를 이용하여 본격적으로 로그인 기능을 구현하고, redis까지 사용하여 ATK를 갱신하는 작업까지 진행해보도록 하겠습니다.


References