PKCE(Proof Key for Code Exchange)는 OAuth 2.0 인증 코드 흐름에서 클라이언트 비밀 없이도 코드 가로채기를 막는 RFC 7636 표준 보안 확장이다.
AI 코딩 도구가 만든 코드에서 가장 자주 누락되며, 누락 시 인증 우회·데이터 탈취·서비스 마비로 직결된다.
이 글은 자주 발생하는 실수 패턴, 표준 구현 코드, 30초 자가진단, 24시간 패치 순서를 정리했다.
한눈에 보는 핵심
Q. PKCE를 안 쓰면 어떤 일이 벌어지나요? A. 공격자가 redirect URI를 가로채면 인증 코드를 토큰으로 교환할 수 있습니다. 모바일/SPA처럼 클라이언트 시크릿 보관이 어려운 환경에서 치명적입니다. Q. S256과 plain 중 어느 게 표준인가요? A. S256(SHA-256)이 필수입니다. plain은 RFC 7636에서 backward compat 용도이며 운영 환경 사용 금지입니다. Q. 웹 SPA에도 PKCE가 필요한가요? A. 필수입니다. OAuth 2.1 초안은 모든 클라이언트에 PKCE 강제를 명시합니다.자주 발생하는 실수 패턴
| # | 패턴 | 위험도 |
|---|---|---|
| 1 | PKCE 자체 미적용 — code_verifier 파라미터 누락 | 치명 |
| 2 | plain 알고리즘 사용 — S256 미적용 | 치명 |
| 3 | code_verifier 엔트로피 부족 (32바이트 미만) | 높음 |
| 4 | 서버 측 code_challenge 검증 누락 | 치명 |
| 5 | redirect_uri 화이트리스트 누락 + PKCE 누락 동시 발생 | 치명 |
표준 구현 코드
import secrets, hashlib, base64
# 클라이언트 — code_verifier 생성 (RFC 7636)
verifier = secrets.token_urlsafe(64) # 43-128 bytes
challenge = base64.urlsafe_b64encode(
hashlib.sha256(verifier.encode()).digest()
).decode().rstrip('=')
# Authorization 요청 — code_challenge + S256 포함
auth_url = (
f"https://provider.com/oauth/authorize"
f"?response_type=code&client_id={CLIENT_ID}"
f"&redirect_uri={REDIRECT_URI}"
f"&code_challenge={challenge}"
f"&code_challenge_method=S256"
)
# Token 교환 — code_verifier 포함
token_resp = requests.post('https://provider.com/oauth/token', data={
'grant_type': 'authorization_code',
'code': received_code,
'redirect_uri': REDIRECT_URI,
'client_id': CLIENT_ID,
'code_verifier': verifier, # 핵심
})
핵심 4요소를 모두 충족해야 결함이 사라진다.
AI 도구는 동작 코드만 출력하므로 보안 분기는 별도로 강제해야 한다.
미들웨어/데코레이터로 모든 경로에 일괄 적용이 표준이다.
30초 자가진단
# PKCE 미적용 진단
curl 'https://yourapi/oauth/authorize?response_type=code&client_id=X&redirect_uri=Y'
# code_challenge 누락 응답이 200이면 결함
# code_verifier 없이 토큰 교환 시도
curl -X POST 'https://yourapi/oauth/token' -d 'code=...&grant_type=authorization_code'
# 200 토큰이 떨어지면 결함
위 시그널이 발견되면 결함이다. RFC 7636: PKCE 참조.
24시간 패치 절차
| 순위 | 조치 |
|---|---|
| 1 | code_verifier secrets.token_urlsafe(64) 생성 + 세션 저장 |
| 2 | S256으로 code_challenge 계산 후 authorize 요청에 포함 |
| 3 | 토큰 교환 시 code_verifier 동봉 + 서버 검증 강제 |
| 4 | plain 알고리즘 비허용, S256만 화이트리스트 |
| 5 | redirect_uri 사전 등록 화이트리스트 추가 |
지금 해야 할 것
실무자: CodeScan 무료 스캔으로 30초 점검.
CISO·임원: 통합 보안 점검은 SENTRIX 30분 1:1 상담.
결함 발견 시 24시간 안에 패치 완료가 표준이다.