JWT 기반 인증 시스템: 액세스 토큰과 리프레시 토큰 보안 가이드 - maeng2418/zzik-meok GitHub Wiki
목차
1. 토큰 기반 인증 시스템 개요
액세스 토큰 (Access Token)
- 목적: 보호된 리소스에 접근하기 위한 단기 인증 수단
- 특징:
- 짧은 유효기간 (일반적으로 15분)
- API 요청 헤더에 포함되어 사용
- JWT 형식으로 발급
- 저장 위치: 클라이언트 메모리 (localStorage 사용 지양)
리프레시 토큰 (Refresh Token)
- 목적: 액세스 토큰 재발급을 위한 장기 인증 수단
- 특징:
- 긴 유효기간 (일반적으로 7일)
- 데이터베이스에 암호화하여 저장
- 액세스 토큰 만료 시 새 토큰 발급에만 사용
- 저장 위치: HttpOnly 쿠키 (권장)
2. 사용자 인증 시나리오
회원가입 및 로그인
-
회원가입:
- 사용자 정보 입력 후 계정 생성
- 비밀번호는 암호화하여 저장
-
로그인:
- 사용자 인증 후 액세스 토큰과 리프레시 토큰 발급
- 리프레시 토큰은 암호화하여 데이터베이스에 저장
- 두 토큰을 클라이언트에 반환
인증된 요청 처리
-
보호된 리소스 접근:
- 클라이언트는 요청 헤더에 액세스 토큰을 포함:
Authorization: Bearer [access_token]
- 서버는 JWT 검증 후 요청 처리
- 클라이언트는 요청 헤더에 액세스 토큰을 포함:
-
액세스 토큰 만료:
- 서버는 401 Unauthorized 응답 반환
- 클라이언트는 리프레시 토큰을 사용하여 새 토큰 요청
토큰 갱신 프로세스
-
토큰 재발급 요청:
- 클라이언트는 리프레시 토큰으로 갱신 요청
- 서버는 리프레시 토큰 검증 및 데이터베이스 저장 값과 비교
-
새 토큰 발급:
- 새 액세스 토큰과 리프레시 토큰 생성
- 데이터베이스의 리프레시 토큰 업데이트
- 새 토큰을 클라이언트에 반환
로그아웃
- 로그아웃 처리:
- 데이터베이스에서 사용자의 리프레시 토큰을 null로 설정
- 클라이언트는 저장된 토큰 삭제
3. 액세스 토큰 탈취 위험
위험 요소
- 토큰 유효 기간(15분) 동안 공격자는 사용자로 위장 가능
- 보호된 리소스에 접근하여 데이터 조회/수정/삭제 가능
- 개인 정보 유출 위험
제한 요소
- 액세스 토큰만으로는 리프레시 토큰을 재발급 받을 수 없음
- 리프레시 토큰과 액세스 토큰은 다른 비밀 키로 서명됨
- 리프레시 API는 액세스 토큰을 인정하지 않음
- 15분 후 자동 만료되어 추가 피해 방지
대응 방안
- 짧은 유효 기간 설정으로 피해 시간 최소화
- 토큰 취소(블랙리스트) 메커니즘 구현
- 중요 작업에 추가 인증 요구
- 이상 활동 모니터링 및 알림
4. 액세스 토큰과 리프레시 토큰 모두 탈취 시 위험
심각한 위험 요소
- 무기한 접근 가능성:
- 리프레시 토큰으로 새 액세스 토큰과 리프레시 토큰을 지속적으로 재발급 가능
- 기본 구현에서는 리프레시 토큰 체인을 통해 영구적 접근 가능
- 장기간 계정 탈취 및 지속적인 피해
- 탐지가 어려워 사용자가 인지하기 어려움
취약점: 리프레시 토큰 체인 문제
- 리프레시 토큰 갱신 시 새로운 7일 유효기간의 토큰 발급
- 만료 전 갱신을 반복하면 이론적으로 무기한 사용 가능
- 재인증 없이 지속적인 접근 권한 유지
5. 보안 강화 방안
토큰 수명 관리
- 절대 만료일 설정:
- 리프레시 토큰에 최대 수명 제한 (예: 최초 로그인 후 30일)
- 정기적인 재인증 강제
토큰 사용 모니터링
- 토큰 순환(Token Rotation):
- 리프레시 토큰은 한 번만 사용 가능하도록 구현
- 사용 시 새 토큰 발급 및 이전 토큰 즉시 무효화
- 토큰 패밀리(Token Family):
- 같은 세션의 토큰들을 그룹화하여 관리
- 의심스러운 사용 감지 시 전체 패밀리 무효화
다층 보안
- 2단계 인증(2FA) 도입:
- 중요 작업에 추가 인증 요구
- 비정상 접근 패턴 감지 시 추가 인증 요청
- 비정상 패턴 감지:
- IP, 디바이스, 사용 패턴 모니터링
- AI 기반 이상 탐지 시스템 활용
사용자 알림 및 제어
- 로그인 발생 시 이메일/SMS 알림
- "모든 기기에서 로그아웃" 기능 제공
- 최근 계정 활동 히스토리 제공
인프라 보안
- HTTPS 강제 적용
- 토큰 전송 시 보안 채널 사용
- 중요 작업 로깅 및 감사
결론
JWT 기반 토큰 인증은 효율적이지만 적절한 보안 조치 없이 구현하면 심각한 취약점을 가질 수 있습니다. 액세스 토큰의 짧은 수명, 리프레시 토큰의 안전한 관리, 절대 만료일 설정, 토큰 순환 기법, 이상 탐지 등의 보안 조치를 함께 구현하여 안전한 인증 시스템을 구축해야 합니다.
사용자 측면에서도 안전한 비밀번호 사용, 공개 네트워크에서의 민감한 활동 자제, 로그인 알림 확인, 주기적인 비밀번호 변경 등의 보안 습관이 중요합니다.