OAuth 2.1 Is Here: What Changed, What's Deprecated, and How to Migrate Your App
OAuth 2.1이 RFC 7636(PKCE), RFC 9207, RFC 9449 등 14년간의 보안 권고를 통합하면서 Implicit Grant와 ROPC 플로우를 폐기해 기존 SPA/모바일 앱의 마이그레이션 강제
AI 요약
Context
OAuth 2.0의 Implicit Grant 플로우는 접근 토큰을 URL 프래그먼트에 노출해 브라우저 히스토리, 프록시 로그, XSS 공격에 취약했다. ROPC 플로우도 클라이언트가 사용자 자격증명을 직접 처리하도록 강제해 보안 위협이 컸다. 2012년 이후 발표된 보안 RFCs들이 OAuth 2.0 스펙에 반영되지 않으면서 프로덕션 환경의 실제 보안 문제가 누적되었다.
Technical Solution
- Implicit Grant(response_type=token) 폐기 → Authorization Code + PKCE(RFC 7636) 필수로 대체: 모든 클라이언트 타입(SPA, 모바일, 서버)에서 인증 코드 교환 방식 강제
- PKCE를 모든 클라이언트에 의무화: 기존에 공개 클라이언트만 권장되던 PKCE를 기밀 클라이언트(client_secret 보유)도 필수 도입해 인증 코드 주입 공격 방어
- ROPC(Resource Owner Password Credentials) 플로우 폐기 → Authorization Code 또는 Device Authorization 플로우로 대체: 사용자 자격증명 직접 노출 제거
- Bearer 토큰을 URL 쿼리 문자열에 포함하는 것 금지 → Authorization 헤더 사용 강제: 토큰 로깅/노출 범위 최소화
- 리다이렉트 URI 와일드카드 허용 폐기 → 정확한 일치(exact-match) 필수: 개발(127.0.0.1), 스테이징, 프로덕션 각 환경을 별도로 등록
Impact
아티클에서 명시된 정량적 수치가 없음.
Key Takeaway
OAuth 2.1은 버전 업그레이드가 아닌 14년간의 실전 보안 교훈을 스펙으로 강제화한 사례로, 기술 결정이 보안 위협에 얼마나 오래 영향을 미치는지 보여준다. 마이그레이션 시점을 개발사가 자율적으로 선택하는 것이 긴급 상황에서의 강제 마이그레이션보다 훨씬 효율적이다.
실천 포인트
2024년 이전에 배포된 React/Vue SPA 또는 모바일 앱에서 OAuth를 사용 중이라면, Authorization Code + PKCE 플로우로 즉시 교체해야 한다. code_verifier를 crypto.randomBytes(32)로 생성하고 S256 해시로 code_challenge를 생성해 authorization 요청에 포함시키는 방식으로 마이그레이션하면 Implicit Grant의 토큰 노출 취약점을 근본적으로 제거할 수 있다.