OAuth 2.0의 주요 취약점 중 하나인 Authorization Code 탈취를 막기 위한 보안 계층으로, 2015년 RFC 7636에서 표준화되었다.
기존 OAuth 2.0 흐름에서는, 사용자가 로그인한 뒤 Authorization Code가 다음과 같이 리다이렉트 URL을 통해 전달된다:
https://yourapp.com/callback?code=abc123xyz
이 코드는:
을 통해 제3자에 의해 탈취될 수 있음
→ 탈취한 공격자가 이 code를 Google 등에 보내면 access_token, id_token을 받아 사용자 계정을 탈취할 수 있음
PKCE는 다음 두 가지 값을 중심으로 동작한다:
| 항목 | 설명 |
|---|---|
| code_verifier | 클라이언트가 생성하는 고유한 임의 문자열 (비밀번호 역할) |
| code_challenge | code_verifier를 SHA256 해시 후 base64-url 인코딩한 값 |
/authorize?response_type=code
&code_challenge=abcXYZ
&code_challenge_method=S256
POST /token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=abc123xyz
&code_verifier=purelyRandomValue
O. PKCE를 사용해도 Authorization Code 자체는 여전히 브라우저 주소창에 노출된다.
하지만 이제 그 코드만으로는 access_token을 받을 수 없다.
왜냐하면:
| 공격 시도 | PKCE 없이 | PKCE 적용 시 |
|---|---|---|
| Authorization Code 탈취 | 토큰 발급 가능 → 계정 탈취 | code_verifier 없으면 토큰 발급 불가 |
| 중간자 공격 (MITM) | code 탈취 후 토큰 교환 가능 | code_verifier 없으면 무력화 |
| 악성 확장 프로그램 | 주소창에서 code 추출 가능 | code만으론 무용지물 |