728x90
Refresh Token Rotation 정리
Refresh Token Rotation이란?
Refresh Token Rotation은
기존의 Refresh Token을 사용할 때마다 새로운 Refresh Token을 발급하고, 이전 토큰은 즉시 폐기하는 보안 기법입니다.
JWT 기반 인증 시스템에서는 Refresh Token이 탈취될 경우 심각한 보안 문제가 발생할 수 있는데,
Rotation을 적용하면 토큰이 탈취되어도 한 번 사용된 토큰은 무효화되기 때문에 피해를 최소화할 수 있습니다.
왜 필요한가?
- Refresh Token 탈취 방지
사용된 토큰은 즉시 무효 처리되기 때문에, 중간에 탈취되더라도 재사용이 불가능합니다. - 세션 보안 강화
세션 하이재킹(Session Hijacking) 공격을 효과적으로 차단할 수 있습니다. - 실시간 이상 탐지
같은 Refresh Token이 동시에 여러 번 요청되면, 탈취 가능성을 빠르게 인지할 수 있습니다.
기본 작동 흐름
- 클라이언트가 Refresh Token을 서버에 전송합니다.
- 서버는 전달받은 Refresh Token의 유효성을 검증합니다.
- 유효하다면,
- 새로운 Access Token과 새로운 Refresh Token을 발급합니다.
- 기존 Refresh Token은 서버와 Redis(DB)에서 폐기 처리합니다.
- 클라이언트는 새로 발급된 토큰으로 갱신합니다.
만약 이미 사용된 Refresh Token이 다시 제출된다면,
즉시 세션을 강제 종료하거나 추가 보안 조치를 취하는 로직을 구현해야 합니다.
주의사항
- Atomic한 갱신이 중요합니다.
(기존 토큰을 폐기하고 새 토큰을 발급하는 과정을 반드시 하나의 트랜잭션처럼 처리해야 합니다.) - Redis나 DB를 활용한 상태 관리가 필요합니다.
(각 Refresh Token을 저장하여, 폐기 여부를 관리합니다.) - Rotation 실패 시의 처리 정책을 명확히 정해야 합니다.
(예: 사용자가 탈취 위험에 노출되었을 경우 강제 로그아웃, 알림 등) - 토큰 만료 시간을 너무 길게 설정하지 않기
만료 시간이 길수록 탈취 위험이 오래 지속됩니다.
예시 코드 흐름 (간단)
// Refresh 요청 핸들러 예시
async function handleRefreshTokenRequest(refreshToken: string) {
const session = await redis.get(refreshToken);
if (!session) {
throw new Error('Invalid or expired Refresh Token');
}
// 기존 Refresh Token 삭제
await redis.del(refreshToken);
// 새로운 Token 발급
const newAccessToken = generateAccessToken(session.userId);
const newRefreshToken = generateRefreshToken(session.userId);
// 새로운 Refresh Token 저장
await redis.set(newRefreshToken, { userId: session.userId });
return { accessToken: newAccessToken, refreshToken: newRefreshToken };
}
정리
- Refresh Token Rotation은 복잡해 보일 수 있지만, 장기 세션 유지와 보안을 모두 만족시키기 위해서는 꼭 필요한 기법입니다.
- 특히, 민감한 데이터를 다루거나, 사용자가 장기간 로그인 상태를 유지하는 서비스에서는 Refresh Token Rotation을 반드시 적용하는 것을 권장합니다.
728x90
반응형
'백엔드 개발 > 인증 · 보안' 카테고리의 다른 글
"JWT만으로 충분할까?" 인증 설계에서 마주한 3가지 트레이드오프 (0) | 2025.05.03 |
---|---|
Refresh Token 탈취를 막기 위한 보안 설계: Redis TTL, Rotation, userAgent 바인딩까지 (1) | 2025.05.03 |
개인정보 수집 동의는 왜 받아야 할까? 법적 의무부터 실무 처리까지 정리 (0) | 2025.04.24 |
인증과 인가, 그리고 JWT까지 완벽 정리 (1) | 2024.01.02 |
[Node.js] 중복 로그인 어떻게 막을까? JWT + Redis 실무 구현 예시 (0) | 2023.07.05 |