PKCE란?
proof key for code exchange
OAuth2에서 Authorization code flow 를 더 안전하게 만들기 위해 고안된 보안 메커니즘
Authorization Code Flow 의 문제점
Authorization Code Flow는
- 앱이 사용자에게 로그인 페이지를 열고
- 로그인 후 code를 redirect로 전달받고
- 그 code를 가지고 서버에서 토큰을 받아오는 구조
→ 이 과정에서
- code가 노출되면 해커가 가로채서 토큰을 받아갈 수 있음
- 모바일 앱이나 SPA는 client_secret을 숨기기 어려움
- 브라우저 히스토리, 네트워크 로그 등에서 탈취 가능
어떻게 PKCE가 해결 할까?
앱이 인증 요청할 때 "나는 이 인증 코드를 요청한 진짜 앱이다" 라는 증명(Proof)를 같이 보낸다.
code_verifier | 앱이 만든 랜덤 문자열 (증명본 원본) |
code_challenge | code_verifier를 SHA256으로 해시한 값 (서버로 전달) |
위 도식은 PKCE (Proof Key for Code Exchange)를 사용하는 OAuth2 Authorization Code Flow의 전체 과정을 정리한 것입니다.
모바일 앱이나 SPA 같은 공개 클라이언트 환경에서는 client_secret을 안전하게 보관하기 어렵기 때문에, PKCE를 통해 code를 요청한 주체가 토큰 요청도 같은 주체라는 것을 증명하게 됩니다.
- 클라이언트는 먼저 code_verifier를 생성하고, 이를 기반으로 code_challenge를 계산해 Authorization Server(Hydra)에 인증 요청을 보냅니다.
- Authorization Server는 사용자가 로그인하지 않은 경우, 로그인 UI를 제공하는 Identity Provider(예: Ory Kratos)로 redirect합니다.
- 사용자가 로그인하면, Hydra는 code를 발급하고 클라이언트의 redirect_uri로 전달합니다.
- 클라이언트는 받은 code와 함께 code_verifier를 사용해 토큰을 요청하며, 서버는 이 값을 검증하여 access token 또는 ID token을 발급합니다.
이 과정에서 state 파라미터는 CSRF 공격을 방지하기 위해 사용되며, 클라이언트가 임의의 값을 설정하여 요청마다 다르게 유지하는 것이 권장됩니다.
PKCE는 별도의 client secret 없이도 안전하게 인증 흐름을 구성할 수 있게 해 주며, 특히 모바일/SPA 환경에서는 사실상 필수적인 보안 구성입니다.
PKCE 구현 시 주의할 점
- code_challenge_method는 반드시 `S256`(SHA256)을 쓰는 게 보안상 안전하며, 대부분의 Authorization Server는 이 방법만 지원합니다.
- code_verifier는 클라이언트가 임의로 만든 값이며, 길이는 43~128자 사이의 랜덤 문자열이 좋습니다.
- redirect_uri는 사전에 Authorization Server에 등록된 값과 정확히 일치해야 합니다. 특히 모바일 앱의 딥링크는 scheme까지 포함해 등록해야 합니다.
- CSRF 방지를 위해 항상 state 파라미터를 설정하고, 응답 시 값이 일치하는지 확인해야 합니다.
- 토큰 요청 시 client_secret은 사용하지 않습니다 (token_endpoint_auth_method=none).
'Backend · Infra' 카테고리의 다른 글
Figma 살 돈이없다면? Penpot self-hosting으로 대체하자 (3) | 2025.07.21 |
---|---|
MySQL부터 Qdrant 까지 DB 종류 한눈에 보기 (1) | 2025.07.09 |
[MySQL InnoDB] 외래키(Foreign Key) 설정 시 주의사항 (0) | 2025.06.16 |
docker 를 티기고 티기는 WSL(Ubuntu) + docker cli + git에 이미지 올리기 (0) | 2025.05.12 |
OIDC란? Ory를 활용한 인증 알아보기 (0) | 2025.02.11 |