What is PKCE in OAuth? | Secure OAuth for Mobile & SPA
- PKCE(Pixie)는 OAuth 2.0의 보안을 강화하는 확장 기능으로, 특히 클라이언트 시크릿을 안전하게 보관할 수 없는 모바일 앱이나 SPA(Single Page Application)와 같은 공개 클라이언트에 적합하다. 🛡️
- 기존 OAuth 2.0 인증 코드 흐름의 취약점인 인증 코드 가로채기 공격을 방지하며, 각 인증 요청에 대해 일회성 검증 메커니즘을 생성하여 보안을 강화한다. 🔑
- PKCE는 코드 검증자(Code Verifier)와 코드 챌린지(Code Challenge)를 생성하며, 앱은 검증자를 비밀로 유지하고 챌린지를 인증 서버로 전송한다. 📤
- 인증 코드를 토큰으로 교환할 때 앱은 원래의 검증자를 제공하여 신원을 증명하며, 이는 각 트랜잭션마다 고유한 잠금-키 쌍을 생성하는 것과 유사하다. 🔐
- 일반적인 OAuth 2.0 흐름에서는 앱이 인증 서버로부터 받은 인증 코드를 액세스 토큰으로 교환할 때 클라이언트 시크릿이 필요하지만, PKCE는 이 시크릿 없이 검증자를 사용하여 보안을 유지한다. 🛡️
- PKCE 흐름은 앱이 먼저 코드 검증자를 생성하고, 이를 해싱하여 코드 챌린지를 만든 후, 챌린지를 인증 서버에 전송하는 방식으로 시작된다. 🔄
- 사용자가 로그인하고 권한을 부여하면 인증 서버는 인증 코드를 앱으로 다시 보내고, 앱은 이 코드를 검증자와 함께 제출하여 액세스 토큰을 요청한다. ✅
- 인증 서버는 수신된 검증자를 해싱하여 저장된 챌린지와 비교하고, 일치하면 합법적인 앱에서 요청한 것으로 판단하여 액세스 토큰을 발급한다. 🌟
- PKCE는 Instagram, Spotify, React/Vue 앱, VS Code 확장, CLI 도구 등 다양한 실제 사례에서 사용되고 있으며, 주요 ID 제공업체에서 지원 및 요구하는 표준이 되고 있다. 📱
- Gmail과 같은 Google의 자체 앱은 디바이스 바인딩과 같은 보안 플랫폼 기능을 사용하여 PKCE를 사용하지 않을 수 있지만, 타사 Gmail 앱은 공개 클라이언트인 경우 PKCE가 필수적이다. ✉️
- OAuth 2.1에서는 모든 공개 클라이언트에 대해 PKCE가 의무화될 예정이며, CAP(Continuous Access Evaluation Protocol)와 같은 혁신 기술이 PKCE와 함께 사용되고 있다. 🚀
- 새로운 애플리케이션을 구축할 때는 PKCE로 시작하는 것이 좋으며, 이는 사용자 보호 및 애플리케이션 신뢰 구축에 기여한다. 🤝
- PKCE를 사용하면 인증 코드 가로채기 공격이 발생하더라도 공격자가 코드 검증자 없이는 액세스 토큰을 얻을 수 없으므로 안전하다. 🎯
- 백엔드 앱의 경우 클라이언트 시크릿을 안전하게 저장할 수 있으므로 PKCE가 필요하지 않지만, React, SPA, 모바일 또는 데스크톱 앱의 경우 PKCE가 필수적이다. 💻