- 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 토큰이 실제로 어떻게 사용되는가?
중요한 점
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 토큰 재발급 |
| 유효기간 | 짧음 | 김 |
| 장점 | 탈취 피해 최소화 | 자동 로그인 유지 |
| 단점 | 자주 만료됨 -> 갱신이 필요 | 탈취시 장기적 피해 |
'Spring Boot > 유저 관리 기능' 카테고리의 다른 글
| 인가와 권한 관리 : 권한 기반 접근 제어 (0) | 2026.03.17 |
|---|---|
| 인가와 권한 관리 : 인가 (0) | 2026.03.15 |
| Authorization 헤더, 토큰 기반 인증 : JWT의 이해 (0) | 2026.03.14 |
| Authorization 헤더, 토큰 기반 인증 : Authorization 헤더 (1) | 2026.03.13 |
| 기본 인증, 인코딩 : 기본 인증 보안 고려사항 (1) | 2026.03.10 |