브라우저 세션에 JWT를 사용하지 마세요: 논쟁 분석

이 논쟁의 핵심 결론은 JSON Web Tokens (JWTs)가 서비스 간 통신 및 수명이 짧은 인증 캐시에는 매우 효과적이지만, 브라우저 기반 사용자 세션에는 종번 잘못된 도구라는 점입니다. 주요 갈등은 무상태성(statelessness)의 인지된 이점과 세션 취소의 실질적인 필요성 사이의 절충안에서 발생합니다.

브라우저 세션을 위한 JWT 반대론

JWT는 설계상 무상태(stateless)이기 때문에 사용자 세션에 부적합하다는 비판을 자주 받습니다. 이는 중요한 보안 격차를 만듭니다: 시스템에 상태를 다시 도입하지 않고는 토큰의 만료일 전에 토큰을 무효화할 수 없다는 점입니다.

취소의 딜레마

사용자가 로그아웃하거나 세션이 침해되면, 무상태 JWT는 Time-to-Live (TTL)가 만료될 때까지 유효합니다. 이를 해결하기 위해 개발자들은 종종 무효화된 토큰의 "revocation list" (또는 blacklist)를 구현합니다. 그러나 커뮤니티 구성원들이 언급했듯이, 보안을 보장하기 위해 무효화된 토큰의 상태 저장 목록을 유지 관리한다면, 이는 사실상 상태를 다시 도입한 것이며, 전통적인 세션 쿠키를 사용하는 것보다 JWT를 사용하는 주요 아키텍처적 이점을 무력화하는 것입니다.

복잡성 vs 단순성

많은 애플리케이션에서 서버가 데이터베이스에 세션 ID를 저장하고 모든 요청마다 이를 검증하는 전통적인 세션 쿠키 방식이 더 단순하고 안전합니다. 이 접근 방식은 클라이언트 측의 암호화 서명 및 검증에 따른 오버헤드 없이 즉각적인 세션 종료와 사용자 상태의 용이한 관관리가 가능합니다.

JWT 찬성론 및 대안적 구현

비판에도 불구하고, 많은 엔지니어들은 특정 제약 조건과 패턴을 사용할 때 JWT가 적절하다고 주장합니다.

서비스 간 통신

JWT가 마이크로서비스 간의 내부 통신에 탁월하다는 강력한 합의가 있습니다. 이러한 시나리오에서 중앙 인증 서비스는 토큰을 발행(mint)할 수 있으며, 하위 서비스들은 모든 요청마다 중앙 데이터베이스를 조회할 필요 없이 공개 키 (RS256)를 사용하여 이를 검증할 수 있습니다. 이는 지연 시간을 줄이고 하위 서비스가 인증 데이터베이스에 직접 접근할 필요가 없도록 방지합니다.

짧은 수명의 토큰 및 리프레시 패턴

무상태성의 위험을 완화하기 위해, 일부 개발자들은 리프레시 토큰 시스템과 결합된 매우 짧은 수명의 액세스 토큰 (예: 5분)을 사용합니다.

"I use 5 minutes. Most sessions on my site are 4-10 minutes. Worst case scenario, a malicious user is able to access certain read-only resources for a few minutes."

이 접근 방식은 모든 단일 요청에 대해 데이터베이스 조회를 피함으로써 성능상의 이점을 유지하면서도, 침해된 토큰의 취약점 노출 기간을 제한합니다.

고급 취소 전략

일부에서는 JWT를 위한 취소 목록이 전체 세션 저장소보다 실제로 더 효율적이라고 주장합니다. 모든 활성 세션이 아닌 무효화된 토ken만 추적하면 되기 때문에, 쿼리되는 데이터셋이 훨씬 작습니다. 또한, minimum_issued_at과 같은 패턴을 사용하여 특정 타임스탬프 이전(예: "모든 기기에서 로그아웃" 이벤트)에 발행된 모든 토큰을 무효화할 수 있으며, 개별 토큰 ID를 추적할 필요가 없습니다.

대안 및 산업 표준

논쟁이 JWT vs 세션에 초점을 맞추고 있는 동안, 일부 기술 기여자들은 더 현대적인 표준으로의 이동을 제안합니다:

  • PASETO (Platform-Agnostic Security Tokens): JWT 사양의 일부 설계 결상의점을 피하고 구현 오류의 위험을 줄이기 때문에 JWT의 더 안전한 대안으로 제안됩니다.
  • JWE (JSON Web Encryption): 표준 JWT는 서명(encoded)만 되고 암호화되지 않기 때문에, 민감한 데이터가 토큰 내에 저장되어야 하는 경우 권장됩니다.

사용 사례 요약

사용 사례 권장 접근 방식 이유
브라우저 사용자 세션 세션 쿠키 즉각적인 취소, 낮은 복잡성
마이크로서비스 / API JWTs 결합 해제된 인증, 데이터베이스 부하 감소
고보안 작업 재인증 토큰 상태와 관계없이 비밀번호/MFA를 요구함
내부 서비스 인증 PASETO / JWT 표준화됨, 암호화적으로 검증됨
}

Sources