OAuth2 Authorization Code Grant에서 PKCE(Proof Key for Code Exchange)가 도입된 배경과, code_verifier/code_challenge가 인가 코드 탈취(authorization code interception) 공격을 어떻게 막는지 설명해주세요. SPA나 모바일 같은 public client에서 특히 중요한 이유는 무엇인가요?
힌트 · client secret을 안전하게 보관할 수 없는 public client의 위협 모델과, code_verifier가 동적 비밀로 작동하는 원리 관점에서 접근하세요.
모범답안
OAuth2 Authorization Code Grant는 클라이언트가 사용자 대신 리소스 서버에 접근할 수 있도록 하는 강력한 메커니즘입니다. 하지만 SPA나 모바일 앱 같은 public client는 클라이언트 비밀(client secret)을 안전하게 저장할 방법이 없기 때문에, 인가 코드 탈취 공격에 취약했습니다.
PKCE는 이러한 public client의 보안을 강화하기 위해 도입되었습니다. Authorization Code Grant 과정에서 클라이언트는 code_verifier라는 임의의 문자열을 생성하고, 이를 해싱한 code_challenge를 인가 요청 시 함께 보냅니다. 인가 서버는 이 code_challenge를 저장해 둡니다.
이후 클라이언트가 인가 코드를 받아 토큰을 요청할 때, 저장해 두었던 code_verifier를 함께 전송합니다. 인가 서버는 받은 code_verifier를 저장된 code_challenge와 동일한 방식으로 해싱하여 일치하는지 확인합니다. 만약 인가 코드가 중간에 탈취되더라도, 공격자는 code_verifier를 알 수 없기 때문에 토큰을 발급받을 수 없습니다. 즉, code_verifier는 동적인 비밀처럼 작동하여 인가 코드의 유효성을 검증하는 역할을 합니다.
SPA나 모바일 앱은 클라이언트 비밀을 코드에 직접 포함시키거나 안전하게 저장하기 어렵기 때문에, code_verifier는 이러한 환경에서 인가 코드 탈취 공격을 효과적으로 방어하는 필수적인 보안 계층입니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 웹 보안 면접 질문
- Zero Trust 보안 모델이란 무엇이며, 기존 경계 보안과 어떻게 다른가요?
- 보안 취약점 공개 정책(Responsible Disclosure)이란 무엇이며, 왜 중요한가요?
- Access Token을 JWT로 발급할 때, 토큰을 stateless하게 검증하면 즉시 폐기(로그아웃, 탈취 대응)가 어렵습니다. JWT의 stateless 검증 이점을 최대한 유지하면서 토큰 무효화(revocation)를 구현하려면 어떤 설계 전략들을 고려할 수 있나요?
- OIDC(OpenID Connect)에서 ID Token과 OAuth2의 Access Token은 목적과 검증 방식이 다릅니다. 두 토큰의 역할 차이를 설명하고, 클라이언트가 Access Token을 ID Token처럼 사용하거나 그 반대로 사용할 때 발생할 수 있는 보안 문제를 설명해주세요.
- JWT 서명 검증 시 발생할 수 있는 alg 헤더 관련 취약점들(alg:none 허용, RS256으로 발급한 토큰을 HS256으로 검증하면서 공개키를 비밀키로 악용하는 key confusion 공격)을 설명하고, 검증 로직을 어떻게 안전하게 구현해야 하는지 설명해주세요.