CS Insights

동적 JWT 탈취 해킹 방어를 위한 무상태(Stateless) 아키텍처와 Redis 블랙리스트 운영의 충돌

동적 JWT 탈취 해킹 방어를 위한 무상태(Stateless) 아키텍처와 Redis 블랙리스트 운영의 충돌
사내 보안 모의 해킹 훈련 중, 화이트해커에 의해 백오피스 관리자의 권한이 담긴 JWT(JSON Web Token) 액세스 토큰이 XSS 공격으로 유출되는 시나리오가 대두되었습니다. 문제는 우리 백엔드 서버가 트래픽 병목을 줄이고자 모든 인증 체계를 완전한 서버리스 페이로드 자체 검증(무상태/Stateless) 기반으로 개편했다는 점입니다. 토큰이 털려도 이 토큰의 만료 시간(1시간)이 지날 때까지, 저희에겐 그 해커의 요청을 튕겨낼 서버 측의 '킬 스위치'가 아예 존재하지 않는다는 치명적 결함이 수면 위로 올라왔습니다. 세션을 버리고 얻은 압도적인 확장성의 이면에는 강제 무효화(Revocation) 불가능이라는 날카로운 독이 묻어 있었습니다. 이 딜레마를 타파하기 위해, 저희는 JWT의 무상태 검증 패러다임을 유지하는 한편 극도로 작고 빠른 Redis 클러스터 기반의 '무효화 블랙리스트(Blacklist)'를 예외적으로 구축하여 병행 삽입했습니다. 토큰이 유출 신고되거나 이상 행위가 감지되면 해당 JWT의 고유 JTI(토큰 ID)를 Redis 블랙리스트에 등재합니다. 모든 API 게이트웨이는 인가된 토큰이 들어올 때마다 서명 무결성을 확인한 후, 이 램(RAM) 기반의 블랙리스트 존재 여부만을 단 1밀리초 만에 빠르게 O(1) 해시로 체킹합니다. Redis 에 저장되는 데이터는 고작 128바이트 남짓의 JTI 문자열 하나일 뿐더러 TTL을 정확히 토큰의 남은 만료 시간만큼만 설정하여 가비지 관리가 오토파일럿으로 수행되도록 조율했습니다. 데이터베이스 I/O 낭비 없는 Stateless의 본질을 거의 훼손시키지 않은 채, 시스템의 상태(State)를 중앙 통제할 수 있는 하이브리드 아키텍처의 교과서적인 타협이었습니다.

Related Posts