PKCE란?
PKCE(Proof Key for Code Exchange)는 OAuth 2.0 인증 과정에서 보안을 강화하기 위한 확장 규격이에요. 특히 공개 클라이언트(public client), 예를 들어 모바일 앱이나 SPA(Single Page Application)처럼 클라이언트 시크릿을 안전하게 보관하기 어려운 환경에서 많이 사용됩니다.
왜 필요한가?
일반 OAuth 2.0 Authorization Code Flow는 Authorization Code
를 받아서 액세스 토큰으로 교환하는 방식이에요. 그런데 이 과정에서 코드 탈취 공격(Authorization Code Interception Attack)이 일어날 수 있습니다. 예를 들어 공격자가 사용자가 받은 Authorization Code
를 가로채면, 토큰 서버로 보내서 액세스 토큰을 받아내 버릴 수 있죠.
PKCE의 원리
PKCE는 이 문제를 막기 위해 임시 암호(코드 검증 값)를 사용하는 방법입니다.
Code Verifier 생성 클라이언트는 임의의 고유 문자열(고난이도 랜덤 값)을 생성합니다. 이를 code_verifier라고 해요.
Code Challenge 생성
code_verifier
를 해싱(SHA-256 등)해서 code_challenge를 만듭니다. (만약 SHA-256 지원 안 하면 plain 방식도 가능)인증 요청 시 전송 사용자가 로그인할 때 클라이언트는
code_challenge
를 Authorization Server에 보냅니다.토큰 요청 시 검증 이후
Authorization Code
를 받은 뒤 토큰을 교환할 때, 클라이언트는 원래의code_verifier
를 Authorization Server에 보냅니다. 서버는 이 값을 해시해, 처음 보낸code_challenge
와 일치하는지 확인합니다.
→ 이렇게 하면 공격자가 Authorization Code
를 탈취하더라도 code_verifier가 없으면 토큰 교환을 못 하게 됩니다.
정리
PKCE = OAuth 2.0 Authorization Code Flow + 추가 보안
주로 모바일 앱, SPA 등에서 필수
과정:
code_verifier
→code_challenge
→ 로그인 → 토큰 교환 시 검증