

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 권한 부여 코드 부여에서 PKCE 사용
<a name="using-pkce-in-authorization-code"></a>

Amazon Cognito는 권한 부여 코드 부여에서 PKCE(Proof Key for Code Exchange) 인증을 지원합니다. PKCE는 퍼블릭 클라이언트에 대한 OAuth 2.0 권한 부여 코드 권한 부여의 확장입니다. PKCE는 가로채기된 권한 부여 코드의 사용을 방지합니다.

## Amazon Cognito가 PKCE를 사용하는 방법
<a name="how-pkce-works"></a>

PKCE로 인증을 시작하려면 애플리케이션이 고유한 문자열 값을 생성해야 합니다. 이 문자열은 Amazon Cognito가 초기 권한 부여를 요청하는 클라이언트를 토큰에 대한 권한 부여 코드를 교환하는 클라이언트와 비교하는 데 사용하는 보안 암호 값인 코드 검증자입니다.

앱은 코드 검증자 문자열에 SHA256 해시를 적용하고 결과를 base64로 인코딩해야 합니다. 해시된 문자열을 요청 본문의 `code_challenge` 파라미터로 [권한 부여 엔드포인트](authorization-endpoint.md)에 전달합니다. 앱이 토큰에 대한 권한 부여 코드를 교환하는 경우 [Token 엔드포인트](token-endpoint.md)에 대한 요청 본문에 `code_verifier` 파라미터로 일반 텍스트의 코드 검증자 문자열을 포함해야 합니다. Amazon Cognito는 코드 검증자에서 동일한 해시 및 인코딩 작업을 수행합니다. Amazon Cognito는 코드 검증자가 권한 부여 요청에서 받은 것과 동일한 코드 챌린지를 초래하는 것으로 확인되는 경우에만 ID, 액세스 및 새로 고침 토큰을 반환합니다.

**PKCE를 사용하여 권한 부여 흐름을 구현하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)을 엽니다. 메시지가 표시되면 자격 AWS 증명을 입력합니다.

1. [**사용자 풀(User Pools)**]을 선택합니다.

1. 목록에서 기존 사용자 풀을 선택하거나 사용자 풀을 생성합니다. 사용자 풀을 생성하는 경우 마법사 중에 앱 클라이언트를 설정하고 관리형 로그인을 구성하라는 메시지가 표시됩니다.

   1. 새로운 사용자 풀을 생성하는 경우, 가이드 설정 중에 앱 클라이언트를 설정하고 관리형 로그인을 구성합니다.

   1. 기존 사용자 풀을 구성하는 경우 [도메인](cognito-user-pools-assign-domain.md)과 [퍼블릭 앱 클라이언트](user-pool-settings-client-apps.md)를 아직 추가하지 않았다면 추가합니다.

1. 무작위 영숫자 문자열, 일반적으로 [UUID](cognito-terms.md#terms-uuid)(범용 고유 식별자)를 생성하여 PKCE에 대한 코드 챌린지를 생성합니다. 이 문자열은 요청에서 [Token 엔드포인트](token-endpoint.md)에 제출할 `code_verifier` 파라미터의 값입니다.

1. SHA256 알고리즘으로 `code_verifier` 문자열을 해시합니다. 해싱 작업의 결과를 base64로 인코딩합니다. 이 문자열은 요청에서 [권한 부여 엔드포인트](authorization-endpoint.md)에 제출할 `code_challenge` 파라미터의 값입니다.

   다음 Python 예시에서는 `code_verifier`를 생성하고 `code_challenge`를 계산합니다.

   ```
   #!/usr/bin/env python3
   
   import secrets
   from base64 import urlsafe_b64encode
   from hashlib import sha256
   from string import ascii_letters
   from string import digits
   
   # use the secrets module for cryptographically strong random values
   alphabet = ascii_letters + digits
   code_verifier = ''.join(secrets.choice(alphabet) for _ in range(128))
   code_verifier_hash = sha256(code_verifier.encode()).digest()
   code_challenge = urlsafe_b64encode(code_verifier_hash).decode().rstrip('=')
   
   print(f"code challenge: {code_challenge}")
   print(f"code verifier: {code_verifier}")
   ```

   다음은 Python 스크립트의 출력 예시입니다.

   ```
   code challenge: Eh0mg-OZv7BAyo-tdv_vYamx1boOYDulDklyXoMDtLg
   code verifier: 9D-aW_iygXrgQcWJd0y0tNVMPSXSChIc2xceDhvYVdGLCBk-JWFTmBNjvKSdOrjTTYazOFbUmrFERrjWx6oKtK2b6z_x4_gHBDlr4K1mRFGyE8yA-05-_v7Dxf3EIYJH
   ```

1. PKCE를 통한 권한 부여 코드 부여 요청으로 관리형 로그인을 완료합니다. 다음은 URL의 예입니다.

   ```
   https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?response_type=code&client_id=1example23456789&redirect_uri=https://www.example.com&code_challenge=Eh0mg-OZv7BAyo-tdv_vYamx1boOYDulDklyXoMDtLg&code_challenge_method=S256
   ```

1. 권한 부여 `code`를 수집하고 토큰 엔드포인트를 사용하여 토큰으로 교환합니다. 다음은 요청 예제입니다.

   ```
   POST /oauth2/token HTTP/1.1
   Host: mydomain.auth.us-east-1.amazoncognito.com
   Content-Type: application/x-www-form-urlencoded
   Content-Length: 296
   
   redirect_uri=https%3A%2F%2Fwww.example.com&
   client_id=1example23456789&
   code=7378f445-c87f-400c-855e-0297d072ff03&
   grant_type=authorization_code&
   code_verifier=9D-aW_iygXrgQcWJd0y0tNVMPSXSChIc2xceDhvYVdGLCBk-JWFTmBNjvKSdOrjTTYazOFbUmrFERrjWx6oKtK2b6z_x4_gHBDlr4K1mRFGyE8yA-05-_v7Dxf3EIYJH
   ```

1. 응답을 검토합니다. 여기에는 ID, 액세스 및 새로 고침 토큰이 포함됩니다. Amazon Cognito 사용자 풀 토큰 사용에 대한 자세한 내용은 [사용자 풀 JSON 웹 토큰(JWT) 이해](amazon-cognito-user-pools-using-tokens-with-identity-providers.md) 섹션을 참조하세요.