Cryptology Academy · 강의

PKCE: 공개 클라이언트 보호

Proof Key for Code Exchange를 이해하고 이것이 인증 코드 가로채기 공격을 방지하는 방식을 학습합니다.

레슨 2/413개 단계

PKCE: 공개 클라이언트 보호은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cryptology Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

인가 코드 가로채기

PKCE가 없으면 모바일 애플리케이션은 인가 코드 가로채기 공격에 취약합니다. 인가 서버가 인가 코드를 앱에 등록된 사용자 지정 URI 스킴(예: myapp://callback)으로 리디렉션할 때, 동일한 장치에서 같은 URI 스킴을 등록한 악성 앱이 리디렉션을 가로채 코드를 탈취할 수 있습니다.

가로채기가 작동하는 방식

공격 방식은 다음과 같습니다. 악성 앱이 정상 앱과 동일한 사용자 지정 URI 스킴을 등록합니다. 인가 서버가 코드를 myapp://callback으로 리디렉션하면 OS는 두 앱을 모두 처리기로 표시할 수 있습니다. 사용자가 악성 앱을 선택하거나 OS가 악성 앱을 기본 처리기로 지정하면 공격자는 인가 코드를 받고, 클라이언트 비밀 값을 몰라도 이를 토큰으로 교환할 수 있습니다.

PKCE 코드 검증자

PKCE(RFC 7636)는 인가 코드 흐름에 동적으로 생성되는 비밀 값을 추가합니다. 흐름을 시작하기 전에 클라이언트는 코드 검증자라고 하는 암호학적으로 무작위인 43~128자의 문자열을 생성합니다. 이 문자열은 각 인가 요청마다 고유하며 토큰 교환 단계 전까지 전송되지 않습니다.

코드 챌린지 계산

클라이언트는 검증자로부터 코드 챌린지를 계산합니다. code_challenge = BASE64URL(SHA256(code_verifier)). RFC 7636에서는 SHA256을 필수 방식으로 지정합니다("plain" 방식은 검증자를 직접 전송하므로 권장되지 않습니다). 코드 챌린지는 검증자를 단방향으로 변환한 값이므로, 챌린지를 알아도 검증자를 알아낼 수 없습니다.

인가 요청에 코드 챌린지 포함

인가 요청에는 두 개의 추가 매개변수가 포함됩니다. "code_challenge=BASE64URL(SHA256(verifier))&code_challenge_method=S256". 인가 서버는 발급된 인가 코드와 연결된 코드 챌린지를 저장합니다. 이 단계에서는 가로챌 수 있는 비밀 값이 서버로 전송되지 않습니다.

코드 검증자를 사용한 토큰 교환

토큰 교환 중(토큰 엔드포인트로 POST) 클라이언트는 인가 코드와 함께 "code_verifier=ORIGINAL_RANDOM_STRING"을 포함합니다. 인가 서버는 BASE64URL(SHA256(code_verifier))을 계산하고 저장된 code_challenge와 일치하는지 확인합니다. 검증자를 생성한 정상 클라이언트만 이 검사를 통과할 수 있습니다.

PKCE를 사용하면 가로채기가 실패하는 이유

공격자가 인가 코드를 가로채도 받는 것은 코드와 공개된 코드 챌린지뿐입니다. 코드를 토큰으로 교환하려면 코드 검증자를 제공해야 합니다. 검증자는 정상 클라이언트가 생성하며 토큰 교환 전까지 전송되지 않고, 토큰 교환도 안전하게 이루어지므로 공격자는 검증자를 계산하거나 가져올 수 없습니다.

PKCE로 코드 주입 방지

PKCE는 리디렉션 과정에서 공격자가 유효한 코드를 탈취한 코드로 바꾸는 권한 부여 코드 주입 공격도 방지합니다. 탈취한 코드의 챌린지는 피해자 클라이언트가 제출할 검증자와 일치하지 않으므로 토큰 교환이 실패합니다. PKCE는 여러 공격 벡터를 동시에 방어하는 심층 방어를 제공합니다.

모든 클라이언트에 PKCE 적용

RFC 7636은 처음에 클라이언트 비밀이 없는 공개 클라이언트를 위한 해결책으로 설명되었지만, OAuth 보안 BCP와 OAuth 2.1에서는 클라이언트 비밀이 있는 기밀 클라이언트를 포함한 모든 클라이언트에 PKCE를 요구합니다. PKCE는 클라이언트 인증과 독립적으로 보호 기능을 제공하므로 모든 클라이언트에 유익합니다.

OAuth 2.1에서의 PKCE

OAuth 2.1(draft-ietf-oauth-v2-1)은 OAuth 2.0 보안 BCP의 보안 모범 사례를 하나의 문서로 통합합니다. OAuth 2.1은 모든 권한 부여 코드 흐름에 PKCE를 의무화하고, 암시적 흐름을 폐기하며, 리프레시 토큰 순환을 요구합니다. PKCE는 사실상 새로운 OAuth 2.0 구현에 필요한 기준선입니다.

구현 참고 사항

PKCE를 올바르게 구현하려면 다음이 필요합니다. 검증자에 암호학적으로 안전한 난수 생성기를 사용하고(최소 32개의 난수 바이트를 생성한 후 base64url로 인코딩), 검증자를 클라이언트에 안전하게 저장하며(URL이나 로그에 저장하지 않음), S256 방식을 사용하고(plain 방식은 사용하지 않음), 토큰 교환 후 검증자를 폐기해야 합니다. 대부분의 최신 OAuth 라이브러리는 PKCE를 자동으로 처리합니다.

PKCE 코드 검증자 확인

PKCE에서 코드 검증자와 코드 챌린지는 어떤 관계입니까?

학습 요약: PKCE 보안

PKCE(RFC 7636)는 적법한 클라이언트만 알고 있는 동적으로 생성된 코드 검증자에 각 코드를 결합하여 권한 부여 코드 가로채기를 방지합니다. 검증자를 해시하여 코드 챌린지를 생성하고(공개적으로 전송), 토큰 교환에는 원래 검증자가 필요합니다. PKCE는 가로채기와 주입 공격을 모두 방지합니다. OAuth 2.1에서는 모든 권한 부여 코드 흐름에 PKCE를 요구합니다.

무료로 시작

AI 튜터와 함께 Cryptology Academy을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
67
레슨
261

자주 묻는 질문

“PKCE: 공개 클라이언트 보호” 강의는 무료인가요?

네 — “PKCE: 공개 클라이언트 보호” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“PKCE: 공개 클라이언트 보호”에서 뭘 배우나요?

Proof Key for Code Exchange를 이해하고 이것이 인증 코드 가로채기 공격을 방지하는 방식을 학습합니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“PKCE: 공개 클라이언트 보호” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. OAuth 2.0 흐름과 토큰 유형
  2. PKCE: 공개 클라이언트 보호
  3. OpenID Connect 클레임과 ID 토큰
  4. OAuth 취약점과 공격 패턴
← Cryptology Academy(으)로 돌아가기