

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

# 사용자 풀 JSON 웹 토큰(JWT) 이해
<a name="amazon-cognito-user-pools-using-tokens-with-identity-providers"></a>

토큰은 애플리케이션이 OIDC 인증 증명으로 사용하고 리소스에 대한 액세스를 요청하는 데 사용할 수 있는 인증 아티팩트입니다. 토큰의 클레임은 사용자에 대한 정보입니다.** ID 토큰에는 사용자 이름, 성, 이메일 주소와 같은 사용자의 신원에 대한 클레임이 포함되어 있습니다. 액세스 토큰에는 인증된 사용자가 서드 파티 API, Amazon Cognito 사용자 셀프 서비스 API 작업, [userInfo 엔드포인트](userinfo-endpoint.md)에 액세스하는 데 사용할 수 있는 `scope`과 같은 클레임이 포함되어 있습니다. 액세스 토큰과 ID 토큰에는 모두 사용자 풀의 사용자 그룹 멤버십이 포함된 `cognito:groups` 클레임이 포함되어 있습니다. 사용자 풀 그룹에 대한 자세한 내용은 [사용자 풀에 그룹 추가](cognito-user-pools-user-groups.md) 섹션을 참조하세요.

Amazon Cognito에는 새 토큰을 얻거나 기존 토큰을 취소하는 데 사용할 수 있는 새로 고침 토큰도 있습니다. [토큰을 새로 고쳐](amazon-cognito-user-pools-using-the-refresh-token.md) 새 ID와 액세스 토큰을 가져옵니다. [토큰을 취소](amazon-cognito-user-pools-using-the-refresh-token.md#amazon-cognito-identity-user-pools-revoking-all-tokens-for-user)하여 새로 고침 토큰을 통해 부여되는 사용자 액세스 권한을 취소할 수 있습니다.

Amazon Cognito는 [base64url](https://datatracker.ietf.org/doc/html/rfc4648#section-5)로 인코딩된 문자열으로 토큰을 발급합니다. 모든 Amazon Cognito ID 또는 액세스 토큰을 `base64url`에서 일반 텍스트 JSON으로 디코딩할 수 있습니다. Amazon Cognito 새로 고침 토큰은 암호화되므로 사용자 풀 사용자 및 관리자가 읽을 수 없으며 사용자 풀만 읽을 수 있습니다.

**토큰으로 인증**  
사용자가 앱에 로그인하면 Amazon Cognito가 로그인 정보를 확인합니다. 성공적으로 로그인하면 Amazon Cognito가 세션을 생성하고 인증된 사용자를 위한 ID 토큰, 액세스 토큰 및 새로 고침 토큰을 반환합니다. 이 토큰을 사용하여 Amazon API Gateway와 같은 API 및 다운스트림 리소스에 대한 액세스 권한을 사용자에게 부여할 수 있습니다. 또는 임시 AWS 보안 인증 정보로 다른 AWS 서비스에 액세스할 수 있도록 이 토큰을 교환할 수 있습니다.

![\[인증 개요\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/scenario-authentication-cup2.png)


**토큰 저장**  
앱이 다양한 크기의 토큰을 저장할 수 있어야 합니다. 토큰 크기는 추가 클레임, 인코딩 알고리즘의 변경 및 암호화 알고리즘의 변경을 포함하되 이에 국한되지 않는 이유로 변경될 수 있습니다. 사용자 풀에서 토큰 취소를 활성화하면 Amazon Cognito가 JSON 웹 토큰에 추가 클레임을 추가하여 크기를 늘립니다. 새 클레임 `origin_jti` 및 `jti`가 액세스 토큰과 ID 토큰에 추가됩니다. 토큰 취소에 대한 자세한 내용은 [토큰 철회](https://docs.aws.amazon.com/cognito/latest/developerguide/token-revocation.html)를 참조하세요.

**중요**  
모범 사례는 전송 중인 토큰 및 애플리케이션 컨텍스트의 스토리지에 있는 모든 토큰을 보호하는 것입니다. 토큰에는 사용자에 대한 개인 식별 정보와 사용자 풀에 사용하는 보안 모델에 대한 정보가 포함될 수 있습니다.

**토큰 사용자 지정**  
Amazon Cognito가 앱에 전달하도록 액세스 및 ID 토큰을 사용자 지정할 수 있습니다. [사전 토큰 생성 Lambda 트리거](user-pool-lambda-pre-token-generation.md)에서는 토큰 클레임을 추가, 수정 및 차단할 수 있습니다. 사전 토큰 생성 트리거는 Amazon Cognito가 기본 클레임 세트를 보내는 Lambda 함수입니다. 클레임에는 OAuth 2.0 범위, 사용자 풀 그룹 멤버십, 사용자 속성 등이 포함됩니다. 그러면 함수를 런타임에서 변경하고 업데이트된 토큰 클레임을 Amazon Cognito에 반환할 수 있습니다.

버전 2 이벤트를 사용한 토큰 사용자 지정에 액세스하는 경우 추가 비용이 적용됩니다. 자세한 내용은 [Amazon Cognito 요금](https://aws.amazon.com/cognito/pricing/)을 참조하세요.

**Topics**
+ [자격 증명(ID) 토큰 이해](amazon-cognito-user-pools-using-the-id-token.md)
+ [액세스 토큰 이해](amazon-cognito-user-pools-using-the-access-token.md)
+ [새로 고침 토큰](amazon-cognito-user-pools-using-the-refresh-token.md)
+ [토큰 취소로 사용자 세션 종료](token-revocation.md)
+ [JSON 웹 토큰 확인](amazon-cognito-user-pools-using-tokens-verifying-a-jwt.md)
+ [사용자 풀 토큰 만료 및 캐싱 관리](amazon-cognito-user-pools-using-tokens-caching-tokens.md)

# 자격 증명(ID) 토큰 이해
<a name="amazon-cognito-user-pools-using-the-id-token"></a>

ID 토큰은 `name`, `email`, `phone_number` 등 인증된 사용자의 자격 증명에 대한 클레임이 포함된 [JSON 웹 토큰(JWT)](https://tools.ietf.org/html/rfc7519)입니다. 애플리케이션 내에서 이 자격 증명 정보를 사용할 수 있습니다. 리소스 서버 또는 서버 애플리케이션에 사용자를 인증하는 경우에도 ID 토큰을 사용할 수 있습니다. 애플리케이션 외부에서 웹 API 작업에 ID 토큰을 사용할 수도 있습니다. 이러한 경우 ID 토큰의 서명을 확인해야 ID 토큰 내의 모든 클레임을 신뢰할 수 있습니다. [JSON 웹 토큰 확인](amazon-cognito-user-pools-using-tokens-verifying-a-jwt.md)을(를) 참조하세요.

ID 토큰 만료는 5분에서 1일 사이로 설정할 수 있습니다. 앱 클라이언트별로 이 값을 설정할 수 있습니다.

**중요**  
사용자가 관리형 로그인으로 로그인하면 Amazon Cognito는 1시간 동안 유효한 세션 쿠키를 설정합니다. 애플리케이션에서 인증을 위해 관리형 로그인을 사용하고 액세스 및 ID 토큰에 대한 최소 기간을 1시간 미만으로 지정하는 경우, 쿠키가 만료될 때까지 사용자는 유효한 세션을 유지합니다. 사용자에게 1시간 세션 동안 만료되는 토큰이 있는 경우 사용자는 재인증 없이 토큰을 새로 고칠 수 있습니다.

## ID 토큰 헤더
<a name="user-pool-id-token-header"></a>

헤더에는 키 ID(`kid`) 및 알고리즘(`alg`) 등 두 가지 정보가 포함되어 있습니다.

```
{
"kid" : "1234example=",
"alg" : "RS256"
}
```

**`kid`**  
 키 ID입니다. 이 값은 토큰의 JSON 웹 서명(JWS)을 보호하는 데 어떤 키가 사용되었는지 나타냅니다. `jwks_uri` 엔드포인트에서 사용자 풀 서명 키 ID를 볼 수 있습니다.  
`kid` 파라미터에 대한 자세한 내용은 [키 식별자(kid) 헤더 파라미터](https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-4.5)를 참조하세요.

**`alg`**  
Amazon Cognito가 액세스 토큰을 보호하는 데 사용한 암호화 알고리즘입니다. 사용자 풀은 SHA-256에서의 RSA 서명인 RS256 암호화 알고리즘을 사용합니다.  
`alg` 파라미터에 대한 자세한 내용은 [알고리즘(alg) 헤더 파라미터](https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-4.4)를 참조하세요.

## ID 토큰 기본 페이로드
<a name="user-pool-id-token-payload"></a>

이는 ID 토큰에서 나온 예시 페이로드입니다. 여기에는 인증된 사용자에 대한 클레임이 포함되어 있습니다. OpenID Connect(OIDC) 표준 클레임에 대한 자세한 내용은 [OIDC 표준 클레임](http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims) 목록을 참조하세요. [사전 토큰 생성 Lambda 트리거](user-pool-lambda-pre-token-generation.md)을 사용하여 자체 설계의 클레임을 추가할 수 있습니다.

```
<header>.{
    "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "cognito:groups": [
        "test-group-a",
        "test-group-b",
        "test-group-c"
    ],
    "email_verified": true,
    "cognito:preferred_role": "arn:aws:iam::111122223333:role/my-test-role",
    "iss": "https://cognito-idp.us-west-2.amazonaws.com/us-west-2_example",
    "cognito:username": "my-test-user",
    "middle_name": "Jane",
    "nonce": "abcdefg",
    "origin_jti": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "cognito:roles": [
        "arn:aws:iam::111122223333:role/my-test-role"
    ],
    "aud": "xxxxxxxxxxxxexample",
    "identities": [
        {
            "userId": "amzn1.account.EXAMPLE",
            "providerName": "LoginWithAmazon",
            "providerType": "LoginWithAmazon",
            "issuer": null,
            "primary": "true",
            "dateCreated": "1642699117273"
        }
    ],
    "event_id": "64f513be-32db-42b0-b78e-b02127b4f463",
    "token_use": "id",
    "auth_time": 1676312777,
    "exp": 1676316377,
    "iat": 1676312777,
    "jti": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "email": "my-test-user@example.com"
}
.<token signature>
```

**`sub`**  
인증된 사용자에 대한 고유 식별자([UUID](cognito-terms.md#terms-uuid)) 또는 제목입니다. 사용자 풀에서 사용자 이름이 고유하지 않을 수 있습니다. `sub` 클레임은 특정 사용자를 식별하는 가장 좋은 방법입니다.

**`cognito:groups`**  
사용자를 멤버로 가진 사용자 풀 그룹의 이름 배열입니다. 그룹은 앱에 표시하는 식별자가 될 수도 있고 자격 증명 풀에서 선호하는 IAM 역할에 대한 요청을 생성할 수도 있습니다.

**`cognito:preferred_role`**  
사용자의 우선순위가 가장 높은 사용자 풀 그룹과 연결한 IAM 역할의 ARN입니다. 사용자 풀이 이 역할 클레임을 선택하는 방법에 대한 자세한 내용은 [그룹에 우선 순위 값 할당](cognito-user-pools-user-groups.md#assigning-precedence-values-to-groups) 섹션을 참조하세요.

**`iss`**  
토큰을 발행한 자격 증명 공급자입니다. 클레임의 형식은 다음과 같습니다.  
`https://cognito-idp.<Region>.amazonaws.com/<your user pool ID>`

**`cognito:username`**  
사용자 풀에 있는 사용자의 사용자 이름입니다.

**`nonce`**  
`nonce` 클레임은 OAuth 2.0 `authorize` 엔드포인트에 대한 요청에 추가할 수 있는 동일한 이름의 파라미터에서 비롯됩니다. 파라미터를 추가하면 `nonce` 클레임은 Amazon Cognito가 발행하는 ID 토큰에 포함되어 있으며, 이를 사용하여 재생 공격으로부터 보호할 수 있습니다. 요청에 `nonce` 값을 제공하지 않을 경우, 사용자가 서드 파티 자격 증명 공급자를 통해 인증할 때 Amazon Cognito는 자동으로 논스를 생성 및 검증한 다음 ID 토큰에 대한 `nonce` 클레임으로 추가합니다. Amazon Cognito에서 `nonce` 클레임 구현은 [OIDC 표준](https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation)에 기반합니다.

**`origin_jti`**  
사용자의 새로 고침 토큰과 연결된 토큰 취소 식별자입니다. Amazon Cognito는 [취소 엔드포인트](revocation-endpoint.md) 또는 [RevokeToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RevokeToken.html) API 작업을 통해 사용자의 토큰을 취소했는지 확인할 때 `origin_jti` 클레임을 참조합니다. 토큰을 취소하면 Amazon Cognito는 동일한 `origin_jti` 값을 가진 모든 액세스 및 ID 토큰을 무효화합니다.

**`cognito:roles`**  
사용자 그룹과 연결된 IAM 역할의 이름 배열입니다. 모든 사용자 풀 그룹에는 하나의 IAM 역할을 연결할 수 있습니다. 이 배열은 우선 순위에 관계없이 사용자 그룹의 모든 IAM 역할을 나타냅니다. 자세한 내용은 [사용자 풀에 그룹 추가](cognito-user-pools-user-groups.md) 단원을 참조하십시오.

**`aud`**  
사용자를 인증한 사용자 풀 앱 클라이언트입니다. Amazon Cognito는 액세스 토큰 `client_id` 클레임에서 동일한 값을 렌더링합니다.

**`identities`**  
사용자 `identities` 속성의 내용입니다. 속성에는 페더레이션 로그인을 수행하거나 [페더레이션 사용자를 로컬 프로필에 연결](cognito-user-pools-identity-federation-consolidate-users.md)하여 사용자에게 연결한 각 서드 파티 ID 제공업체 프로필에 대한 정보가 포함됩니다. 이 정보에는 제공업체 이름, 제공업체 고유 ID 및 기타 메타데이터가 포함됩니다.

**`token_use`**  
토큰의 의도된 목적입니다. ID 토큰에서 값은 `id`입니다.

**`auth_time`**  
사용자가 인증을 완료한 인증 시간(Unix 시간 형식)입니다.

**`exp`**  
사용자의 토큰이 만료되는 만료 시간(Unix 시간 형식)입니다.

**`iat`**  
Amazon Cognito가 사용자의 토큰을 발급한 발급 시간(Unix 시간 형식)입니다.

**`jti`**  
JWT의 고유 식별자입니다.

ID 토큰에는 [OIDC 표준 클레임](https://openid.net/specs/openid-connect-core-1_0.html#Claims)에 정의된 OIDC 표준 클레임이 포함될 수 있습니다. 또한 ID 토큰에는 사용자 풀에 정의된 사용자 지정 속성도 포함될 수 있습니다. Amazon Cognito는 ID 토큰에 사용자 지정 속성 값을 속성 유형에 상관없이 문자열로 씁니다.

**참고**  
사용자 풀의 사용자 지정 속성은 항상 `custom:`으로 시작합니다.

## ID 토큰 서명
<a name="user-pool-id-token-signature"></a>

ID 토큰의 서명은 JWT 토큰의 헤더와 페이로드에 따라 계산됩니다. 앱에서 받는 ID 토큰의 클레임을 수락하기 전에 토큰의 서명을 확인하세요. 자세한 내용은 JSON 웹 토큰 확인을 참조하세요. [JSON 웹 토큰 확인](amazon-cognito-user-pools-using-tokens-verifying-a-jwt.md).

# 액세스 토큰 이해
<a name="amazon-cognito-user-pools-using-the-access-token"></a>

사용자 풀 액세스 토큰에는 인증된 사용자에 대한 클레임, 사용자 그룹 목록 및 범위 목록이 포함되어 있습니다. 액세스 토큰의 목적은 API 작업을 승인하는 것입니다. 사용자 풀은 액세스 토큰을 받아 사용자 셀프 서비스 작업을 승인합니다. 예를 들어 액세스 토큰을 사용하여 사용자 속성을 추가, 변경 또는 삭제하기 위한 액세스 권한을 사용자에게 부여할 수 있습니다.

사용자 풀에 추가한 사용자 지정 범위에서 파생된 액세스 토큰의 [OAuth 2.0 범위](https://www.rfc-editor.org/rfc/rfc6749#section-3.3)를 사용하면 사용자에게 API에서 정보를 검색하도록 권한을 부여할 수 있습니다. 예를 들어, Amazon API Gateway는 Amazon Cognito 액세스 토큰을 통한 권한 부여를 지원합니다. 사용자 풀의 정보로 REST API 권한 부여자를 채우거나 Amazon Cognito를 HTTP API용 JSON 웹 토큰(JWT) 권한 부여자로 사용할 수 있습니다. 사용자 지정 범위가 있는 액세스 토큰을 생성하려면 사용자 풀 [퍼블릭 엔드포인트](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)를 통해 요청해야 합니다.

Essentials 또는 Plus [기능 플랜](cognito-sign-in-feature-plans.md)을 사용하면 런타임 시 액세스 토큰에 범위를 추가하는 사전 토큰 생성 Lambda 트리거를 구현할 수도 있습니다. 자세한 내용은 [사전 토큰 생성 Lambda 트리거](user-pool-lambda-pre-token-generation.md) 단원을 참조하십시오.

`openid` 범위의 사용자 액세스 토큰은 [userInfo 엔드포인트](userinfo-endpoint.md)에서 사용자 속성에 대한 추가 정보를 요청할 수 있는 권한입니다. `userInfo` 엔드포인트의 정보 양은 액세스 토큰의 추가 범위에서 파생됩니다. 예를 들어, 모든 사용자 데이터의 경우 `profile`, 이메일 주소의 경우 `email`입니다.

`aws.cognito.signin.user.admin` 범위가 있는 사용자 액세스 토큰은 사용자 속성을 읽고 쓰고, 인증 요소를 나열하고, 다중 인증(MFA) 기본 설정을 구성하고, 기억된 디바이스를 관리할 수 있는 권한입니다. 액세스 토큰이 이 범위에 부여하는 속성에 대한 액세스 수준은 앱 클라이언트에 할당하는 속성 읽기/쓰기 권한과 일치합니다.

액세스 토큰은 [JSON 웹 토큰(JWT)](https://www.rfc-editor.org/rfc/rfc7519)입니다. 액세스 토큰의 헤더는 ID 토큰과 구조가 동일합니다. Amazon Cognito는 ID 토큰을 서명하는 키와는 다른 키를 사용하여 액세스 토큰을 서명합니다. 액세스 키 ID(`kid`) 클레임의 값은 동일한 사용자 세션의 ID 토큰에 있는 `kid` 클레임 값과 일치하지 않습니다. 앱 코드에서 ID 토큰과 액세스 토큰을 독립적으로 확인하세요. 서명을 확인하기 전까지는 액세스 토큰의 클레임을 신뢰하지 마세요. 자세한 내용은 [JSON 웹 토큰 확인](amazon-cognito-user-pools-using-tokens-verifying-a-jwt.md) 단원을 참조하십시오. 액세스 토큰 만료 시간은 5분\$11일 사이로 설정할 수 있습니다. 앱 클라이언트별로 이 값을 설정할 수 있습니다.

**중요**  
액세스 및 ID 토큰의 경우 관리형 로그인을 사용한다면 최솟값을 1시간 미만으로 지정하지 마세요. 관리형 로그인은 1시간 동안 유효한 브라우저 쿠키를 설정합니다. 액세스 토큰 기간을 1시간 미만으로 구성하면 관리형 로그인 쿠키의 유효성 및 최초 로그인 후 1시간 동안 추가 자격 증명 없이 다시 인증할 수 있는 사용자의 기능에 영향을 미치지 않습니다.

## 액세스 토큰 헤더
<a name="user-pool-access-token-header"></a>

헤더에는 키 ID(`kid`) 및 알고리즘(`alg`) 등 두 가지 정보가 포함되어 있습니다.

```
{
"kid" : "1234example="
"alg" : "RS256",
}
```

**`kid`**  
 키 ID입니다. 이 값은 토큰의 JSON 웹 서명(JWS)을 보호하는 데 어떤 키가 사용되었는지 나타냅니다. `jwks_uri` 엔드포인트에서 사용자 풀 서명 키 ID를 볼 수 있습니다.  
`kid` 파라미터에 대한 자세한 내용은 [키 식별자(kid) 헤더 파라미터](https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-4.5)를 참조하세요.

**`alg`**  
Amazon Cognito가 액세스 토큰을 보호하는 데 사용한 암호화 알고리즘입니다. 사용자 풀은 SHA-256에서의 RSA 서명인 RS256 암호화 알고리즘을 사용합니다.  
`alg` 파라미터에 대한 자세한 내용은 [알고리즘(alg) 헤더 파라미터](https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-4.4)를 참조하세요.

## 액세스 토큰 기본 페이로드
<a name="user-pool-access-token-payload"></a>

액세스 토큰에서 나온 샘플 페이로드입니다. 자세한 내용은 [JWT 클레임](https://tools.ietf.org/html/rfc7519#section-4)을 참조하세요. [사전 토큰 생성 Lambda 트리거](user-pool-lambda-pre-token-generation.md)을 사용하여 자체 설계의 클레임을 추가할 수 있습니다.

```
<header>.
{
   "sub":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
   "device_key": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
   "cognito:groups":[
      "testgroup"
   ],
   "iss":"https://cognito-idp.us-west-2.amazonaws.com/us-west-2_example",
   "version":2,
   "client_id":"xxxxxxxxxxxxexample",
   "aud": "https://api.example.com",
   "origin_jti":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
   "event_id":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
   "token_use":"access",
   "scope":"phone openid profile resourceserver.1/appclient2 email",
   "auth_time":1676313851,
   "exp":1676317451,
   "iat":1676313851,
   "jti":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
   "username":"my-test-user"
}
.<token signature>
```

**`sub`**  
인증된 사용자에 대한 고유 식별자([UUID](cognito-terms.md#terms-uuid)) 또는 제목입니다. 사용자 풀에서 사용자 이름이 고유하지 않을 수 있습니다. `sub` 클레임은 특정 사용자를 식별하는 가장 좋은 방법입니다.

**`cognito:groups`**  
사용자를 멤버로 가진 사용자 풀 그룹의 이름 배열입니다.

**`iss`**  
토큰을 발행한 자격 증명 공급자입니다. 클레임의 형식은 다음과 같습니다.  
`https://cognito-idp.us-east-1.amazonaws.com/us-east-1_EXAMPLE`

**`client_id`**  
사용자를 인증한 사용자 풀 앱 클라이언트입니다. Amazon Cognito는 ID 토큰 `aud` 클레임에서 동일한 값을 렌더링합니다.

**aud**  
액세스 토큰이 권한을 부여하려는 API의 URL입니다. 애플리케이션이 권한 부여 서버에서 [리소스 바인딩](cognito-user-pools-define-resource-servers.md#cognito-user-pools-resource-binding)을 요청한 경우에만 표시됩니다.

**`origin_jti`**  
사용자의 새로 고침 토큰과 연결된 토큰 취소 식별자입니다. Amazon Cognito는 [취소 엔드포인트](revocation-endpoint.md) 또는 [RevokeToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RevokeToken.html) API 작업을 통해 사용자의 토큰을 취소했는지 확인할 때 `origin_jti` 클레임을 참조합니다. 토큰을 취소하면 Amazon Cognito는 더 이상 동일한 `origin_jti` 값을 가진 액세스 토큰과 ID 토큰을 검증하지 않습니다.

**`token_use`**  
토큰의 의도된 목적입니다. 액세스 토큰에서 값은 `access`입니다.

**`scope`**  
로그인한 사용자에게 발급된 OAuth 2.0 범위 목록입니다. 범위는 토큰이 외부 API, 사용자 셀프 서비스 작업 및 `userInfo` 엔드포인트의 사용자 데이터에 제공하는 액세스를 정의합니다. [Token 엔드포인트](token-endpoint.md)의 토큰에는 앱 클라이언트가 지원하는 범위가 포함될 수 있습니다. Amazon Cognito API 로그인의 토큰에는 `aws.cognito.signin.user.admin` 범위만 포함됩니다.

**`auth_time`**  
사용자가 인증을 완료한 인증 시간(Unix 시간 형식)입니다.

**`exp`**  
사용자의 토큰이 만료되는 만료 시간(Unix 시간 형식)입니다.

**`iat`**  
Amazon Cognito가 사용자의 토큰을 발급한 발급 시간(Unix 시간 형식)입니다.

**`jti`**  
JWT의 고유 식별자입니다.

**`username`**  
사용자 풀의 사용자 이름입니다.

**추가 리소스**
+ [Amazon Cognito 사용자 풀에서 액세스 토큰을 사용자 지정하는 방법](https://aws.amazon.com/blogs/security/how-to-customize-access-tokens-in-amazon-cognito-user-pools/)

## 액세스 토큰 서명
<a name="user-pool-access-token-signature"></a>

`.well-known/jwks.json` 엔드포인트에 광고된 키로 서명된 액세스 토큰의 서명은 토큰 헤더 및 페이로드의 무결성을 검증합니다. 액세스 토큰을 사용하여 외부 API에 대한 액세스를 승인하는 경우 항상 API 권한 부여자가 이 서명을 서명한 키와 비교하여 확인하도록 구성합니다. 자세한 내용은 [JSON 웹 토큰 확인](amazon-cognito-user-pools-using-tokens-verifying-a-jwt.md) 단원을 참조하십시오.

# 새로 고침 토큰
<a name="amazon-cognito-user-pools-using-the-refresh-token"></a>

새로 고침 토큰을 사용하여 새 ID와 액세스 토큰을 검색할 수 있습니다. 기본적으로 새로 고침 토큰은 애플리케이션 사용자가 사용자 풀에 로그인하고 30일이 지나면 만료됩니다. 사용자 풀에 대한 애플리케이션을 생성할 경우 애플리케이션의 새로 고침 토큰 만료를 60분에서 10년 사이의 값으로 설정할 수 있습니다.

## 새로 고침 토큰으로 새 액세스 및 자격 증명 토큰 받기
<a name="amazon-cognito-user-pools-using-the-refresh-token_initiate-token"></a>

Amazon Cognito는 관리형 로그인 권한 부여 코드 흐름 및 API 작업 또는 SDK 메서드를 사용한 성공적인 인증에 대한 응답으로 새로 고침 토큰을 발급합니다. 새로 고침 토큰은 새 ID 및 액세스 토큰과 선택적으로 새 새로 고침 토큰을 반환합니다. 다음과 같은 방법으로 새로 고침 토큰을 사용할 수 있습니다.

**GetTokensFromRefreshToken**  
[GetTokensFromRefreshToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetTokensFromRefreshToken.html) API 작업은 유효한 새로 고침 토큰에서 새 ID와 액세스 토큰을 발급합니다. 새로 고침 토큰 교체를 활성화한 경우에도 새 새로 고침 토큰이 생성됩니다.

**InitiateAuth 및 AdminitiateAuth**  
[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 또는 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API 작업에는 `REFRESH_TOKEN_AUTH` 인증 흐름이 포함됩니다. 이 흐름에서는 새로 고침 토큰을 전달하고 새 ID 및 액세스 토큰을 가져옵니다. [새로 고침 토큰 교체](#using-the-refresh-token-rotation)가 활성화된 앱 클라이언트에서는 `REFRESH_TOKEN_AUTH`를 사용하여 인증할 수 없습니다.

**OAuth 토큰 엔드포인트**  
[도메인](cognito-user-pools-assign-domain.md)이 있는 사용자 풀의 [토큰 엔드포인트](token-endpoint.md)에는 유효한 새로 고침 토큰에서 새 ID, 액세스 및 선택적으로([새로 고침 토큰 교체](#using-the-refresh-token-rotation) 포함) 새로 고침 토큰을 발급하는 `refresh_token` 권한 부여 유형이 있습니다.

## 새로 고침 토큰 교체
<a name="using-the-refresh-token-rotation"></a>

선택적으로 앱 클라이언트에서 새로 고침 토큰 교체를 구성할 수 있습니다. 새로 고침 토큰 교체를 통해 클라이언트는 원래 새로 고침 토큰을 무효화하고 토큰 새로 고침마다 새로운 새로 고침 토큰을 발급할 수 있습니다. 이 설정이 활성화되면 모든 형태의 토큰 새로 고침에서 성공한 각 요청은 새 ID, 액세스 *및* 새로 고침 토큰을 반환합니다. 이 설정을 비활성화하면 토큰 새로 고침 요청은 새 액세스 및 ID 토큰만 반환하고 원래 새로 고침 토큰은 유효한 상태로 유지됩니다. 새 새로 고침 토큰은 원래 새로 고침 토큰의 남은 기간 동안 유효합니다. 새로 고침 토큰을 교체하거나 원래 새로 고침 토큰을 전달하도록 [앱 클라이언트](user-pool-settings-client-apps.md)를 구성할 수 있습니다. 짧은 기간 동안 재시도를 허용하려면 원래 새로 고침 토큰의 유예 기간을 최대 60초로 구성할 수도 있습니다.

**새로 고침 토큰 교체에 대해 알아야 할 사항**
+ 새로 고침 토큰 교체를 활성화하면 사용자 풀의 JSON 웹 토큰에 새 클레임이 추가됩니다. `origin_jti` 및 `jti` 클레임이 액세스 토큰과 ID 토큰에 추가됩니다. 이러한 클레임으로 인해 JWT의 크기가 커집니다.
+ 새로 고침 토큰 교체는 인증 흐름 `REFRESH_TOKEN_AUTH`와 호환되지 않습니다. 새로 고침 토큰 교체를 구현하려면 앱 클라이언트에서 이 인증 흐름을 비활성화하고 [GetTokensFromRefreshToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetTokensFromRefreshToken.html) API 작업 또는 이에 상응하는 SDK 방법을 사용하여 토큰 새로 고침 요청을 제출하도록 애플리케이션을 설계해야 합니다.
+ 새로 고침 토큰 교체가 비활성화된 상태에서 `GetTokensFromRefreshToken` 또는 `REFRESH_TOKEN_AUTH`를 사용하여 토큰 새로 고침 요청을 완료할 수 있습니다.
+ 사용자 풀에서 [디바이스 기억하기](amazon-cognito-user-pools-device-tracking.md)가 활성 상태인 경우 `GetTokensFromRefreshToken` 요청에 디바이스 키를 제공해야 합니다. 사용자에게 애플리케이션이 초기 인증 요청에서 제출하는 확인된 디바이스 키가 없는 경우 Amazon Cognito는 새 키를 발급합니다. 이 구성에서 토큰을 새로 고치려면 `AuthParameters`에서 토큰을 지정했는지 아니면 인증 응답에서 새 토큰을 수신했는지에 관계없이 디바이스 키를 제공해야 합니다.
+ `GetTokensFromRefreshToken` 요청에서 사전 토큰 생성 Lambda 트리거에 `ClientMetadata`를 전달할 수 있습니다. 트리거의 입력 이벤트에 전달되는 이 데이터는 Lambda 함수의 사용자 지정 로직에 사용할 수 있는 추가 컨텍스트를 제공합니다.

보안 모범 사례로 앱 클라이언트에서 새로 고침 토큰 교체를 활성화합니다.

------
#### [ Enable refresh token rotation (console) ]

다음 절차에서는 앱 클라이언트에 대해 새로 고침 토큰 교체를 켜거나 끕니다. 이 절차에는 기존 앱 클라이언트가 필요합니다. 앱 클라이언트 생성에 대해 자세히 알아보려면 [앱 클라이언트를 사용한 애플리케이션별 설정](user-pool-settings-client-apps.md) 섹션을 참조하세요.

**새로 고침 토큰 교체 활성화 방법**

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

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

1. 목록에서 기존 사용자 풀을 선택합니다.

1. **앱 클라이언트** 메뉴로 이동하여 기존 앱 클라이언트를 선택합니다.

1. 페이지의 **앱 클라이언트 정보** 섹션에서 **편집**을 선택합니다.

1. **고급 보안 구성**에서 **새로 고침 토큰 교체 활성화** 옵션을 찾습니다.

1. 교체를 활성화하려면 확인란을 선택합니다. 교체를 비활성화하려면 확인란을 선택 취소합니다.

1. **새로 고침 토큰 교체 유예 기간**에 교체된 새로 고침 토큰이 취소되기 전의 지연으로 설정할 초 수를 최대 60까지 입력합니다.

------
#### [ Enable refresh token rotation (API) ]

[CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) 또는 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) API 요청에서 새로 고침 토큰 교체를 구성합니다. 다음 부분 요청 본문은 새로 고침 토큰 교체를 켜고 유예 기간을 10초로 설정합니다.

```
"RefreshTokenRotation" : {
   "Feature" : "ENABLED,
   "RetryGracePeriodSeconds" : 10
}
```

------

## API 및 SDK 토큰 새로 고침
<a name="using-the-refresh-token-api"></a>

새로 고침 토큰 교체가 활성 상태인지 여부에 따라 새로 고침 토큰을 사용하여 사용자 풀 API로 새 ID 및 액세스 토큰을 가져오는 두 가지 방법이 있습니다. 새로 고침 토큰 교체가 활성화된 앱 클라이언트에서 [GetTokensFromRefreshToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetTokensFromRefreshToken.html) API 작업을 사용합니다. 새로 고침 토큰 교체가 없는 앱 클라이언트에서는 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 또는 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API 작업의 `REFRESH_TOKEN_AUTH` 흐름을 사용합니다.

**참고**  
사용자는 [관리형 로그인](cognito-user-pools-managed-login.md) 또는 AWS SDKs 및 Amazon Cognito API 작업으로 빌드하는 사용자 지정 애플리케이션에서 사용자 풀로 인증할 수 있습니다. `REFRESH_TOKEN_AUTH` 흐름 및 `GetTokensFromRefreshToken` 모두 관리형 로그인 사용자의 토큰 새로 고침을 완료할 수 있습니다. 사용자 지정 애플리케이션의 토큰 새로 고침은 관리형 로그인 세션에 영향을 주지 않습니다. 이러한 세션은 브라우저 쿠키에 설정되며 1시간 동안 유효합니다. `GetTokensFromRefreshToken` 응답은 새 ID, 액세스 및 선택적으로 새로 고침 토큰을 발급하지만 관리형 로그인 세션 쿠키는 갱신하지 않습니다.  
새로 고침 토큰 교체가 활성화된 앱 클라이언트에서는 `REFRESH_TOKEN_AUTH`를 사용할 수 없습니다.

------
#### [ GetTokensFromRefreshToken ]

[GetTokensFromRefreshToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetTokensFromRefreshToken.html)은 새로 고침 토큰으로 권한을 부여하는 요청에서 새 ID, 액세스 및 새로 고침 토큰을 반환합니다. 다음은 `GetTokensFromRefreshToken`에 대한 요청 본문의 예입니다. 이 작업에 대한 요청에서 Lambda 트리거에 클라이언트 메타데이터를 제출할 수 있습니다.

```
{
    "RefreshToken": "eyJjd123abcEXAMPLE",
    "ClientId": "1example23456789",
    "ClientSecret": "myappclientsecret123abc",
    "ClientMetadata": { 
      "MyMetadataKey" : "MyMetadataValue" 
   },
}
```

------
#### [ AdminInitiateAuth/InitiateAuth ]

새로 고침 토큰 교체가 비활성 상태일 때 새로 고침 토큰을 사용하려면 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 또는 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API 작업을 사용합니다. `AuthFlow` 파라미터에 `REFRESH_TOKEN_AUTH`를 전달합니다. `AuthFlow`의 `AuthParameters` 속성에서 사용자의 새로 고침 토큰을 `"REFRESH_TOKEN"` 값으로 전달합니다. Amazon Cognito는 API 요청이 모든 챌린지를 전달한 후 새 ID 및 액세스 토큰을 반환합니다.

다음은 `InitiateAuth` 또는 `AdminInitiateAuth` API를 사용한 토큰 새로 고침 요청 본문의 예입니다.

```
{
    "AuthFlow": "REFRESH_TOKEN_AUTH",
    "ClientId": "1example23456789",
    "UserPoolId": "us-west-2_EXAMPLE",
    "AuthParameters": {
        "REFRESH_TOKEN": "eyJjd123abcEXAMPLE",
        "SECRET_HASH": "kT5acwCVrbD6JexhW3EQwnRSe6fLuPTRkEQ50athqv8="
    }
}
```

------

## OAuth 토큰 새로 고침
<a name="using-the-refresh-token-oauth"></a>

도메인을 구성한 사용자 풀의 [Token 엔드포인트](token-endpoint.md)에 새로 고침 토큰을 제출할 수도 있습니다. 요청 본문에 `refresh_token`의 `grant_type` 값과 사용자 새로 고침 토큰의 `refresh_token` 값을 포함합니다.

토큰 엔드포인트에 대한 요청은 새로 고침 토큰 교체가 활성화된 앱 클라이언트와 토큰 교체가 비활성화된 앱 클라이언트에서 사용할 수 있습니다. 새로 고침 토큰 교체가 활성화되면 토큰 엔드포인트가 새 새로 고침 토큰을 반환합니다.

다음은 새로 고침 토큰을 사용한 요청의 예입니다.

```
POST /oauth2/token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic ZGpjOTh1M2ppZWRtaTI4M2V1OTI4OmFiY2RlZjAxMjM0NTY3ODkw
Content-Length: **

client_id=1example23456789&grant_type=refresh_token&refresh_token=eyJjd123abcEXAMPLE
```

## 새로 고침 토큰 철회
<a name="amazon-cognito-identity-user-pools-revoking-all-tokens-for-user"></a>

사용자에게 속한 새로 고침 토큰을 취소할 수 있습니다. 토큰 취소에 대한 자세한 내용은 [토큰 취소로 사용자 세션 종료](token-revocation.md) 섹션을 참조하세요.

**참고**  
새로 고침 토큰을 취소하면 Amazon Cognito가 해당 토큰을 사용하여 새로 고침 요청에서 발급한 모든 ID 및 액세스 토큰이 취소됩니다.

현재 로그인한 모든 세션에서 사용자를 로그아웃하려면 [GlobalSignOut](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GlobalSignOut.html) 또는 [AdminUserGlobalSignOut](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUserGlobalSignOut.html) API 요청을 사용하여 모든 토큰을 취소합니다. 사용자가 로그아웃하면 다음과 같은 효과가 발생합니다.
+ 사용자의 새로 고침 토큰을 사용하여 사용자에 대한 새 토큰을 가져올 수 없습니다.
+ 사용자의 액세스 토큰을 사용하여 토큰으로 권한이 부여된 API 요청을 할 수 없습니다.
+ 새 토큰을 가져오려면 사용자가 다시 인증해야 합니다. 관리형 로그인 세션 쿠키는 자동으로 만료되지 않으므로 보안 인증 정보를 입력하라는 추가 메시지 없이 사용자가 세션 쿠키를 사용하여 다시 인증할 수 있습니다. 관리형 로그인 사용자를 로그아웃한 후 [Logout 엔드포인트](logout-endpoint.md)로 리디렉션하면 Amazon Cognito가 세션 쿠키를 지웁니다.

새로 고침 토큰을 사용하면 앱에서 사용자의 세션을 오랫동안 유지할 수 있습니다. 시간이 지남에 따라 사용자는 새로 고침 토큰으로 로그인한 상태로 유지된 일부 애플리케이션의 권한을 취소할 수 있습니다. 단일 세션에서 사용자를 로그아웃하려면 새로 고침 토큰을 취소합니다. 사용자가 인증된 모든 세션에서 로그아웃하려는 경우 [GlobalSignOut](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GlobalSignOut.html) API 요청을 생성합니다. 앱에서 사용자에게 **모든 디바이스에서 로그아웃**과 같은 선택 항목을 제공할 수 있습니다. `GlobalSignOut`은 변경되지 않고 만료되지 않고 취소되지 않은 사용자의 유효한 액세스 토큰을 허용합니다. 이 API는 토큰으로 권한이 부여되었기 때문에 한 사용자가 이 API를 사용하여 다른 사용자의 로그아웃을 시작할 수 없습니다.

그러나 자격 AWS 증명으로 모든 디바이스에서 사용자를 로그아웃하도록 권한을 부여하는 [AdminUserGlobalSignOut](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUserGlobalSignOut.html) API 요청을 생성할 수 있습니다. 관리자 애플리케이션은 AWS 개발자 자격 증명으로이 API 작업을 호출하고 사용자 풀 ID와 사용자의 사용자 이름을 파라미터로 전달해야 합니다. `AdminUserGlobalSignOut` API를 사용하면 사용자 풀의 모든 사용자를 로그아웃할 수 있습니다.

자격 AWS 증명 또는 사용자의 액세스 토큰으로 권한을 부여할 수 있는 요청에 대한 자세한 내용은 섹션을 참조하세요[권한 부여 모델별로 그룹화된 API 작업 목록](authentication-flows-public-server-side.md#user-pool-apis-auth-unauth).

# 토큰 취소로 사용자 세션 종료
<a name="token-revocation"></a>

다음 방법을 사용하여 새로 고침 토큰과 최종 사용자 세션을 취소할 수 있습니다. 새로 고침 토큰을 취소하면 해당 새로 고침 토큰에서 이전에 발급한 모든 액세스 토큰이 무효화됩니다. 사용자에게 발급된 다른 새로 고침 토큰은 영향을 받지 않습니다.

**RevokeToken 작업**  
[RevokeToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RevokeToken.html)은 대화형 로그인의 초기 액세스 토큰을 포함하여 지정된 새로 고침 토큰에 대한 모든 액세스 토큰을 취소합니다. 이 작업은 사용자의 다른 새로 고침 토큰이나 다른 새로 고침 토큰의 ID 및 액세스 토큰 하위 항목에 영향을 주지 않습니다.

**취소 엔드포인트**  
[취소 엔드포인트](revocation-endpoint.md)는 지정된 새로 고침 토큰과 새로 고침 토큰이 생성한 모든 ID 및 액세스 토큰을 취소합니다. 또한 이 엔드포인트는 대화형 로그인에서 초기 액세스 토큰을 취소합니다. 이 엔드포인트에 대한 요청은 사용자의 다른 새로 고침 토큰이나 다른 새로 고침 토큰의 ID 및 액세스 토큰 하위 항목에 영향을 주지 않습니다.

**GlobalSignOut 작업**  
[GlobalSignOut](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GlobalSignOut.html)은 사용자가 액세스 토큰으로 권한을 부여하는 셀프 서비스 작업입니다. 이 작업은 요청하는 사용자의 새로 고침, ID 및 액세스 토큰을 모두 취소합니다.

**AdminUserGlobalSignOut 작업**  
[AdminUserGlobalSignOut](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUserGlobalSignOut.html)은 관리자가 IAM 자격 증명으로 권한을 부여하는 서버 측 작업입니다. 이 작업은 대상 사용자의 모든 새로 고침, ID 및 액세스 토큰을 취소합니다.

**토큰 취소에 대해 알아야 할 사항**
+ 새로 고침 토큰을 취소하는 요청에는 토큰을 얻는 데 사용한 것과 동일한 클라이언트 ID가 포함되어야 합니다.
+ 사용자 풀 JWT는 토큰이 생성될 때 서명 및 만료 시간이 할당되는 독립형 토큰입니다. 취소된 토큰은 토큰이 필요한 Amazon Cognito API 호출에 사용할 수 없습니다. 그러나 취소된 토큰은 토큰의 서명 및 만료를 확인하는 JWT 라이브러리를 사용하여 확인되는 경우 여전히 유효합니다.
+ 새 사용자 풀 클라이언트를 생성하면 토큰 취소가 기본적으로 사용됩니다.
+ 토큰 취소가 활성화된 앱 클라이언트에서만 새로 고침 토큰을 취소할 수 있습니다.
+ 토큰 취소를 활성화하면 Amazon Cognito JSON 웹 토큰에 새 클레임이 추가됩니다. `origin_jti` 및 `jti` 클레임이 액세스 토큰과 ID 토큰에 추가됩니다. 이러한 클레임은 애플리케이션 클라이언트 액세스 토큰 및 ID 토큰의 크기를 늘립니다.
+ 이전에 활성화된 앱 클라이언트에서 토큰 해지를 비활성화하면 취소된 토큰이 다시 활성화되지 않습니다.
+ [사용자 계정을 비활성화](how-to-manage-user-accounts.md#manage-user-accounts-enable-disable)하면(새로 고침 및 액세스 토큰 취소) 사용자 계정을 다시 활성화해도 취소된 토큰이 활성화되지 않습니다.
+  AWS Management Console AWS CLI, 또는 API를 사용하여 새 사용자 풀 클라이언트를 AWS 생성하면 토큰 취소가 기본적으로 활성화됩니다.

## 토큰 취소 사용
<a name="enable-token-revocation"></a>

기존 사용자 풀 클라이언트의 토큰을 취소하려면 먼저 토큰 취소를 사용하도록 설정해야 합니다. 또는 AWS API를 사용하여 기존 사용자 풀 클라이언트에 AWS CLI 대한 토큰 취소를 활성화할 수 있습니다. 이렇게 하려면 `aws cognito-idp describe-user-pool-client` CLI 명령 또는 `DescribeUserPoolClient` API 작업을 호출하여 앱 클라이언트에서 현재 설정을 검색합니다. 그런 다음 `aws cognito-idp update-user-pool-client` CLI 명령 또는 `UpdateUserPoolClient` API 작업을 호출합니다. 앱 클라이언트의 현재 설정을 포함하고 `EnableTokenRevocation` 파라미터를 `true`로 설정합니다.

Amazon Cognito API 또는 AWS SDK를 사용하여 토큰 해지가 활성화된 앱 클라이언트를 생성하거나 수정하려면 [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) 또는 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) API 요청에 다음 파라미터를 포함합니다.

```
"EnableTokenRevocation": true
```

Amazon Cognito 콘솔에서 토큰 해지를 구성하려면 사용자 풀의 앱 클라이언트 메뉴에서 **앱 클라이언트**를 선택합니다. **앱 클라이언트 정보**에서 **편집** 버튼을 선택하고 **고급 구성**에서 토큰 취소를 활성화하거나 비활성화합니다.

## 토큰 취소
<a name="revoke-tokens-api"></a>

[RevokeToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RevokeToken.html) API 요청(예: `[aws cognito-idp revoke-token](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/revoke-token.html)` CLI 명령)을 사용하여 새로 고침 토큰을 취소할 수 있습니다. [취소 엔드포인트](revocation-endpoint.md)을 사용하여 토큰을 취소할 수도 있습니다. 이 엔드포인트는 사용자 풀에 도메인을 추가한 후에 사용할 수 있습니다. Amazon Cognito 호스트된 도메인 또는 자체 사용자 지정 도메인의 취소 엔드포인트를 사용할 수 있습니다.

다음은 `RevokeToken` API 요청 예시의 본문입니다.

```
{
   "ClientId": "1example23456789",
   "ClientSecret": "abcdef123456789ghijklexample",
   "Token": "eyJjdHkiOiJKV1QiEXAMPLE"
}
```

다음은 사용자 지정 도메인이 있는 사용자 풀의 `/oauth2/revoke` 엔드포인트에 대한 cURL 요청의 예입니다.

```
curl --location 'auth.mydomain.com/oauth2/revoke' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic Base64Encode(client_id:client_secret)' \
--data-urlencode 'token=abcdef123456789ghijklexample' \
--data-urlencode 'client_id=1example23456789'
```

앱 클라이언트에 클라이언트 보안 함호가 없는 한, `RevokeToken` 작업 및 `/oauth2/revoke` 엔드포인트에서 추가 권한 부여가 필요하지 않습니다.

# JSON 웹 토큰 확인
<a name="amazon-cognito-user-pools-using-tokens-verifying-a-jwt"></a>

JSON 웹 토큰(JWT)은 쉽게 디코딩, 읽기 및 수정할 수 있습니다. 수정된 액세스 토큰은 권한 에스컬레이션 위험을 초래합니다. 수정된 ID 토큰은 사칭 위험을 초래합니다. 애플리케이션은 사용자 풀을 토큰 발급자로 신뢰하지만 사용자가 전송 중인 토큰을 가로채면 어떻게 됩니까? 애플리케이션이 Amazon Cognito가 발급한 것과 동일한 토큰을 수신하고 있는지 확인해야 합니다.

Amazon Cognito는 OpenID Connect(OIDC) 사양의 무결성 및 기밀성 기능 중 일부를 사용하는 토큰을 발행합니다. 사용자 풀 토큰은 만료 시간, 발급자 및 디지털 서명과 같은 개체의 유효성을 나타냅니다. `.`으로 구분된 JWT의 세 번째 및 마지막 세그먼트인 서명은 토큰 검증의 주요 구성 요소입니다. 악의적인 사용자는 토큰을 수정할 수 있지만 애플리케이션이 퍼블릭 키를 검색하고 서명을 비교하면 일치하지 않습니다. OIDC 인증에서 JWT를 처리하는 모든 애플리케이션은 로그인할 때마다 이 확인 작업을 수행해야 합니다.

이 페이지에서는 JWT 확인을 위한 몇 가지 일반적이고 구체적인 권장 사항을 제시합니다. 애플리케이션 개발은 다양한 프로그래밍 언어와 플랫폼을 포괄합니다. Amazon Cognito는 공개 사양에 충분히 근접한 OIDC를 구현하므로 선택한 개발자 환경의 평판이 좋은 JWT 라이브러리가 인증 요구 사항을 처리할 수 있습니다.

이러한 단계들은 사용자 풀 JSON 웹 토큰(JWT)의 확인 방법을 설명합니다.

**Topics**
+ [사전 조건](#amazon-cognito-user-pools-using-tokens-prerequisites)
+ [aws-jwt-verify를 사용한 토큰 검증](#amazon-cognito-user-pools-using-tokens-aws-jwt-verify)
+ [토큰 이해 및 검사](#amazon-cognito-user-pools-using-tokens-manually-inspect)

## 사전 조건
<a name="amazon-cognito-user-pools-using-tokens-prerequisites"></a>

라이브러리, SDK 또는 소프트웨어 프레임워크에서 이 섹션의 작업을 이미 처리했을 수 있습니다. AWS SDKs 앱에서 Amazon Cognito 사용자 풀 토큰 처리 및 관리를 위한 도구를 제공합니다. 에는 Amazon Cognito 토큰을 검색하고 새로 고치는 함수가 AWS Amplify 포함되어 있습니다.

자세한 내용은 다음 페이지를 참조하십시오.
+ [웹 및 모바일 앱과 Amazon Cognito 인증 및 권한 부여 통합](cognito-integrate-apps.md)
+ [AWS SDKs를 사용하는 Amazon Cognito 자격 증명 공급자의 코드 예제](https://docs.aws.amazon.com/cognito/latest/developerguide/service_code_examples.html)
+ **Amplify 개발 센터의 [Advanced workflows](https://docs.amplify.aws/lib/auth/advanced/q/platform/js/#retrieve-jwt-tokens)(고급 워크플로)

JSON 웹 토큰(JWT)을 디코딩하고 확인하는 데 사용할 수 있는 유용한 라이브러리가 많습니다. 서버 측 API 처리를 위해 토큰을 수동으로 처리하고자 하는 경우 또는 다른 프로그래밍 언어를 사용 중인 경우 이러한 라이브러리가 유용할 수 있습니다. [JWT 토큰 작업을 위한 OpenID Foundation 라이브러리 목록](http://openid.net/developers/jwt/)을 참조하세요.

## aws-jwt-verify를 사용한 토큰 검증
<a name="amazon-cognito-user-pools-using-tokens-aws-jwt-verify"></a>

Node.js 앱에서는 사용자가 앱에 전달하는 토큰의 파라미터를 검증하도록 [aws-jwt-verify 라이브러리](https://github.com/awslabs/aws-jwt-verify)를 AWS 권장합니다. `aws-jwt-verify`를 사용하면 하나 이상의 사용자 풀에 대해 확인하려는 클레임 값으로 `CognitoJwtVerifier`를 채울 수 있습니다. 확인할 수 있는 값에는 다음이 포함됩니다.
+ 액세스 또는 ID 토큰의 형식이 잘못되었거나 만료되지 않았으며 유효한 서명이 있음
+ 액세스 토큰이 [올바른 사용자 풀과 앱 클라이언트](https://github.com/awslabs/aws-jwt-verify#verifying-jwts-from-amazon-cognito)에서 제공됨
+ 액세스 토큰 클레임에 [올바른 OAuth 2.0 범위](https://github.com/awslabs/aws-jwt-verify#checking-scope)가 포함됨
+ 액세스 및 ID 토큰을 서명한 키가 [사용자 풀의 **JWKS URI에 있는 `kid` 서명 키와 일치](https://github.com/awslabs/aws-jwt-verify#the-jwks-cache)함

  JWKS URI에는 사용자 토큰을 서명한 프라이빗 키에 대한 공개 정보가 포함됩니다. 사용자 풀의 JWKS URI는 `https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json`에서 찾을 수 있습니다.

Node.js 앱 또는 AWS Lambda 권한 부여자에서 사용할 수 있는 자세한 정보 및 예시 코드는 GitHub의 [https://github.com/awslabs/aws-jwt-verify](https://github.com/awslabs/aws-jwt-verify) 섹션을 참조하세요.

## 토큰 이해 및 검사
<a name="amazon-cognito-user-pools-using-tokens-manually-inspect"></a>

토큰 검사를 앱에 통합하기 전에 Amazon Cognito가 JWT를 어떻게 조합하는지 생각해 보세요. 사용자 풀에서 예시 토큰을 검색하세요. 디코딩하고 자세히 검사하여 특성을 이해하고 언제 무엇을 검증할지 결정하세요. 예를 들어 한 시나리오에서는 그룹 멤버십을 검사하고 또 다른 시나리오에서는 범위를 검사할 수 있습니다.

다음 섹션에서는 앱을 준비하면서 Amazon Cognito JWT를 수동으로 검사하는 프로세스를 설명합니다.

### JWT의 구조 확인
<a name="amazon-cognito-user-pools-using-tokens-step-1"></a>

JSON 웹 토큰(JWT)에는`.`(점)으로 구분된 세 개의 섹션이 있습니다.

**헤더**  
Amazon Cognito가 토큰을 서명하는 데 사용한 키 ID(`kid`) 및 RSA 알고리즘(`alg`)입니다. Amazon Cognito는 `RS256`이라는 `alg`로 토큰을 서명합니다. `kid`는 사용자 풀이 보유한 2048비트 RSA 프라이빗 서명 키에 대한 잘린 참조입니다.

**Payload**  
토큰 클레임입니다. ID 토큰의 클레임에는 사용자 속성 및 사용자 풀(`iss`), 앱 클라이언트(`aud`)에 대한 정보가 포함됩니다. 액세스 토큰의 페이로드에는 범위, 그룹 멤버십과 포함되며 사용자 풀이 `iss`로, 앱 클라이언트가 `client_id`로 포함됩니다.

**서명**  
서명은 헤더 및 페이로드와 같이 디코딩할 수 있는 base64url이 아닙니다. JWKS URI에서 관찰할 수 있는 서명 키와 파리미터에서 파생된 RSA256 식별자입니다.

헤더와 페이로드는 base64url로 인코딩된 JSON입니다. 시작 문자 `{`로 디코딩되는 시작 문자 `eyJ`로 알 수 있습니다. 사용자가 base64url로 인코딩된 JWT를 앱에 제시했는데 형식이 `[JSON Header].[JSON Payload].[Signature]`가 아닌 경우, 이는 유효한 Amazon Cognito 토큰이 아니므로 폐기해도 됩니다.

다음 예제 애플리케이션은 `aws-jwt-verify`를 사용하여 사용자 풀 토큰을 확인합니다.

```
// cognito-verify.js
// Usage example: node cognito-verify.js eyJra789ghiEXAMPLE

const { CognitoJwtVerifier } = require('aws-jwt-verify');

// Replace with your Amazon Cognito user pool ID
const userPoolId = 'us-west-2_EXAMPLE';

async function verifyJWT(token) {
  try {
    const verifier = CognitoJwtVerifier.create({
      userPoolId,
      tokenUse: 'access', // or 'id' for ID tokens
      clientId: '1example23456789', // Optional, only if you need to verify the token audience
    });

    const payload = await verifier.verify(token);
    console.log('Decoded JWT:', payload);
  } catch (err) {
    console.error('Error verifying JWT:', err);
  }
}

// Example usage
if (process.argv.length < 3) {
  console.error('Please provide a JWT token as an argument.');
  process.exit(1);
}

const MyToken = process.argv[2];
verifyJWT(MyToken);
```

### JWT 검증
<a name="amazon-cognito-user-pools-using-tokens-step-2"></a>

JWT 서명은 헤더와 페이로드의 해시 조합입니다. Amazon Cognito는 각 사용자 풀에서 RSA 암호화 키를 두 쌍 생성합니다. 하나의 프라이빗 키는 액세스 토큰을 서명하고 다른 하나는 ID 토큰을 서명합니다.

**JWT 토큰의 서명을 확인하는 방법**

1. ID 토큰을 디코딩합니다.

   또한 OpenID Foundation에는 [JWT 토큰 작업을 위한 라이브러리 목록이 포함되어 있습니다](http://openid.net/developers/jwt/).

    AWS Lambda 를 사용하여 사용자 풀 JWTs. 자세한 내용은를 [사용하여 Amazon Cognito JWT 토큰 디코딩 및 확인을 참조하세요 AWS Lambda](https://github.com/awslabs/aws-support-tools/tree/master/Cognito/decode-verify-jwt).

1. 로컬 키 ID(`kid`)를 퍼블릭 `kid`와 비교합니다.

   1. 사용자 풀에 해당되는 퍼블릭 JSON 웹 키(JWK)를 다운로드하고 저장합니다. 이 키는 JSON 웹 키 집합(JWKS)의 일부로 사용이 가능합니다. 사용자 환경에 다음 `jwks_uri` URL을 구성하여 찾을 수 있습니다.

      ```
      https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json
      ```

      JWK 및 JWK 집합에 대한 자세한 내용은 [JSON 웹 키(JWK)](https://tools.ietf.org/html/rfc7517)를 참조하십시오.
**참고**  
Amazon Cognito는 사용자 풀의 서명 키를 교체할 수 있습니다. 가장 좋은 방법은 `kid`를 캐시 키로 사용하여 앱에서 퍼블릭 키를 캐시하고 주기적으로 캐시를 새로 고치는 것입니다. 앱에서 받는 토큰의 `kid`를 캐시와 비교합니다.  
발급자는 올바르지만 `kid`가 다른 토큰을 받은 경우 Amazon Cognito가 서명 키를 교체했을 수 있습니다. 사용자 풀 `jwks_uri` 엔드포인트에서 캐시를 새로 고칩니다.

      다음은 샘플 `jwks.json` 파일입니다.

      ```
      {
      	"keys": [{
      		"kid": "1234example=",
      		"alg": "RS256",
      		"kty": "RSA",
      		"e": "AQAB",
      		"n": "1234567890",
      		"use": "sig"
      	}, {
      		"kid": "5678example=",
      		"alg": "RS256",
      		"kty": "RSA",
      		"e": "AQAB",
      		"n": "987654321",
      		"use": "sig"
      	}]
      }
      ```  
**키 ID(`kid`)**  
`kid`는 토큰의 JSON 웹 서명(JWS)을 보호하는 데 어떤 키가 사용되었는지 나타내는 힌트입니다.  
**알고리즘(`alg`)**  
`alg` 헤더 파라미터는 ID 토큰을 보호하는 데 사용되는 암호화 알고리즘을 나타냅니다. 사용자 풀은 SHA-256에서의 RSA 서명인 RS256 암호화 알고리즘을 사용합니다. RSA에 대한 자세한 내용은 [RSA 암호화](https://tools.ietf.org/html/rfc3447)를 참조하세요.  
**키 유형(`kty`)**  
`kty` 파라미터는 이 예제의 ‘RSA’와 같이 키에서 사용되는 암호화 알고리즘 그룹을 식별합니다.  
**RSA 지수(`e`)**  
`e` 파라미터는 RSA 퍼블릭 키의 지수 값을 포함합니다. 이 값은 Base64urlUInt 인코딩 값으로 표현됩니다.  
**RSA 모듈러스(`n`)**  
`n` 파라미터는 RSA 퍼블릭 키의 모듈러스 값을 포함합니다. 이 값은 Base64urlUInt 인코딩 값으로 표현됩니다.  
**사용(`use`)**  
`use` 파라미터는 퍼블릭 키의 용도를 설명합니다. 이 예제에서 `use` 값 `sig`는 서명을 나타냅니다.

   1. JWT의 `kid`와 일치하는 `kid`에서 퍼블릭 JSON 웹 키를 검색합니다.

### 클레임 확인
<a name="amazon-cognito-user-pools-using-tokens-step-3"></a>

**JWT 클레임을 확인하는 방법**

1. 다음 방법 중 하나를 사용하여 토큰이 만료되지 않았는지 확인합니다.

   1. 토큰을 디코딩하고 `exp` 클레임을 현재 시간과 비교합니다.

   1. 액세스 토큰에 `aws.cognito.signin.user.admin` 클레임이 포함된 경우 [GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html)와 같은 API에 요청을 보냅니다. [액세스 토큰으로 권한 부여](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pools-API-operations.html#user-pool-apis-auth-unauth)된 API 요청에서는 토큰이 만료되면 오류가 반환됩니다.

   1. [userInfo 엔드포인트](userinfo-endpoint.md) 요청 시 액세스 토큰을 제시합니다. 토큰이 만료된 경우 요청에서 오류가 반환됩니다.

1. ID 토큰의 `aud` 클레임 및 액세스 토큰의 `client_id` 클레임은 Amazon Cognito 사용자 풀에서 생성된 앱 클라이언트 ID와 일치해야 합니다.

1. 발행자(`iss`) 클레임은 사용자 풀과 일치해야 합니다. 예를 들어 `us-east-1` 리전에서 생성된 사용자 풀은 다음과 같은 `iss` 값을 갖게 됩니다.

   `https://cognito-idp.us-east-1.amazonaws.com/<userpoolID>`.

1. `token_use` 클레임을 확인합니다.
   + 웹 API 작업에서 액세스 토큰만 허용하는 경우 해당 값은 `access`여야 합니다.
   + ID 토큰만 사용하고 있는 경우 해당 값은 `id`여야 합니다.
   + ID와 액세스 토큰을 모두 사용하고 있는 경우에는 `token_use` 클레임이 `id` 또는 `access`여야 합니다.

이제 토큰 내에 있는 클레임을 신뢰할 수 있습니다.

# 사용자 풀 토큰 만료 및 캐싱 관리
<a name="amazon-cognito-user-pools-using-tokens-caching-tokens"></a>

앱은 새 JSON 웹 토큰(JWT)을 가져올 때마다 다음 요청 중 하나를 성공적으로 완료해야 합니다.
+ [Token 엔드포인트](token-endpoint.md)에서 클라이언트 자격 증명 또는 권한 부여 코드 [부여](https://www.rfc-editor.org/rfc/rfc6749#section-1.3)를 요청합니다.
+ 관리형 로그인 페이지에서 암시적 권한 부여를 요청합니다.
+ [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)와 같은 Amazon Cognito API 요청에서 로컬 사용자를 인증합니다.

사용자 풀을 구성하여 토큰이 분, 시간 또는 일 단위로 만료되도록 설정할 수 있습니다. 앱의 성능과 가용성을 보장하려면 토큰 수명의 약 75% 동안 Amazon Cognito 토큰을 사용한 다음 새 토큰을 가져와야 합니다. 앱용으로 구축한 캐시 솔루션은 토큰을 계속 사용할 수 있도록 하고 요청 비율이 너무 높을 때 Amazon Cognito의 요청 거부를 방지합니다. 클라이언트 측 앱은 메모리 캐시에 토큰을 저장해야 합니다. 서버 측 앱은 암호화된 캐시 메커니즘을 추가하여 토큰을 저장할 수 있습니다.

사용자 풀이 많은 양의 사용자 또는 머신 간 활동을 생성하는 경우 Amazon Cognito가 수행할 수 있는 토큰 요청 수에 대해 설정하는 제한에 이를 수 있습니다. Amazon Cognito 엔드포인트에 대한 요청 수를 줄이기 위해 인증 데이터를 안전하게 저장 및 재사용하거나 지수 백오프 및 재시도를 구현할 수 있습니다.

인증 데이터는 두 가지 종류의 클래스 엔드포인트에서 제공됩니다. Amazon Cognito [OAuth 2.0 엔드포인트](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)에는 클라이언트 자격 증명 및 관리형 로그인 인증 코드 요청 서비스를 제공하는 토큰 엔드포인트가 포함됩니다. [서비스 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html#cognito_identity_your_user_pools_region)는 `InitiateAuth` 및 `RespondToAuthChallenge`와 같은 사용자 풀 API 요청에 응답합니다. 각 요청 유형에는 고유한 제한이 있습니다. 제한에 대한 자세한 내용은 [Amazon Cognito의 할당량](quotas.md) 섹션을 참조하세요.

## Amazon API Gateway를 통해 머신 간 액세스 토큰 캐싱
<a name="amazon-cognito-user-pools-using-tokens-caching-tokens-API-gateway"></a>

API Gateway 토큰 캐싱을 사용하면 Amazon Cognito OAuth 엔드포인트의 기본 요청 속도 할당량보다 큰 이벤트에 대한 응답으로 앱을 확장할 수 있습니다.

![\[M2M에 대한 액세스 토큰의 캐시를 유지 관리하는 API Gateway의 다이어그램입니다. API 프록시는 토큰 요청을 처리하고 이미 유효한 경우 캐시된 토큰을 반환합니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/user-pools-m2m-caching.png)


캐시된 토큰이 만료된 경우에만 앱이 새 액세스 토큰을 요청하도록 액세스 토큰을 캐시할 수 있습니다. 그렇지 않으면 캐싱 엔드포인트가 캐시에서 토큰을 반환합니다. 이렇게 하면 Amazon Cognito API 엔드포인트에 대한 추가 호출이 방지됩니다. Amazon API Gateway를 [Token 엔드포인트](token-endpoint.md)에 대한 프록시로 사용하면 API가 요청 할당량에 기여하는 대부분의 요청에 응답하여 속도 제한으로 인해 실패한 요청을 방지합니다.

다음 API 게이트웨이 기반 솔루션은 짧은 대기 시간, 낮은 코드/코드 없는 토큰 캐싱 구현을 제공합니다. API Gateway API는 전송 중 암호화되며 필요에 따라 미사용 시에도 암호화됩니다. API 게이트웨이 캐시는 머신 간 및 마이크로서비스 세션을 승인하기 위해 액세스 토큰을 생성하는 자주 대용량 부여 유형인 OAuth 2.0 [클라이언트 자격 증명 부여](https://datatracker.ietf.org/doc/html/rfc6749#section-4.4)에 이상적입니다. 마이크로서비스가 수평적으로 확장되는 트래픽 급증과 같은 경우 사용자 풀 또는 앱 클라이언트의 AWS 요청 속도 제한을 초과하는 볼륨에서 동일한 클라이언트 자격 증명을 사용하는 많은 시스템으로 끝날 수 있습니다. 앱 가용성을 유지하고 지연 시간을 줄이려면 이러한 시나리오에서는 캐싱 솔루션이 가장 좋습니다.

이 솔루션에서는 API에 캐시를 정의하여 앱에서 요청하려는 OAuth 범위 및 앱 클라이언트의 각 조합에 대해 별도의 액세스 토큰을 저장합니다. 앱이 캐시 키와 일치하는 요청을 하면 API는 캐시 키와 일치하는 첫 번째 요청에 대해 Amazon Cognito가 발급한 액세스 토큰으로 응답합니다. 캐시 키 기간이 만료되면 API는 요청을 토큰 엔드포인트로 전달하고 새 액세스 토큰을 캐싱합니다.

**참고**  
캐시 키 지속 시간은 앱 클라이언트의 액세스 토큰 기간보다 짧아야 합니다.

캐시 키는 요청 본문의 `scope` 파라미터와 요청의 `Authorization` 헤더에서 요청한 OAuth 범위의 조합입니다. 이 `Authorization` 헤더에는 앱 클라이언트 ID와 클라이언트 보안 암호가 포함됩니다. 이 솔루션을 구현하기 위해 앱에서 추가 로직을 구현할 필요가 없습니다. 사용자 풀 토큰 엔드포인트의 경로를 변경하려면 구성만 업데이트해야 합니다.

[ElastiCache(Redis OSS)](https://docs.aws.amazon.com/elasticache/index.html)를 사용하여 토큰 캐싱을 구현할 수도 있습니다. AWS Identity and Access Management (IAM) 정책을 사용하여 세밀하게 제어하려면 [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/authentication-and-access-control.html#authentication) 캐시를 사용해 보세요.

**참고**  
API Gateway의 캐싱에는 추가 비용이 부과됩니다. [자세한 내용은 요금을 참조하세요.](https://aws.amazon.com/api-gateway/pricing)<a name="amazon-cognito-user-pools-using-tokens-caching-tokens-API-gateway-how-to"></a>

**API Gateway를 사용하여 캐싱 프록시를 설정하려면 다음과 같이 하세요.**

1. [API Gateway 콘솔](https://console.aws.amazon.com/apigateway/main/apis)을 열고 REST API를 생성합니다.

1. **Resources**(리소스)에서 POST 메서드를 생성합니다.

   1. HTTP **Integration type**(통합 유형)을 선택합니다.

   1. **Use HTTP proxy integration**(HTTP 프록시 통합 사용)을 선택합니다.

   1. `https://<your user pool domain>/oauth2/token`의 **Endpoint URL**(엔드포인트 URL)을 입력합니다.

1. **Resources**(리소스)에서 캐시 키를 구성합니다.

   1. POST 메서드의 **Method request**(메서드 요청)를 편집합니다.
**참고**  
이 메서드 요청 검증은 클라이언트 보안 암호가 요청 헤더에 인코딩되는 토큰 `Authorization` 요청에서 `client_secret_basic` 권한 부여와 함께 사용됩니다. `client_secret_post` 권한 부여에서 JSON 요청 본문을 검증하려면 [client\$1secret](token-endpoint.md#post-token-request-parameters-in-body)이 있어야 하는 [데이터 모델](https://docs.aws.amazon.com/apigateway/latest/developerguide/models-mappings-models.html)을 대신 생성합니다. 이 모델에서는 **요청 검사기**가 **본문, 쿼리 문자열 파라미터 및 헤더를 검증**해야 합니다.

   1. **쿼리 문자열 파라미터와 헤더를 검증**하기 위해 **요청 검사기** 메서드를 구성합니다. 요청 검증에 대한 자세한 내용은 *Amazon API Gateway 개발자 가이드*의 [요청 검증](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html)을 참조하세요.

   1. `scope` 파라미터와 `Authorization` 헤더를 캐싱 키로 설정합니다.

      1. **URL 쿼리 문자열 파라미터**에 쿼리 문자열을 추가합니다. `scope`의 쿼리 문자열 **이름**을 입력하고 **필수** 및 **캐싱**을 선택합니다.

      1. **HTTP 요청 헤더**에 헤더를 추가합니다. `Authorization`의 요청 헤더 **이름**을 입력하고 **필수** 및 **캐싱**을 선택합니다.

1. **Stages**(단계)에서 캐싱을 구성합니다.

   1. 수정할 스테이지를 선택하고 **스테이지 세부 정보**에서 **편집**을 선택합니다.

   1. **추가 설정**의 **캐시 설정**에서 **프로비저닝 API 캐시** 옵션을 켭니다.

   1. **Cache capacity**(캐시 용량)를 선택합니다. 캐시 용량이 높을수록 성능이 향상되지만 추가 비용이 발생합니다.

   1. **권한 부여 필요** 확인란의 선택을 취소합니다. **계속**을 선택합니다.

   1. API Gateway는 단계 수준의 GET 메서드에만 캐시 정책을 적용합니다. 캐시 정책 재정의를 POST 메서드에 적용해야 합니다.

      구성한 단계를 확장하고 `POST` 메서드를 선택합니다. 메서드에 대한 캐시 설정을 생성하려면 **재정의 생성**을 선택합니다.

   1. **메서드 캐시 활성화** 옵션을 활성화합니다.

   1. 3,600초의 ****캐시 TTL(time-to-live)****을 입력합니다. **저장**을 선택합니다.

1. **Stages**(단계)에서 **Invoke URL**(URL 호출)을 기록해 둡니다.

1. 사용자 풀의 `/oauth2/token` 엔드포인트 대신 API의 **Invoke URL**(URL 호출)에 대한 POST 토큰 요청으로 앱을 업데이트합니다.