본문 바로가기

Spring Boot/유저 관리 기능

Authorization 헤더, 토큰 기반 인증 : Refresh 토큰

- Refresh 토큰이 왜 필요한가

- Access 토큰과 Refresh 토큰의 역할 차이

- 토큰을 2개로 분리했을 때 얻는 실질적인 보안적/운영적 이점

- 토큰 갱신 워크플로우

- 만료 및 무효화 전략으로 안전한 시스템 설계하기


Refresh 토큰의 이해

토큰 기반 인증에서 보안성과 편의성을 동시에 만족시키기 위해 Access 토큰과 Refresh 토큰을 분리하는 방식으로 사용한다

 

1. Access 토큰과 Refresh 토큰의 역할

구분 Access 토큰 Refresh 토큰
목적 리소스 서버 접근 권한 부여 새로운 Access 토큰 발급 요청
유효기간 짧음(분단위 ~ 수십분) 김(일단위 ~ 수주)
보관 위치 클라이언트(브라우저/앱) 클라이언트 안전 영역(Secure Storage 등)
보안 리스크 탈취시 제한된 시간만 사용가능 탈취시 장기간 사용가능
강화된 보안 필요

 

* Access 토큰 -> 실제 API 요청에 사용함

* Refresh 토큰 -> Access 토큰 재발급 용도

 

 

2. 왜 토큰을 2개로 나누는가?

 1) 보안성 강화

  • Access 토큰은 짧은 만료 시간으로 발급한다. 탈취되더라도 금방 무력화됨
  • Refresh 토큰은 더 오래 유지되지만 오직 "재발급 요청"에만 사용되므로 공격 표면이 줄어든다

 2) 사용자 경험 개선

  • 사용자가 매번 로그인할 필요가 없음
  • Access 토큰이 만료되면 Refresh 토큰을 이용해서 자동으로 새 Access 토큰을 발급받을 수 있음

토큰을 분리함으로 보안성과 사용자 편의성을 동시에 달성할 수 있다.

번거로운건 개발자임 ㅎ


토큰 갱신 워크플로우

Access 토큰과 Refresh 토큰이 실제로 어떻게 사용되는가?

Access 토큰과 Refresh 토큰의 워크플로우

 

중요한 점

1. Access 토큰이 만료된 이후에 Refresh 토큰을 전송해서 재발급을 요청하는 점

2. 로그인을 요청할 때 Access 토큰과 Refresh 토큰을 동시에 줌


토큰 만료 및 무효화 처리

1. Access 토큰 만료

  • 기본적으로 수분 ~ 수십분 단위로 만료 시간을 정함
  • 탈취 위험 시, 피해를 최소화하기 위함

 

2. Refresh 토큰 만료

  • 보통 일, 주 단위로 정함
  • 장기간 보관되므로 DB저장 후 화이트리스트 / 블랙리스트 방식으로 관리하는 경우도 많음

 

3. 무효화 전략

  • 강제 로그아웃 : 서버 DB에서 Refresh 토큰을 제거함
  • 토큰 로테이션 : Refresh 토큰 사용시마다 새로운 Refresh 토큰을 발급해줌. 이전 것은 무효화하는 로직 작성

* 모바일 앱은 Refresh 토큰을 Secure Storage(KeyChain, Keystore 등)에 저장해야한다

* 브라우저 환경에서는 Refresh 토큰을 쿠키(HttpOnly + Secure + SameSite)로 관리해야한다

* Refresh 토큰은 서버 DB나 Redis에 저장하고, 만료 / 폐기 여부를 반드시 확인해줘야 한다


정리

항목 Access 토큰 Refresh 토큰
사용 목적 리소스 접근 Access 토큰 재발급
유효기간 짧음
장점 탈취 피해 최소화 자동 로그인 유지
단점 자주 만료됨 -> 갱신이 필요 탈취시 장기적 피해