

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

# 공유 암호가 있는 JSON 웹 토큰(JWT) 사용
<a name="create-index-access-control-tokens-jwtshared"></a>

다음 예제는 인덱스를 생성할 때 사용자 액세스 제어를 위해 공유 암호 토큰이 있는 JSON 웹 토큰(JWT)을 사용하는 방법을 보여줍니다.

------
#### [ Console ]

1. 새 인덱스 생성을 시작하려면 **인덱스 생성**을 선택합니다.

1. **인덱스 세부정보 지정** 페이지에서 인덱스에 이름과 설명을 입력합니다.

1. **IAM 역할**에서 역할을 선택하거나 **새 역할 생성**을 선택하고 역할 이름을 지정하여 새 역할을 생성합니다. IAM 역할에는 “AmazonKendra-”라는 접두사가 붙습니다.

1. 다른 모든 필드의 기본값은 그대로 둡니다. **다음**을 선택합니다.

1. **사용자 액세스 제어 구성** 페이지의 **액세스 제어 설정**에서 **예**를 선택하여 액세스 제어에 토큰을 사용합니다.

1. **토큰 구성**에서 **토큰 유형**으로 **공유 암호와 JWT**를 선택합니다.

1. **공유 암호 서명 파라미터**에서 **암호 유형**을 선택합니다. 기존의 AWS Secrets Manager 공유 암호를 사용하거나 새 공유 암호를 생성할 수 있습니다.

   새 공유 암호를 생성하려면 **새로 만들기**를 선택한 후 다음 단계를 수행합니다.

   1. **새 AWS Secrets Manager 보안** 암호에서 **보안 암호 이름을** 지정합니다. 퍼블릭 키를 저장하면 `AmazonKendra-` 접두사가 추가됩니다.

   1. **키 ID**를 지정합니다. 키 ID는 토큰의 JSON 웹 서명을 보호하는 데 어떤 키가 사용되었는지 나타내는 힌트입니다.

   1. 토큰의 서명 **알고리즘**을 선택합니다. ID 토큰을 보호하는 데 사용되는 암호화 알고리즘입니다. RSA에 대한 자세한 내용은 [RSA 암호화](https://tools.ietf.org/html/rfc3447)를 참조하세요.

   1. base64 URL로 인코딩된 암호를 입력하여 **공유 암호**를 지정합니다. **암호 생성**을 선택하여 암호가 자동으로 생성되도록 할 수도 있습니다. 암호가 base64 URL로 인코딩된 암호인지 확인해야 합니다.

   1. (선택 사항) 공유 암호가 유효한 시기를 지정합니다.** 암호가 유효한 날짜와 시간(시작, 종료, 또는 둘 모두)을 지정할 수 있습니다. 암호는 지정한 기간 동안 유효합니다.

   1. **암호 저장**을 선택하여 새 암호를 저장합니다.

1. (선택 사항) **고급 구성**에서:**

   1. ACL 검사에 사용할 **사용자 이름**을 지정합니다.

   1. ACL 검사에 사용할 **그룹**을 하나 이상 지정합니다.

   1. 토큰 발행자를 검증할 **발행자**를 지정합니다.

   1. **클레임 ID**를 지정합니다. JWT의 대상과 일치하는 정규 표현식을 지정해야 합니다.

1. **프로비저닝 세부 정보** 페이지에서 **개발자 에디션**을 선택합니다.

1. **생성**을 선택하여 인덱스를 생성합니다.

1. 인덱스가 생성될 때까지 기다립니다. Amazon Kendra 는 인덱스의 하드웨어를 프로비저닝합니다. 이 작업에는 다소 시간이 걸릴 수 있습니다.

------
#### [ CLI ]

내부에서 공유 보안 암호와 함께 JWT 토큰을 사용할 수 있습니다 AWS Secrets Manager. 암호는 base64 URL로 인코딩된 암호여야 합니다. Secrets Manager ARN이 필요하며 Amazon Kendra 역할에 Secrets Manager 리소스의 `GetSecretValue`에 대한 액세스 권한이 있어야 합니다. 를 사용하여 Secrets Manager 리소스를 암호화하는 경우 AWS KMS역할에 복호화 작업에 대한 액세스 권한도 있어야 합니다.

JSON 입력 파일을 AWS CLI 사용하여 로 인덱스를 생성하려면 먼저 원하는 파라미터로 JSON 파일을 생성합니다.

```
{
    "Name": "user-context",
    "Edition": "ENTERPRISE_EDITION",
    "RoleArn": "arn:aws:iam::account-id:role:/my-role",
    "UserTokenConfigurations": [
        {
            "JwtTokenTypeConfiguration": {
                "KeyLocation": "SECRET_MANAGER",
                "Issuer": "optional: specify the issuer url",
                "ClaimRegex": "optional: regex to validate claims in the token",
                "UserNameAttributeField": "optional: user",
                "GroupAttributeField": "optional: group",
                "SecretManagerArn": "arn:aws:secretsmanager:us-west-2:account id:secret:/my-user-context-secret
            }
        }
    ],    
    "UserContextPolicy": "USER_TOKEN"
}
```

기본 사용자 및 그룹 필드 이름을 재정의할 수 있습니다. `UserNameAttributeField`의 기본값은 “user”입니다. `GroupAttributeField`의 기본값은 "groups"입니다.

다음으로, 입력 파일을 사용하여 `create-index`를 호출합니다. 예를 들어 JSON 파일 이름이 `create-index-openid.json`인 경우 다음을 사용할 수 있습니다.

```
aws kendra create-index --cli-input-json file://create-index-openid.json
```

보안 암호의 형식은 AWS Secrets Manager다음과 같아야 합니다.

```
{
  "keys": [
    {
      "kid": "key_id",
      "alg": "HS256|HS384|HS512",
      "kty": "OCT", 
      "use": "sig", //this value can be sig only for now
      "k": "secret",
      "nbf":"ISO1806 date format"
      "exp":"ISO1806 date format"
    }
  ]
}
```

JWT에 대한 자세한 내용은 [jwt.io](http://jwt.io)를 참조하세요.

------
#### [ Python ]

내부에서 공유 보안 암호와 함께 JWT 토큰을 사용할 수 있습니다 AWS Secrets Manager. 암호는 base64 URL로 인코딩된 암호여야 합니다. Secrets Manager ARN이 필요하며 Amazon Kendra 역할에 Secrets Manager 리소스의 `GetSecretValue`에 대한 액세스 권한이 있어야 합니다. 를 사용하여 Secrets Manager 리소스를 암호화하는 경우 AWS KMS역할에 복호화 작업에 대한 액세스 권한도 있어야 합니다.

```
response = kendra.create_index(
    Name='user-context',
    Edition='ENTERPRISE_EDITION',
    RoleArn='arn:aws:iam::account-id:role:/my-role',
    UserTokenConfigurations=[
        {
            "JwtTokenTypeConfiguration": {
                "KeyLocation": "URL",
                "Issuer": "optional: specify the issuer url",
                "ClaimRegex": "optional: regex to validate claims in the token",
                "UserNameAttributeField": "optional: user",
                "GroupAttributeField": "optional: group",
                "SecretManagerArn": "arn:aws:secretsmanager:us-west-2:account id:secret:/my-user-context-secret"
            }
        }
    ],
    UserContextPolicy='USER_TOKEN'
)
```

------