보안 · 심화
JWT 서명 검증 시 발생할 수 있는 alg 헤더 관련 취약점들(alg:none 허용, RS256으로 발급한 토큰을 HS256으로 검증하면서 공개키를 비밀키로 악용하는 key confusion 공격)을 설명하고, 검증 로직을 어떻게 안전하게 구현해야 하는지 설명해주세요.
힌트 · 토큰의 alg 헤더를 신뢰하지 않고 서버가 기대하는 알고리즘을 강제하는 검증 설계 관점에서 접근하세요.
alg:noneKey ConfusionRS256HS256공개키/비밀키
모범답안
JWT 서명 검증 시 alg 헤더 관련 취약점은 크게 두 가지입니다.
첫째, alg:none 허용 취약점입니다. 이는 서명 없이 토큰을 발급하도록 허용하여, 공격자가 토큰의 페이로드를 조작하고 서명 없이도 유효한 토큰처럼 사용할 수 있게 합니다.
둘째, Key Confusion 공격입니다. RS256으로 발급된 토큰을 HS256으로 검증할 때 발생하며, 공격자는 RS256의 공개키를 HS256의 비밀키로 사용하여 토큰을 위조할 수 있습니다.
이러한 취약점을 방지하기 위해 검증 로직은 토큰의 alg 헤더를 신뢰하지 않고, 서버가 기대하는 특정 알고리즘(예: RS256)만을 강제해야 합니다. 즉, 토큰의 alg 값이 서버에서 설정한 허용 알고리즘 목록에 없으면 즉시 거부해야 합니다. 또한, RS256 검증 시에는 반드시 공개키를 사용하고, HS256 검증 시에는 반드시 비밀키를 사용하도록 명확히 구분하여 구현해야 합니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 웹 보안 면접 질문
- Access Token을 JWT로 발급할 때, 토큰을 stateless하게 검증하면 즉시 폐기(로그아웃, 탈취 대응)가 어렵습니다. JWT의 stateless 검증 이점을 최대한 유지하면서 토큰 무효화(revocation)를 구현하려면 어떤 설계 전략들을 고려할 수 있나요?
- 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처럼 사용하거나 그 반대로 사용할 때 발생할 수 있는 보안 문제를 설명해주세요.