Access Token을 JWT로 발급할 때, 토큰을 stateless하게 검증하면 즉시 폐기(로그아웃, 탈취 대응)가 어렵습니다. JWT의 stateless 검증 이점을 최대한 유지하면서 토큰 무효화(revocation)를 구현하려면 어떤 설계 전략들을 고려할 수 있나요?
힌트 · JWT의 stateless 장점과 즉시 폐기 요구가 충돌하는 지점, 블랙리스트/짧은 만료+리프레시/토큰 버전 등의 트레이드오프 관점에서 접근하세요.
모범답안
JWT의 stateless 장점을 유지하면서 즉시 폐기를 구현하는 것은 흥미로운 문제입니다. 몇 가지 전략을 고려해볼 수 있습니다.
가장 일반적인 접근은 Refresh Token을 사용하는 것입니다. Access Token은 짧게 만료시키고, 사용자가 로그아웃하거나 토큰이 탈취되었다고 의심될 때 Refresh Token을 무효화하는 방식입니다. Refresh Token은 서버 측에서 관리하며, 유효한 Refresh Token이 있어야 새로운 Access Token을 발급받을 수 있습니다.
또 다른 방법은 Token Blacklist를 사용하는 것입니다. 로그아웃하거나 토큰을 무효화해야 할 때, 해당 토큰의 ID(jti 클레임 등)를 서버의 캐시나 데이터베이스에 블랙리스트로 등록합니다. Access Token 검증 시 이 블랙리스트를 확인하여 무효화된 토큰인지 판단하는 거죠. 다만, 이 방법은 stateless의 장점을 일부 희생하게 됩니다.
짧은 만료 시간을 가진 Access Token을 사용하는 것도 방법입니다. 만료 시간을 매우 짧게 설정하면 토큰이 탈취되더라도 유효한 시간이 짧아 피해를 최소화할 수 있습니다. 물론, 사용자 경험을 위해 Refresh Token과 함께 사용해야 합니다.
마지막으로, 토큰 버전 관리를 고려할 수 있습니다. 사용자별로 토큰 버전을 관리하고, 로그아웃 시 해당 사용자의 토큰 버전을 업데이트하는 방식입니다. Access Token 검증 시 현재 사용자의 토큰 버전과 일치하는지 확인하는 거죠.
각 전략마다 장단점이 있으므로, 서비스의 요구사항과 트레이드오프를 고려하여 적절한 조합을 선택하는 것이 중요합니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 웹 보안 면접 질문
- SSRF(Server-Side Request Forgery) 공격이란 무엇이고, 방어 방법은?
- Zero Trust 보안 모델이란 무엇이며, 기존 경계 보안과 어떻게 다른가요?
- 보안 취약점 공개 정책(Responsible Disclosure)이란 무엇이며, 왜 중요한가요?
- OAuth2 Authorization Code Grant에서 PKCE(Proof Key for Code Exchange)가 도입된 배경과, code_verifier/code_challenge가 인가 코드 탈취(authorization code interception) 공격을 어떻게 막는지 설명해주세요. SPA나 모바일 같은 public client에서 특히 중요한 이유는 무엇인가요?
- OIDC(OpenID Connect)에서 ID Token과 OAuth2의 Access Token은 목적과 검증 방식이 다릅니다. 두 토큰의 역할 차이를 설명하고, 클라이언트가 Access Token을 ID Token처럼 사용하거나 그 반대로 사용할 때 발생할 수 있는 보안 문제를 설명해주세요.
- JWT 서명 검증 시 발생할 수 있는 alg 헤더 관련 취약점들(alg:none 허용, RS256으로 발급한 토큰을 HS256으로 검증하면서 공개키를 비밀키로 악용하는 key confusion 공격)을 설명하고, 검증 로직을 어떻게 안전하게 구현해야 하는지 설명해주세요.