

# AWS Identity and Access Management(IAM) 및 DynamoDB
<a name="identity-and-access-mgmt"></a>

 AWS Identity and Access Management는 관리자가 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있도록 지원하는 AWS 서비스입니다. 관리자는 Amazon DynamoDB 및 DynamoDB Accelerator 리소스를 사용하기 위해 인증되고(로그인되고) 권한을 부여받을 수 있는(권한 있는) 사용자를 제어합니다. IAM을 사용하여 Amazon DynamoDB 및 DynamoDB Accelerator 모두에 대한 액세스 권한을 관리하고 보안 정책을 구현할 수 있습니다. IAM은 추가 비용 없이 사용할 수 있는 AWS 서비스입니다.

 

**Topics**
+ [Amazon DynamoDB의 Identity and Access Management](security-iam.md)
+ [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md)

# Amazon DynamoDB의 Identity and Access Management
<a name="security-iam"></a>





AWS Identity and Access Management(IAM)는 관리자가 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있도록 지원하는 AWS 서비스입니다. IAM 관리자는 누가 DynamoDB 리소스를 사용하도록 *인증*되고(로그인됨) *권한이 부여*되는지(권한 있음)를 제어합니다. IAM은 추가 비용 없이 사용할 수 있는 AWS 서비스입니다.

**Topics**
+ [고객](#security_iam_audience)
+ [ID를 통한 인증](#security_iam_authentication)
+ [정책을 사용하여 액세스 관리](#security_iam_access-manage)
+ [Amazon DynamoDB에서 IAM을 사용하는 방법](security_iam_service-with-iam.md)
+ [Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md)
+ [Amazon DynamoDB 자격 증명 및 액세스 문제 해결](security_iam_troubleshoot.md)
+ [DynamoDB 예약 용량 구매를 방지하는 IAM 정책](iam-policy-prevent-purchase-reserved-capacity.md)

## 고객
<a name="security_iam_audience"></a>

AWS Identity and Access Management(IAM)를 사용하는 방법은 역할에 따라 다릅니다.
+ **서비스 사용자** - 기능에 액세스할 수 없는 경우 관리자에게 권한 요청(참조[Amazon DynamoDB 자격 증명 및 액세스 문제 해결](security_iam_troubleshoot.md))
+ **서비스 관리자** - 사용자 액세스 결정 및 권한 요청 제출([Amazon DynamoDB에서 IAM을 사용하는 방법](security_iam_service-with-iam.md) 참조)
+ **IAM 관리자** - 액세스를 관리하기 위한 정책 작성([Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md) 참조)

## ID를 통한 인증
<a name="security_iam_authentication"></a>

인증은 ID 자격 증명을 사용하여 AWS에 로그인하는 방식입니다. AWS 계정 루트 사용자이나 IAM 사용자로, 또는 IAM 역할을 수임하여 인증(에 로그인)받아야 합니다.

AWS IAM Identity Center(IAM Identity Center), Single Sign-On 인증 또는 Google/Facebook 자격 증명과 같은 자격 증명 소스의 자격 증명을 사용하여 페더레이션 ID로 로그인할 수 있습니다. 로그인하는 방법에 대한 자세한 내용은 *AWS Sign-In사용 설명서*의 [AWS 계정에 로그인하는 방법](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 섹션을 참조하세요.

프로그래밍 방식 액세스를 위해 AWS는 요청에 암호화 방식으로 서명할 수 있는 SDK 및 CLI를 제공합니다. 자세한 내용은 *IAM 사용 설명서*의 [API 요청용 AWS Signature Version 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html) 섹션을 참조하세요.

### AWS 계정 루트 사용자
<a name="security_iam_authentication-rootuser"></a>

 AWS 계정을 생성하는 경우에는 모든 AWS 서비스 서비스와 리소스에 대한 완전한 액세스 권한이 있는 AWS 계정 *루트 사용자*라는 단일 로그인 ID로 시작합니다. 일상적인 태스크에 루트 사용자를 사용하지 않을 것을 강력히 권장합니다. 루트 사용자 자격 증명이 필요한 작업은 *IAM 사용 설명서*의 [루트 사용자 자격 증명이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks) 섹션을 참조하세요.

### 페더레이션 ID
<a name="security_iam_authentication-federated"></a>

가장 좋은 방법은 인간 사용자가 ID 공급자와의 페더레이션을 사용하여 임시 자격 증명으로 AWS 서비스에 액세스하도록 하는 것입니다.

*페더레이션 ID*는 엔터프라이즈 사용자 디렉터리, 웹 ID 제공업체 또는 Directory Service의 사용자로, ID의 자격 증명을 사용하여 AWS 서비스에 액세스합니다. 페더레이션 ID는 임시 자격 증명을 제공하는 역할을 수임합니다.

중앙 집중식 액세스 관리를 위해 AWS IAM Identity Center를 추천합니다. 자세한 정보는 *AWS IAM Identity Center사용 설명서*의 [What is IAM Identity Center?](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)를 참조하세요.

### IAM 사용자 및 그룹
<a name="security_iam_authentication-iamuser"></a>

*[IAM 사용자](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)*는 단일 개인 또는 애플리케이션에 대한 특정 권한을 가진 ID입니다. 장기 자격 증명이 있는 IAM 사용자 대신 임시 자격 증명을 사용하는 것이 좋습니다. 자세한 내용은 *IAM 사용 설명서*에서 [임시 자격 증명을 사용하여 AWS에 액세스하려면 인간 사용자가 ID 제공업체와의 페더레이션을 사용하도록 요구](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)를 참조하세요.

[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)은 IAM 사용자 모음을 지정하고 대규모 사용자 집합에 대한 관리 권한을 더 쉽게 만듭니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 사용자 사용 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html) 섹션을 참조하세요.

### IAM 역할
<a name="security_iam_authentication-iamrole"></a>

*[IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)*은 임시 자격 증명을 제공하는 특정 권한이 있는 자격 증명입니다. [사용자에서 IAM 역할(콘솔)로 전환](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)하거나 AWS CLI 또는 AWS API 작업을 직접적으로 호출하여 역할을 수임할 수 있습니다. 자세한 내용은 *IAM 사용 설명서*의 [역할 수임 방법](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)을 참조하세요.

IAM 역할은 페더레이션 사용자 액세스, 임시 IAM 사용자 권한, 교차 계정 액세스, 교차 서비스 액세스 및 Amazon EC2에서 실행되는 애플리케이션에 유용합니다. 자세한 내용은 *IAM 사용 설명서*의 [교차 계정 리소스 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)를 참조하세요.

## 정책을 사용하여 액세스 관리
<a name="security_iam_access-manage"></a>

정책을 생성하고 AWS ID 또는 리소스에 연결하여 AWS에서 내 액세스를 제어합니다. 정책은 자격 증명이나 리소스와 연결될 때 해당 권한을 정의합니다. AWS는 보안 주체가 요청을 보낼 때 이러한 정책을 평가합니다. 대부분의 정책은 AWS에 JSON 문서로 저장됩니다. JSON 정책 문서에 대한 자세한 내용은 *IAM 사용 설명서*의 [JSON 정책 개요](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json) 섹션을 참조하세요.

정책을 사용하여 관리자는 어떤 **보안 주체**가 어떤 **리소스**에 대해 어떤 **조건**에서 **작업**을 수행할 수 있는지 정의하여 누가 무엇을 액세스할 수 있는지 지정합니다.

기본적으로 사용자 및 역할에는 어떠한 권한도 없습니다. IAM 관리자는 IAM 정책을 생성하고 사용자가 수임할 수 있는 역할에 추가합니다. IAM 정책은 작업을 수행하기 위해 사용하는 방법과 관계없이 작업에 대한 권한을 정의합니다.

### ID 기반 정책
<a name="security_iam_access-manage-id-based-policies"></a>

ID 기반 정책은 ID(사용자, 사용자 그룹 또는 역할)에 연결하는 JSON 권한 정책 문서입니다. 이러한 정책은 자격 증명이 수행할 수 있는 작업, 대상 리소스 및 이에 관한 조건을 제어합니다. ID 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용 설명서*에서 [고객 관리형 정책으로 사용자 지정 IAM 권한 정의](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)를 참조하세요.

ID 기반 정책은 *인라인 정책*(단일 ID에 직접 포함) 또는 *관리형 정책*(여러 ID에 연결된 독립 실행형 정책)일 수 있습니다. 관리형 정책 또는 인라인 정책을 선택하는 방법을 알아보려면 *IAM 사용 설명서*의 [관리형 정책 및 인라인 정책 중에서 선택](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html) 섹션을 참조하세요.

### 리소스 기반 정책
<a name="security_iam_access-manage-resource-based-policies"></a>

리소스 기반 정책은 리소스에 연결하는 JSON 정책 설명서입니다. 예를 들어 IAM *역할 신뢰 정책* 및 Amazon S3 *버킷 정책*이 있습니다. 리소스 기반 정책을 지원하는 서비스에서 서비스 관리자는 이러한 정책을 사용하여 특정 리소스에 대한 액세스를 통제할 수 있습니다. 리소스 기반 정책에서 [보안 주체를 지정](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)해야 합니다.

리소스 기반 정책은 해당 서비스에 있는 인라인 정책입니다. 리소스 기반 정책에서는 IAM의 AWS관리형 정책을 사용할 수 없습니다.

### 기타 정책 유형
<a name="security_iam_access-manage-other-policies"></a>

AWS는 이러한 정책 타입이 부여하는 최대 권한을 설정할 수 있는 추가 정책 타입을 지지합니다.
+ **권한 경계** - ID 기반 정책에서 IAM 엔터티에 부여할 수 있는 최대 권한을 설정합니다. 자세한 정보는 *IAM 사용 설명서*의 [IAM 엔터티의 권한 범위](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)를 참조하세요.
+ **서비스 제어 정책(SCP)** - AWS Organizations내 조직 또는 조직 단위에 대한 최대 권한을 지정합니다. 자세한 내용은 AWS Organizations사용 설명서의 [서비스 제어 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)을 참조하세요.**
+ **리소스 제어 정책(RCP)** – 계정의 리소스에 사용할 수 있는 최대 권한을 설정합니다. 자세한 내용은 *AWS Organizations사용 설명서*의 [리소스 제어 정책(RCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)을 참조하세요.
+ **세션 정책** – 역할 또는 페더레이션 사용자에 대해 임시 세션을 프로그래밍 방식으로 생성할 때 파라미터로 전달하는 고급 정책입니다. 자세한 내용은 *IAM 사용 설명서*의 [세션 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)을 참조하세요.

### 여러 정책 유형
<a name="security_iam_access-manage-multiple-policies"></a>

여러 정책 유형이 요청에 적용되는 경우, 결과 권한은 이해하기가 더 복잡합니다. 여러 정책 유형이 관련될 때 AWS가 요청을 허용할지 여부를 결정하는 방법을 알아보려면 *IAM 사용 설명서*의 [정책 평가 로직](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)을 참조하세요.

# Amazon DynamoDB에서 IAM을 사용하는 방법
<a name="security_iam_service-with-iam"></a>

IAM을 사용하여 DynamoDB에 대한 액세스를 관리하기 전에 DynamoDB와 함께 사용할 수 있는 IAM 기능을 알아보세요.






| IAM 특성 | DynamoDB 지원 | 
| --- | --- | 
|  [자격 증명 기반 정책](#security_iam_service-with-iam-id-based-policies)  |   예  | 
|  [리소스 기반 정책](#security_iam_service-with-iam-resource-based-policies)  |   예  | 
|  [정책 작업](#security_iam_service-with-iam-id-based-policies-actions)  |   예  | 
|  [정책 리소스](#security_iam_service-with-iam-id-based-policies-resources)  |   예  | 
|  [정책 조건 키](#security_iam_service-with-iam-id-based-policies-conditionkeys)  |   예  | 
|  [ACL](#security_iam_service-with-iam-acls)  |   아니요   | 
|  [ABAC(정책의 태그)](#security_iam_service-with-iam-tags)  |   예  | 
|  [임시 보안 인증](#security_iam_service-with-iam-roles-tempcreds)  |   예  | 
|  [엔터티 권한](#security_iam_service-with-iam-principal-permissions)  |   예  | 
|  [서비스 역할](#security_iam_service-with-iam-roles-service)  |   예  | 
|  [서비스 연결 역할](#security_iam_service-with-iam-roles-service-linked)  |   예  | 

DynamoDB 및 기타 AWS 서비스가 대부분의 IAM 기능과 작동하는 방법을 개괄적으로 알아보려면 *IAM 사용 설명서*의 [IAM으로 작업하는 AWS 서비스](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)를 참조하세요.

## DynamoDB에 대한 자격 증명 기반 정책
<a name="security_iam_service-with-iam-id-based-policies"></a>

**ID 기반 정책 지원:** 예

ID 기반 정책은 IAM 사용자, 사용자 그룹 또는 역할과 같은 ID에 연결할 수 있는 JSON 권한 정책 문서입니다. 이러한 정책은 사용자 및 역할이 어떤 리소스와 어떤 조건에서 어떤 작업을 수행할 수 있는지를 제어합니다. 자격 증명 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용 설명서*에서 [고객 관리형 정책으로 사용자 지정 IAM 권한 정의](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)를 참조하세요.

IAM ID 기반 정책을 사용하면 허용되거나 거부되는 작업과 리소스뿐 아니라 작업이 허용되거나 거부되는 조건을 지정할 수 있습니다. JSON 정책에서 사용할 수 있는 모든 요소에 대해 알아보려면 *IAM 사용 설명서*의 [IAM JSON 정책 요소 참조](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)를 참조하세요.

### DynamoDB 자격 증명 기반 정책 예제
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>



DynamoDB 자격 증명 기반 정책의 예를 보려면 [Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md) 섹션을 참조하세요.

## DynamoDB 내 리소스 기반 정책
<a name="security_iam_service-with-iam-resource-based-policies"></a>

**리소스 기반 정책 지원:** 예

리소스 기반 정책은 리소스에 연결하는 JSON 정책 설명서입니다. 리소스 기반 정책의 예제는 IAM *역할 신뢰 정책*과 Amazon S3 *버킷 정책*입니다. 리소스 기반 정책을 지원하는 서비스에서 서비스 관리자는 이러한 정책을 사용하여 특정 리소스에 대한 액세스를 통제할 수 있습니다. 정책이 연결된 리소스의 경우 정책은 지정된 보안 주체가 해당 리소스와 어떤 조건에서 어떤 작업을 수행할 수 있는지를 정의합니다. 리소스 기반 정책에서 [보안 주체를 지정](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)해야 합니다. 위탁자에는 계정, 사용자, 역할, 페더레이션 사용자 또는 AWS 서비스가 포함될 수 있습니다.

교차 계정 액세스를 활성화하려는 경우, 전체 계정이나 다른 계정의 IAM 개체를 리소스 기반 정책의 보안 주체로 지정할 수 있습니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM에서 교차 계정 리소스 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)를 참조하세요.

## DynamoDB의 정책 작업
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

**정책 작업 지원:** 예

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지를 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

JSON 정책의 `Action`요소는 정책에서 액세스를 허용하거나 거부하는 데 사용할 수 있는 작업을 설명합니다. 연결된 작업을 수행할 수 있는 권한을 부여하기 위한 정책에 작업을 포함하세요.



DynamoDB 작업 목록을 보려면 *서비스 권한 부여 참조*에서 [Amazon DynamoDB에서 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)을 참조하세요.

DynamoDB의 정책 작업은 작업 앞에 다음 접두사를 사용합니다.

```
aws
```

단일 문에서 여러 작업을 지정하려면 쉼표로 구분합니다.

```
"Action": [
      "aws:action1",
      "aws:action2"
         ]
```





DynamoDB 자격 증명 기반 정책의 예를 보려면 [Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md) 섹션을 참조하세요.

## DynamoDB의 정책 리소스
<a name="security_iam_service-with-iam-id-based-policies-resources"></a>

**정책 리소스 지원:** 예

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지를 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

`Resource` JSON 정책 요소는 작업이 적용되는 하나 이상의 객체를 지정합니다. 모범 사례에 따라 [Amazon 리소스 이름(ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)을 사용하여 리소스를 지정합니다. 리소스 수준 권한을 지원하지 않는 작업의 경우, 와일드카드(\$1)를 사용하여 해당 문이 모든 리소스에 적용됨을 나타냅니다.

```
"Resource": "*"
```

DynamoDB 리소스 유형 및 해당 ARN 목록을 보려면 *서비스 승인 참조*에서 [Amazon DynamoDB에서 정의한 리소스](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-resources-for-iam-policies)를 참조하세요. 각 리소스의 ARN을 지정할 수 있는 작업을 알아보려면 [Amazon DynamoDB에서 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)을 참조하세요.





DynamoDB 자격 증명 기반 정책의 예를 보려면 [Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md) 섹션을 참조하세요.

## DynamoDB의 정책 조건 키
<a name="security_iam_service-with-iam-id-based-policies-conditionkeys"></a>

**서비스별 정책 조건 키 지원:** 예

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지를 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

`Condition` 요소는 정의된 기준에 따라 문이 실행되는 시기를 지정합니다. 같음(equals) 또는 미만(less than)과 같은 [조건 연산자](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)를 사용하여 정책의 조건을 요청의 값과 일치시키는 조건식을 생성할 수 있습니다. 모든 AWS 전역 조건 키를 보려면 *IAM 사용자 설명서*의 [AWS 전역 조건 컨텍스트 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 참조하세요.

DynamoDB 조건 키 목록을 보려면 *서비스 승인 참조*에서 [Amazon DynamoDB에 사용되는 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-policy-keys)를 참조하세요. 조건 키를 사용할 수 있는 작업과 리소스를 알아보려면 [Amazon DynamoDB에서 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)을 참조하세요.

DynamoDB 자격 증명 기반 정책의 예를 보려면 [Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md) 섹션을 참조하세요.

## DynamoDB의 액세스 제어 목록(ACL)
<a name="security_iam_service-with-iam-acls"></a>

**ACL 지원:** 아니요 

액세스 제어 목록(ACL)은 어떤 보안 주체(계정 멤버, 사용자 또는 역할)가 리소스에 액세스할 수 있는 권한을 가지고 있는지를 제어합니다. ACL은 JSON 정책 문서 형식을 사용하지 않지만 리소스 기반 정책과 유사합니다.

## DynamoDB의 ABAC(속성 기반 액세스 제어)
<a name="security_iam_service-with-iam-tags"></a>

**ABAC 지원(정책의 태그):** 예

속성 기반 액세스 제어(ABAC)는 태그라고 불리는 속성을 기반으로 권한을 정의하는 권한 부여 전략입니다. IAM 엔터티 및 AWS 리소스에 태그를 연결하면 보안 주체의 태그가 리소스 태그와 일치할 때 작업을 허용하도록 ABAC 정책을 설계할 수 있습니다.

태그에 근거하여 액세스를 제어하려면 `aws:ResourceTag/key-name`, `aws:RequestTag/key-name`또는 `aws:TagKeys`조건 키를 사용하여 정책의 [조건 요소](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)에 태그 정보를 제공합니다.

서비스가 모든 리소스 유형에 대해 세 가지 조건 키를 모두 지원하는 경우, 값은 서비스에 대해 **예**입니다. 서비스가 일부 리소스 유형에 대해서만 세 가지 조건 키를 모두 지원하는 경우, 값은 **부분적**입니다.

ABAC에 대한 자세한 내용은 *IAM 사용 설명서*의 [ABAC 권한 부여를 통한 권한 정의](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)를 참조하세요. ABAC 설정 단계가 포함된 자습서를 보려면 *IAM 사용 설명서*의 [속성 기반 액세스 제어(ABAC) 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)을 참조하세요.

## DynamoDB에서 임시 보안 인증 정보 사용
<a name="security_iam_service-with-iam-roles-tempcreds"></a>

**임시 자격 증명 지원:** 예

임시 자격 증명은 AWS리소스에 대한 단기 액세스를 제공하며 페더레이션 또는 전환 역할을 사용할 때 자동으로 생성됩니다. AWS에서는 장기 액세스 키를 사용하는 대신 임시 자격 증명을 동적으로 생성할 것을 권장합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM의 임시 보안 자격 증명](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) 및 [IAM으로 작업하는 AWS 서비스](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html) 섹션을 참조하세요.

## DynamoDB의 서비스 간 보안 주체 권한
<a name="security_iam_service-with-iam-principal-permissions"></a>

**전달 액세스 세션(FAS) 지원:** 예

 전달 액세스 세션(FAS)은 AWS 서비스를 직접 호출하는 보안 주체의 권한과 요청하는 AWS 서비스를 함께 사용하여 다운스트림 서비스에 대한 요청을 수행합니다. FAS 요청 시 정책 세부 정보는 [전달 액세스 세션](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_forward_access_sessions.html)을 참조하세요.

## DynamoDB의 서비스 역할
<a name="security_iam_service-with-iam-roles-service"></a>

**서비스 역할 지원:** 예

 서비스 역할은 서비스가 사용자를 대신하여 작업을 수행하는 것으로 가정하는 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)입니다. IAM 관리자는 IAM 내에서 서비스 역할을 생성, 수정 및 삭제할 수 있습니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 서비스 AWS에 권한을 위임할 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)을 참조하세요.

**주의**  
서비스 역할에 대한 권한을 변경하면 DynamoDB 기능이 중단될 수 있습니다. DynamoDB에서 관련 지침을 제공하는 경우에만 서비스 역할을 편집하세요.

## DynamoDB에 대한 서비스 연결 역할
<a name="security_iam_service-with-iam-roles-service-linked"></a>

**서비스 연결 역할 지원:** 예

 서비스 연결 역할은 AWS 서비스에 연결된 서비스 역할의 한 유형입니다. 서비스는 사용자를 대신하여 작업을 수행하기 위해 역할을 수임할 수 있습니다. 서비스 연결 역할은 AWS 계정에 나타나고, 서비스가 소유합니다. IAM 관리자는 서비스 연결 역할의 권한을 볼 수 있지만 편집은 할 수 없습니다.

서비스 연결 역할 생성 또는 관리에 대한 자세한 내용은 [IAM으로 작업하는 AWS서비스](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)를 참조하세요. **서비스 연결 역할** 열에서 `Yes`가 포함된 서비스를 테이블에서 찾습니다. 해당 서비스에 대한 서비스 연결 역할 설명서를 보려면 **예(Yes)** 링크를 선택합니다.

### DynamoDB에서 지원되는 서비스 연결 역할
<a name="security_iam_service-with-iam-roles-service-linked-supported-by-dynamodb"></a>

DynamoDB에서는 다음과 같은 서비스 연결 역할이 지원됩니다.
+ DynamoDB는 여러 AWS 리전 간의 글로벌 테이블 복제를 위해 서비스 연결 역할 **AWSServiceRoleForDynamoDBReplication**을 사용합니다. **AWSServiceRoleForDynamoDBReplication** 서비스 연결 역할에 대한 자세한 내용은 [DynamoDB 글로벌 테이블 보안](globaltables-security.md) 섹션을 참조하세요.
+ DynamoDB Accelerator(DAX)는 DAX 클러스터를 구성하고 유지 관리하기 위해 서비스 연결 역할 **AWSServiceRoleForDAX**를 사용합니다. **AWSServiceRoleForDAX** 서비스 연결 역할에 대한 자세한 내용은 [DAX에 대한 서비스 연결 IAM 역할 사용](using-service-linked-roles.md) 섹션을 참조하세요.

이러한 DynamoDB 서비스 연결 역할 외에도 DynamoDB는 프로비저닝된 용량 모드 테이블에서 처리량 설정을 자동으로 관리하기 위해 Application Auto Scaling 서비스를 사용합니다. Application Auto Scaling 서비스는 오토 스케일링이 활성화된 DynamoDB 테이블의 처리량 설정을 관리하기 위해 서비스 연결 역할 **AWSServiceRoleForApplicationAutoScaling\$1DynamoDBTable**을 사용합니다. 자세한 내용은 [Application Auto Scaling에 대한 서비스 연결 역할](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html)을 참조하세요.

# Amazon DynamoDB 자격 증명 기반 정책 예제
<a name="security_iam_id-based-policy-examples"></a>

기본적으로 사용자 및 역할에는 DynamoDB 리소스를 생성하거나 수정할 수 있는 권한이 없습니다. 사용자에게 사용자가 필요한 리소스에서 작업을 수행할 권한을 부여하려면 IAM 관리자가 IAM 정책을 생성하면 됩니다.

이러한 예제 JSON 정책 문서를 사용하여 IAM ID 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용 설명서*의 [IAM 정책 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)을 참조하세요.

각 리소스 유형에 대한 ARN 형식을 포함하여 DynamoDB에서 정의한 작업 및 리소스 유형에 대한 자세한 내용은 *서비스 승인 참조*에서 [Amazon DynamoDB에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html)를 참조하세요.

**Topics**
+ [정책 모범 사례](#security_iam_service-with-iam-policy-best-practices)
+ [DynamoDB 콘솔 사용](#security_iam_id-based-policy-examples-console)
+ [사용자가 자신의 고유한 권한을 볼 수 있도록 허용](#security_iam_id-based-policy-examples-view-own-permissions)
+ [Amazon DynamoDB에서 자격 증명 기반 정책 사용](using-identity-based-policies.md)

## 정책 모범 사례
<a name="security_iam_service-with-iam-policy-best-practices"></a>

자격 증명 기반 정책에 따라 계정에서 사용자가 DynamoDB 리소스를 생성, 액세스 또는 삭제할 수 있는지 여부가 결정됩니다. 이 작업으로 인해 AWS 계정에 비용이 발생할 수 있습니다. ID 기반 정책을 생성하거나 편집할 때는 다음 지침과 권장 사항을 따르세요.
+ **AWS 관리형 정책으로 시작하고 최소 권한을 향해 나아가기** - 사용자 및 워크로드에 권한 부여를 시작하려면 많은 일반 사용 사례에 대한 권한을 부여하는 *AWS관리형 정책*을 사용합니다. AWS 계정에서 사용할 수 있습니다. 사용 사례에 고유한 AWS고객 관리형 정책을 정의하여 권한을 줄이는 것이 좋습니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies) 또는 [AWS직무에 대한 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)을 참조하세요.
+ **최소 권한 적용** – IAM 정책을 사용하여 권한을 설정하는 경우, 작업을 수행하는 데 필요한 권한만 부여합니다. 이렇게 하려면 *최소 권한*으로 알려진 특정 조건에서 특정 리소스에 대해 수행할 수 있는 작업을 정의합니다. IAM을 사용하여 권한을 적용하는 방법에 대한 자세한 정보는 *IAM 사용 설명서*에 있는 [IAM의 정책 및 권한](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)을 참조하세요.
+ **IAM 정책의 조건을 사용하여 액세스 추가 제한** – 정책에 조건을 추가하여 작업 및 리소스에 대한 액세스를 제한할 수 있습니다. 예를 들어, SSL을 사용하여 모든 요청을 전송해야 한다고 지정하는 정책 조건을 작성할 수 있습니다. CloudFormation와 같이, 특정 AWS 서비스를 통해 사용되는 경우에만 서비스 작업에 대한 액세스 권한을 부여할 수도 있습니다. 자세한 내용은 *IAM 사용자 설명서*의 [IAM JSON 정책 요소: 조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)을 참조하세요.
+ **IAM Access Analyzer를 통해 IAM 정책을 확인하여 안전하고 기능적인 권한 보장** - IAM Access Analyzer에서는 IAM 정책 언어(JSON)와 모범 사례가 정책에서 준수되도록 새로운 및 기존 정책을 확인합니다. IAM Access Analyzer는 100개 이상의 정책 확인 항목과 실행 가능한 추천을 제공하여 안전하고 기능적인 정책을 작성하도록 돕습니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM Access Analyzer에서 정책 검증](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)을 참조하세요.
+ **다중 인증(MFA) 필요** – AWS 계정에 IAM 사용자 또는 루트 사용자가 필요한 시나리오가 있는 경우, 추가 보안을 위해 MFA를 설정합니다. API 작업을 직접적으로 호출할 때 MFA가 필요하면 정책에 MFA 조건을 추가합니다. 자세한 내용은 *IAM 사용 설명서*의 [MFA를 통한 보안 API 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)를 참조하세요.

IAM의 모범 사례에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

## DynamoDB 콘솔 사용
<a name="security_iam_id-based-policy-examples-console"></a>

Amazon DynamoDB 콘솔에 액세스하려면 최소한의 권한 집합이 있어야 합니다. 이러한 권한은 AWS 계정에서 DynamoDB 리소스에 대한 세부 정보를 나열하고 볼 수 있도록 허용해야 합니다. 최소 필수 권한보다 더 제한적인 ID 기반 정책을 생성하는 경우, 콘솔이 해당 정책에 연결된 엔티티(사용자 또는 역할)에 대해 의도대로 작동하지 않습니다.

AWS CLI 또는 AWS API만 직접적으로 호출하는 사용자에게 최소 콘솔 권한을 허용할 필요가 없습니다. 대신, 수행하려는 API 작업과 일치하는 작업에만 액세스할 수 있도록 합니다.

사용자와 역할이 DynamoDB 콘솔을 여전히 사용할 수 있도록 하려면 DynamoDB `ConsoleAccess` 또는 `ReadOnly` AWS 관리형 정책을 엔터티에 추가합니다. 자세한 내용은 *IAM 사용 설명서*의 [사용자에게 권한 추가](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)를 참조하세요.

## 사용자가 자신의 고유한 권한을 볼 수 있도록 허용
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

이 예제는 IAM 사용자가 자신의 사용자 ID에 연결된 인라인 및 관리형 정책을 볼 수 있도록 허용하는 정책을 생성하는 방법을 보여줍니다. 이 정책에는 콘솔에서 또는 AWS CLI나 AWS API를 사용하여 프로그래밍 방식으로 이 작업을 완료할 수 있는 권한이 포함됩니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

# Amazon DynamoDB에서 자격 증명 기반 정책 사용
<a name="using-identity-based-policies"></a>

이 항목에서는 Amazon DynamoDB에서 AWS Identity and Access Management(IAM) 정책을 사용하는 방법을 설명하고 예시를 제공합니다. 이 예제에서는 계정 관리자가 IAM 자격 증명(사용자, 그룹, 역할)에 권한 정책을 연결함으로써 Amazon DynamoDB 리소스에 대한 작업을 수행할 권한을 부여하는 방법을 보여 줍니다.

이 주제의 섹션에서는 다음 내용을 학습합니다.
+ [Amazon DynamoDB 콘솔을 사용하는 데 필요한 IAM 권한](#console-permissions)
+ [Amazon DynamoDB에 대한 AWS 관리형(미리 정의된) IAM 정책](#access-policy-examples-aws-managed)
+ [고객 관리형 정책 예제](#access-policy-examples-for-sdk-cli)



다음은 권한 정책의 예제입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DescribeQueryScanBooksTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:Query",
                "dynamodb:Scan"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:111122223333:table/Books"
        }
    ]
}
```

------

 앞의 정책에는 `account-id`에 의해 지정된 AWS 계정이 소유하는 `us-west-2` AWS 리전 내 테이블에서 세 가지 DynamoDB 작업(`dynamodb:DescribeTable`, `dynamodb:Query`, 및 `dynamodb:Scan`)에 대한 권한을 부여하는 문이 하나 있습니다. `Resource` 값의 *Amazon 리소스 이름(ARN)*은 권한이 적용되는 테이블을 지정합니다.

## Amazon DynamoDB 콘솔을 사용하는 데 필요한 IAM 권한
<a name="console-permissions"></a>

사용자가 DynamoDB 콘솔로 작업하려면 AWS 계정의 DynamoDB 리소스로 작업하도록 허용하는 최소 권한 집합이 있어야 합니다. 이 DynamoDB 권한 이외에 콘솔에는 다음 권한이 필요합니다.
+ 지표 및 그래프를 표시할 수 있는 Amazon CloudWatch 권한
+ AWS Data PipelineDynamoDB 데이터를 내보내고 가져오기 위한 권한 
+  AWS Identity and Access Management내보내기 및 가져오기 작업에 필요한 역할에 액세스할 수 있는 권한.
+ CloudWatch 경보가 트리거될 때마다 사용자에게 알릴 수 있는 Amazon Simple Notification Service 권한
+ AWS LambdaDynamoDB Streams 레코드를 처리할 수 있는 권한

최소 필수 권한보다 더 제한적인 IAM 정책을 만들면 콘솔은 해당 IAM 정책에 연결된 사용자에 대해 의도대로 작동하지 않습니다. 이 사용자가 DynamoDB 콘솔을 계속 사용할 수 있도록 하려면 `AmazonDynamoDBReadOnlyAccess` AWS 관리형 정책도 사용자에게 연결합니다([Amazon DynamoDB에 대한 AWS 관리형(미리 정의된) IAM 정책](#access-policy-examples-aws-managed) 참조).

AWS CLI 또는 Amazon DynamoDB API만 호출하는 사용자에게는 최소 콘솔 권한을 허용할 필요가 없습니다.

**참고**  
 VPC 엔드포인트를 참조하는 경우 IAM 작업(dynamodb:DescribeEndpoints)을 사용하여 요청하는 IAM 보안 주체에 대한 DescribeEndpoints API 호출도 승인해야 합니다. 자세한 내용은 [엔드포인트에 필요한 정책](inter-network-traffic-privacy.md#inter-network-traffic-DescribeEndpoints)을 참조하세요.

## Amazon DynamoDB에 대한 AWS 관리형(미리 정의된) IAM 정책
<a name="access-policy-examples-aws-managed"></a>

AWS는 에서 생성하고 관리하는 독립형 IAM 정책을 제공하여 몇 가지 일반적인 사용 사례를 처리합니다.AWS 이러한 AWS 관리형 정책은 사용자가 필요한 권한을 조사할 필요가 없도록 일반 사용 사례에 필요한 권한을 부여합니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)을 참조하세요.

계정의 사용자에게 연결할 수 있는 다음 AWS 관리형 정책은 DynamoDB에 고유하며, 사용 사례 시나리오별로 그룹화되어 있습니다.
+ **AmazonDynamoDBReadOnlyAccess** - AWS Management Console을 통해 DynamoDB 리소스에 대한 읽기 전용 액세스 권한을 부여합니다.
+ **AmazonDynamoDBFullAccess** - AWS Management Console을 통해 DynamoDB 리소스에 대한 전체 액세스 권한을 부여합니다.

IAM 콘솔에 로그인하고 이 콘솔에서 특정 정책을 검색하여 이러한 AWS 관리형 권한 정책을 검토할 수 있습니다.

**중요**  
가장 좋은 방법은 필요한 사용자, 역할 또는 그룹에 [최소 권한](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)을 부여하는 사용자 지정 IAM 정책을 생성하는 것입니다.

## 고객 관리형 정책 예제
<a name="access-policy-examples-for-sdk-cli"></a>

이 단원에서는 다양한 DynamoDB 작업에 대한 권한을 부여하는 정책의 예를 제공합니다. 이러한 정책은 AWS SDK 또는 AWS CLI를 사용하는 경우에 유효합니다. 콘솔을 사용하는 경우 콘솔에 해당하는 추가 권한을 부여해야 합니다. 자세한 내용은 [Amazon DynamoDB 콘솔을 사용하는 데 필요한 IAM 권한](#console-permissions) 섹션을 참조하세요.

**참고**  
다음 정책 예시에서는 모두 AWS 리전 중 하나를 사용하고 가상의 계정 ID와 테이블 이름을 포함합니다.

예시:
+ [테이블에서 모든 DynamoDB 작업에 대한 권한을 부여하는 IAM 정책](grant-permissions-to-any-action-on-table.md)
+ [DynamoDB 테이블의 항목에 대한 읽기 전용 권한을 부여하는 IAM 정책](read-only-permissions-on-table-items.md)
+ [특정 DynamoDB 테이블과 관련 인덱스에 대한 액세스 권한을 부여하는 IAM 정책](iam-policy-specific-table-indexes.md)
+ [DynamoDB 테이블에서 읽기, 쓰기, 업데이트 및 삭제 액세스 권한에 대한 IAM 정책](iam-policy-example-data-crud.md)
+ [동일한 AWS 계정의 다른 DynamoDB 환경에 대한 IAM 정책](iam-policy-separate-environments.md)
+ [DynamoDB 예약 용량 구매를 방지하는 IAM 정책](iam-prevent-purchase-reserved-capacity.md)
+ [DynamoDB 스트림에 대해서만 읽기 액세스 권한을 부여하는 IAM 정책(테이블은 부여하지 않음)](iam-policy-read-stream-only.md)
+ [AWS Lambda 함수가 DynamoDB 스트림 레코드에 액세스하도록 허용하는 IAM 정책](iam-policy-example-lamda-process-dynamodb-streams.md)
+ [DynamoDB Accelerator(DAX) 클러스터에 대한 읽기 및 쓰기 액세스 권한을 위한 IAM 정책](iam-policy-example-read-write-dax-access.md)

 *IAM 사용 설명서*에는 다음 [세 가지 추가 DynamoDB 예시](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html)가 포함되어 있습니다.
+ [Amazon DynamoDB: 특정 테이블에 대한 액세스 허용](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_specific-table.html)
+ [Amazon DynamoDB: 특정 열에 대한 액세스 허용](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_columns.html)
+ [Amazon DynamoDB: Amazon Cognito ID를 기준으로 DynamoDB에 대한 행 수준 액세스 허용](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_rows.html)

# 테이블에서 모든 DynamoDB 작업에 대한 권한을 부여하는 IAM 정책
<a name="grant-permissions-to-any-action-on-table"></a>

다음 정책은 `Books`라는 테이블에서 *모든* DynamoDB 작업을 위한 권한을 부여합니다. `Resource`에 지정된 리소스 ARN은 특정 AWS 리전 내의 테이블을 식별합니다. `Resource` ARN에서 테이블 이름 `Books`를 와일드카드 문자(\$1)로 바꾸면 *모든* DynamoDB 작업이 계정의 *모든* 테이블에서 허용됩니다. 이 정책이나 IAM 정책에서 와일드카드 문자를 사용하려면 먼저 보안에 미칠 수 있는 영향을 신중히 고려하세요.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllAPIActionsOnBooks",
            "Effect": "Allow",
            "Action": "dynamodb:*",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        }
    ]
}
```

------

**참고**  
이 예제에서는 와일드카드 문자(\$1)를 사용하여 관리, 데이터 작업, 모니터링, DynamoDB 예약 용량 구매 등의 *모든* 작업을 허용합니다. 대신 허용할 각 작업과 해당 사용자, 역할 또는 그룹에 필요한 작업만 명시적으로 지정하는 것이 좋습니다.

# DynamoDB 테이블의 항목에 대한 읽기 전용 권한을 부여하는 IAM 정책
<a name="read-only-permissions-on-table-items"></a>

다음 권한 정책은 `GetItem`, `BatchGetItem`, `Scan`, `Query` 및 `ConditionCheckItem` DynamoDB 작업에 대한 권한만 부여하며 결과적으로 `Books` 테이블에 대한 읽기 전용 액세스 권한을 설정합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ReadOnlyAPIActionsOnBooks",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:ConditionCheckItem"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        }
    ]
}
```

------

# 특정 DynamoDB 테이블과 관련 인덱스에 대한 액세스 권한을 부여하는 IAM 정책
<a name="iam-policy-specific-table-indexes"></a>

다음 정책은 `Books`라는 DynamoDB 테이블과 해당 테이블의 모든 인덱스에서 데이터 수정 작업에 대한 권한을 부여합니다. 인덱스 작동 방식에 대한 자세한 내용은 [DynamoDB에서 보조 인덱스를 사용하여 데이터 액세스 개선](SecondaryIndexes.md) 단원을 참조하세요.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessTableAllIndexesOnBooks",
            "Effect": "Allow",
            "Action": [
              "dynamodb:PutItem",
              "dynamodb:UpdateItem",
              "dynamodb:DeleteItem",
              "dynamodb:BatchWriteItem",
              "dynamodb:GetItem",
              "dynamodb:BatchGetItem",
              "dynamodb:Scan",
              "dynamodb:Query",
              "dynamodb:ConditionCheckItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
            ]
        }
    ]
}
```

------

# DynamoDB 테이블에서 읽기, 쓰기, 업데이트 및 삭제 액세스 권한에 대한 IAM 정책
<a name="iam-policy-example-data-crud"></a>

애플리케이션이 Amazon DynamoDB 테이블, 인덱스 및 스트림에서 데이터를 생성하고, 읽고, 업데이트하고, 삭제하도록 허용해야 하는 경우 이 정책을 사용합니다. AWS 리전 이름, 계정 ID, 계정 ID, 테이블 이름 또는 와일드카드 문자(\$1)는 적절하게 대체합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBIndexAndStreamAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetShardIterator",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:ListStreams"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/stream/*"
            ]
        },
        {
            "Sid": "DynamoDBTableAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:BatchGetItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:ConditionCheckItem",
                "dynamodb:PutItem",
                "dynamodb:DescribeTable",
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        },
        {
            "Sid": "DynamoDBDescribeLimitsAccess",
            "Effect": "Allow",
            "Action": "dynamodb:DescribeLimits",
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
            ]
        }
    ]
}
```

------

모든 AWS 리전에서 이 계정의 모든 DynamoDB 테이블을 포함하도록 이 정책을 확장하려면 리전 및 테이블 이름에 와일드카드(\$1)를 사용합니다. 예:

```
"Resource":[
                "arn:aws:dynamodb:*:123456789012:table/*",
                "arn:aws:dynamodb:*:123456789012:table/*/index/*"
                ]
```

# 동일한 AWS 계정의 다른 DynamoDB 환경에 대한 IAM 정책
<a name="iam-policy-separate-environments"></a>

별도의 환경이 있고 각 환경에서 `ProductCatalog`라는 테이블의 자체 버전을 유지한다고 가정해 보겠습니다. 동일한 AWS 계정에서 2개의 `ProductCatalog` 테이블을 생성하는 경우 권한이 설정되는 방식 때문에 한 환경에서의 작업이 다른 환경에 영향을 줄 수 있습니다. 예를 들어 동시 제어 영역 작업(예:`CreateTable`)의 수에 대한 할당량은 AWS 계정 수준에서 설정됩니다.

따라서 한 환경에서 작업을 수행할 때마다 다른 환경에서 사용 가능한 작업의 수가 감소합니다. 또한 한 환경의 코드가 다른 환경의 테이블에 실수로 액세스할 수 있는 위험도 있습니다.

**참고**  
프로덕션 및 테스트 워크로드를 분리하여 이벤트의 잠재적 ‘영향 범위’를 제어할 수 있으려면 테스트 및 프로덕션 워크로드에 대해 별도의 AWS 계정을 생성하는 것이 좋습니다. 자세한 내용은 [AWS 계정 관리 및 분리](https://docs.aws.amazon.com//wellarchitected/latest/security-pillar/aws-account-management-and-separation.html) 단원을 참조하세요.

또한 Amit과 Alice라는 두 개발자가 `ProductCatalog` 테이블을 테스트 중이라고 가정해 보겠습니다. 개발자가 각각 별도의 AWS 계정을 요구하는 대신 동일한 테스트 AWS 계정을 공유할 수 있습니다. 이 테스트 계정에서 `Alice_ProductCatalog` 및 `Amit_ProductCatalog`와 같이 각 개발자가 작업할 수 있는 동일한 테이블의 복제본을 만들 수 있습니다. 이 경우 테스트 환경용으로 생성한 AWS 계정에서 사용자 Alice 및 Amit을 만들 수 있습니다. 그런 다음 이들 사용자에게 각자가 소유하는 테이블에 대해 DynamoDB 작업을 수행할 수 있는 권한을 부여할 수 있습니다.

이러한 IAM 사용자 권한을 부여하려면 다음 중 하나를 수행할 수 있습니다.
+ 사용자마다 개별 정책을 만들고 각 정책을 사용자에게 개별적으로 연결합니다. 예를 들면, 다음 정책을 사용자 Alice에 연결하여 이 사용자가 `Alice_ProductCatalog` 테이블에서 모든 DynamoDB 작업에 액세스하도록 허용할 수 있습니다.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "AllAPIActionsOnAliceTable",
              "Effect": "Allow",
              "Action": [
                "dynamodb:DeleteItem",
                "dynamodb:DescribeContributorInsights",
                "dynamodb:RestoreTableToPointInTime",
                "dynamodb:ListTagsOfResource",
                "dynamodb:CreateTableReplica",
                "dynamodb:UpdateContributorInsights",
                "dynamodb:CreateBackup",
                "dynamodb:DeleteTable",
                "dynamodb:UpdateTableReplicaAutoScaling",
                "dynamodb:UpdateContinuousBackups",
                "dynamodb:TagResource",
                "dynamodb:DescribeTable",
                "dynamodb:GetItem",
                "dynamodb:DescribeContinuousBackups",
                "dynamodb:BatchGetItem",
                "dynamodb:UpdateTimeToLive",
                "dynamodb:BatchWriteItem",
                "dynamodb:ConditionCheckItem",
                "dynamodb:UntagResource",
                "dynamodb:PutItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteTableReplica",
                "dynamodb:DescribeTimeToLive",
                "dynamodb:RestoreTableFromBackup",
                "dynamodb:UpdateTable",
                "dynamodb:DescribeTableReplicaAutoScaling",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:DescribeLimits",
                "dynamodb:ListStreams"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Alice_ProductCatalog/*"
          }
      ]
  }
  ```

------

  그런 다음 사용자 Amit에 대해 다른 리소스(`Amit_ProductCatalog` 테이블)를 사용하여 유사한 정책을 만들 수 있습니다.
+ 정책을 개별 사용자에게 연결하는 대신, IAM 정책 변수를 사용하여 단일 정책을 작성하고 이 정책을 그룹에 연결할 수도 있습니다. 이 경우 그룹을 만들어야 하고, 여기서는 Alice와 Amit 두 사용자 모두 해당 그룹에 추가해야 합니다. 다음 예제에서는 `${aws:username}_ProductCatalog` 테이블에서 모든 DynamoDB 작업을 수행할 수 있는 권한을 부여합니다. 정책이 평가될 때 정책 변수 `${aws:username}`은 요청자의 사용자 이름으로 대체됩니다. 예를 들어 Alice가 항목을 추가하라는 요청을 보내는 경우 이 작업은 Alice가 항목을 `Alice_ProductCatalog` 테이블에 추가하는 경우에만 허용됩니다.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "ActionsOnUserSpecificTable",
              "Effect": "Allow",
              "Action": [
                "dynamodb:PutItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:ConditionCheckItem"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_ProductCatalog"
          },
          {
              "Sid": "AdditionalPrivileges",
              "Effect": "Allow",
              "Action": [
                  "dynamodb:ListTables",
                  "dynamodb:DescribeTable",
                  "dynamodb:DescribeContributorInsights"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/*"
          }
      ]
  }
  ```

------

**참고**  
IAM 정책 변수를 사용할 때는 정책에서 IAM 정책 언어의 `2012-10-17` 버전을 명시적으로 지정해야 합니다. IAM 정책 언어의 기본 버전(`2008-10-17`)은 정책 변수를 지원하지 않습니다.

평소대로 특정 테이블을 리소스로 식별하는 대신, 아래 예제와 같이 와일드카드 문자(\$1)를 사용하여 테이블 이름에 요청자의 사용자 이름이 접두사로 붙은 모든 테이블에 대한 권한을 부여할 수 있습니다.

```
"Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_*"
```

# DynamoDB 예약 용량 구매를 방지하는 IAM 정책
<a name="iam-prevent-purchase-reserved-capacity"></a>

Amazon DynamoDB 예약 용량을 구입할 경우 선납금을 1회 지불하고 일정 기간에 대해 최소 사용량 수준에 맞춰 약정 요금을 지불하므로 상당한 비용 절감을 얻을 수 있습니다. AWS Management Console을 사용하여 예약 용량을 확인하고 구매할 수 있습니다. 하지만 조직의 모든 사용자가 예약 용량을 구매할 수 있도록 하고 싶지 않을 수 있습니다. 예약 용량에 대한 자세한 내용은 [Amazon DynamoDB 요금](https://aws.amazon.com/dynamodb/pricing) 단원을 참조하세요.

DynamoDB는 예약 용량 관리에 대한 액세스 권한을 제어하기 위한 다음과 같은 API 작업을 제공합니다.
+ `dynamodb:DescribeReservedCapacity` - 현재 유효한 예약 용량 구매를 반환합니다.
+ `dynamodb:DescribeReservedCapacityOfferings` - 현재 에서 제공하는 예약 용량 계획에 대한 세부 정보를 반환합니다.AWS
+ `dynamodb:PurchaseReservedCapacityOfferings` - 실제 예약 용량 구매를 수행합니다.

AWS Management Console은 이러한 API 작업을 사용하여 예약 용량 정보를 표시하고 예약 용량을 구매합니다. 이러한 작업은 콘솔을 통해서만 액세스할 수 있으므로 애플리케이션 프로그램에서는 호출할 수 없습니다. 하지만 IAM 권한 정책에서 이들 작업에 대한 액세스를 허용 또는 거부할 수 있습니다.

다음 정책을 사용하면 사용자가 AWS Management Console을 사용하여 예약 용량 구매 및 제품을 조회할 수는 있지만, 새로운 구매는 거부됩니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowReservedCapacityDescriptions",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeReservedCapacity",
                "dynamodb:DescribeReservedCapacityOfferings"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        },
        {
            "Sid": "DenyReservedCapacityPurchases",
            "Effect": "Deny",
            "Action": "dynamodb:PurchaseReservedCapacityOfferings",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        }
    ]
}
```

------

이 정책에서는 와일드카드 문자(\$1)를 사용하여 모두에 대해 설명 권한을 허용하고, 모두에 대해 DynamoDB 예약 용량 구매를 거부합니다.

# DynamoDB 스트림에 대해서만 읽기 액세스 권한을 부여하는 IAM 정책(테이블은 부여하지 않음)
<a name="iam-policy-read-stream-only"></a>

테이블에서 DynamoDB Streams를 활성화하면 테이블 항목의 모든 수정에 대한 정보가 캡처됩니다. 자세한 내용은 [DynamoDB Streams에 대한 변경 데이터 캡처](Streams.md) 섹션을 참조하세요.

때로는 애플리케이션이 DynamoDB 테이블에서 데이터를 읽는 것은 금지하지만 테이블의 스트림에는 액세스하도록 허용하려는 경우도 있을 수 있습니다. 예를 들어, 항목 업데이트가 감지될 때 스트림을 폴링하고 Lambda 함수를 호출한 후 추가 처리를 수행하도록 AWS Lambda를 구성할 수 있습니다.

다음 작업은 DynamoDB Streams에 대한 액세스를 제어하는 데 사용할 수 있습니다.
+ `dynamodb:DescribeStream`
+ `dynamodb:GetRecords`
+ `dynamodb:GetShardIterator`
+ `dynamodb:ListStreams`

다음 예제 정책은 `GameScores`라는 테이블의 스트림에 액세스할 수 있는 권한을 사용자에게 부여합니다. ARN의 와일드카드 문자(\$1)는 해당 테이블과 연결된 모든 스트림과 일치합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessGameScoresStreamOnly",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:ListStreams"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*"
        }
    ]
}
```

------

이 정책에서는 `GameScores` 테이블 자체가 아니라 해당 테이블의 스트림에 액세스하도록 허용합니다.

# AWS Lambda 함수가 DynamoDB 스트림 레코드에 액세스하도록 허용하는 IAM 정책
<a name="iam-policy-example-lamda-process-dynamodb-streams"></a>

DynamoDB 스트림의 새 이벤트를 기반으로 특정 작업이 수행되기를 원할 경우 이러한 새 이벤트를 통해 트리거되는 AWS Lambda 함수를 작성할 수 있습니다. 이러한 Lambda 함수는 DynamoDB 스트림에서 데이터를 읽을 수 있는 권한을 필요로 합니다. DynamoDB Streams와 Lambda를 함께 사용하는 방법에 대한 자세한 내용은 [DynamoDB Streams 및 AWS Lambda 트리거](Streams.Lambda.md) 단원을 참조하세요.

Lambda에 권한을 부여하려면 Lambda 함수의 IAM 역할(실행 역할이라고도 함)과 연결되는 권한 정책을 사용합니다. 이 정책은 Lambda 함수를 생성할 때 지정합니다.

예를 들어, 다음의 권한 정책을 실행 역할과 연결하여 나열된 DynamoDB Streams 작업을 수행할 수 있는 권한을 Lambda에 부여할 수 있습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "APIAccessForDynamoDBStreams",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:ListStreams"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*"
        }
    ]
}
```

------

자세한 내용은 *AWS Lambda 개발자 안내서*의 [AWS Lambda 권한](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html) 단원을 참조하세요.

# DynamoDB Accelerator(DAX) 클러스터에 대한 읽기 및 쓰기 액세스 권한을 위한 IAM 정책
<a name="iam-policy-example-read-write-dax-access"></a>

다음 정책에서는 DynamoDB Accelerator(DAX)에 대한 읽기, 쓰기, 업데이트 및 삭제 액세스 권한을 허용하지만 연결된 DynamoDB 테이블에 대해서는 허용하지 않습니다. 이 정책을 사용하려면 AWS 리전 이름, 계정 ID, DAX 클러스터 이름을 대체합니다.

**참고**  
이 정책은 DAX 클러스터에 대한 액세스 권한은 부여하지만 연결된 DynamoDB 테이블에 대한 액세스 권한은 부여하지 않습니다. DAX 클러스터가 사용자를 대신해 DynamoDB 테이블에서 이와 같은 작업을 수행하려면 클러스터에 올바른 정책이 있어야 합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AmazonDynamoDBDAXDataOperations",
            "Effect": "Allow",
            "Action": [
                "dax:GetItem",
                "dax:PutItem",
                "dax:ConditionCheckItem",
                "dax:BatchGetItem",
                "dax:BatchWriteItem",
                "dax:DeleteItem",
                "dax:Query",
                "dax:UpdateItem",
                "dax:Scan"
            ],
            "Resource": "arn:aws:dax:eu-west-1:123456789012:cache/MyDAXCluster"
        }
    ]
}
```

------

계정의 모든 AWS 리전에 대한 DAX 액세스 권한을 포함하도록 이 정책을 확장하려면 리전 이름에 와일드카드 문자(\$1)를 사용합니다.

```
"Resource": "arn:aws:dax:*:123456789012:cache/MyDAXCluster"
```







# Amazon DynamoDB 자격 증명 및 액세스 문제 해결
<a name="security_iam_troubleshoot"></a>

다음 정보를 사용하여 DynamoDB 및 IAM에서 발생할 수 있는 공통적인 문제를 진단하고 수정할 수 있습니다.

**Topics**
+ [DynamoDB에서 작업을 수행할 권한이 없음](#security_iam_troubleshoot-no-permissions)
+ [iam:PassRole을 수행하도록 인증되지 않음](#security_iam_troubleshoot-passrole)
+ [내 AWS 계정 외부의 사람이 내 DynamoDB 리소스에 액세스할 수 있게 허용하고 싶음](#security_iam_troubleshoot-cross-account-access)

## DynamoDB에서 작업을 수행할 권한이 없음
<a name="security_iam_troubleshoot-no-permissions"></a>

AWS Management Console에서 작업을 수행할 권한이 없다는 메시지가 나타나는 경우 관리자에게 문의하여 도움을 받아야 합니다. 관리자는 사용자 이름과 암호를 제공한 사람입니다.

다음 예제 오류는 `mateojackson` 사용자가 콘솔을 사용하여 가상 `my-example-widget` 리소스에 대한 세부 정보를 보려고 하지만 가상 `aws:GetWidget` 권한이 없을 때 발생합니다.

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: aws:GetWidget on resource: my-example-widget
```

이 경우 Mateo는 `my-example-widget` 작업을 사용하여 `aws:GetWidget` 리소스에 액세스하도록 허용하는 정책을 업데이트하라고 관리자에게 요청합니다.

## iam:PassRole을 수행하도록 인증되지 않음
<a name="security_iam_troubleshoot-passrole"></a>

`iam:PassRole` 작업을 수행할 수 있는 권한이 없다는 오류가 수신되면 DynamoDB에 역할을 전달할 수 있도록 정책을 업데이트해야 합니다.

일부 AWS 서비스에서는 새로운 서비스 역할 또는 서비스 연결 역할을 생성하는 대신 해당 서비스에 기존 역할을 전달할 수 있습니다. 이렇게 하려면 사용자가 서비스에 역할을 전달할 수 있는 권한을 가지고 있어야 합니다.

다음 예시 오류는 `marymajor`라는 IAM 사용자가 콘솔을 사용하여 DynamoDB에서 작업을 수행하려고 하는 경우에 발생합니다. 하지만 작업을 수행하려면 서비스 역할이 부여한 권한이 서비스에 있어야 합니다. Mary는 서비스에 역할을 전달할 수 있는 권한을 가지고 있지 않습니다.

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

이 경우, Mary가 `iam:PassRole`작업을 수행할 수 있도록 Mary의 정책을 업데이트해야 합니다.

도움이 필요한 경우 AWS 관리자에게 문의하세요. 관리자는 로그인 자격 증명을 제공한 사람입니다.

## 내 AWS 계정 외부의 사람이 내 DynamoDB 리소스에 액세스할 수 있게 허용하고 싶음
<a name="security_iam_troubleshoot-cross-account-access"></a>

다른 계정의 사용자 또는 조직 외부의 사람이 리소스에 액세스할 때 사용할 수 있는 역할을 생성할 수 있습니다. 역할을 수임할 신뢰할 수 있는 사람을 지정할 수 있습니다. 리소스 기반 정책 또는 액세스 제어 목록(ACL)을 지원하는 서비스의 경우, 이러한 정책을 사용하여 다른 사람에게 리소스에 대한 액세스 권한을 부여할 수 있습니다.

자세한 내용은 다음을 참조하세요.
+ DynamoDB에서 이러한 기능을 지원하는지 여부를 알아보려면 [Amazon DynamoDB에서 IAM을 사용하는 방법](security_iam_service-with-iam.md) 섹션을 참조하세요.
+ 소유하고 있는 AWS 계정의 리소스에 대한 액세스 권한을 제공하는 방법을 알아보려면 *IAM 사용 설명서*의 [자신이 소유한 다른 AWS 계정의 IAM 사용자에 대한 액세스 권한 제공](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)을 참조하세요.
+ 리소스에 대한 액세스 권한을 서드 파티 AWS 계정에게 제공하는 방법을 알아보려면 *IAM 사용 설명서*의 [서드 파티가 소유한 AWS 계정에 대한 액세스 제공](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)을 참조하세요.
+ ID 페더레이션을 통해 액세스 권한을 제공하는 방법을 알아보려면 *IAM 사용 설명서*의 [외부에서 인증된 사용자에게 액세스 권한 제공(ID 페더레이션)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)을 참조하세요.
+ 크로스 계정 액세스에 대한 역할과 리소스 기반 정책 사용의 차이점을 알아보려면 **IAM 사용 설명서의 [IAM의 크로스 계정 리소스 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)를 참조하세요.

# DynamoDB 예약 용량 구매를 방지하는 IAM 정책
<a name="iam-policy-prevent-purchase-reserved-capacity"></a>

Amazon DynamoDB 예약 용량을 구입할 경우 선납금을 1회 지불하고 일정 기간에 대해 최소 사용량 수준에 맞춰 약정 요금을 지불하므로 상당한 비용 절감을 얻을 수 있습니다. AWS Management Console을 사용하여 예약 용량을 확인하고 구매할 수 있습니다. 하지만 조직의 모든 사용자가 예약 용량을 구매할 수 있도록 하고 싶지 않을 수 있습니다. 예약 용량에 대한 자세한 내용은 [Amazon DynamoDB 요금](https://aws.amazon.com/dynamodb/pricing) 단원을 참조하세요.

DynamoDB는 예약 용량 관리에 대한 액세스 권한을 제어하기 위한 다음과 같은 API 작업을 제공합니다.
+ `dynamodb:DescribeReservedCapacity` - 현재 유효한 예약 용량 구매를 반환합니다.
+ `dynamodb:DescribeReservedCapacityOfferings` - 현재 에서 제공하는 예약 용량 계획에 대한 세부 정보를 반환합니다.AWS
+ `dynamodb:PurchaseReservedCapacityOfferings` - 실제 예약 용량 구매를 수행합니다.

AWS Management Console은 이러한 API 작업을 사용하여 예약 용량 정보를 표시하고 예약 용량을 구매합니다. 이러한 작업은 콘솔을 통해서만 액세스할 수 있으므로 애플리케이션 프로그램에서는 호출할 수 없습니다. 하지만 IAM 권한 정책에서 이들 작업에 대한 액세스를 허용 또는 거부할 수 있습니다.

다음 정책을 사용하면 사용자가 AWS Management Console을 사용하여 예약 용량 구매 및 제품을 조회할 수는 있지만, 새로운 구매는 거부됩니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowReservedCapacityDescriptions",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeReservedCapacity",
                "dynamodb:DescribeReservedCapacityOfferings"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        },
        {
            "Sid": "DenyReservedCapacityPurchases",
            "Effect": "Deny",
            "Action": "dynamodb:PurchaseReservedCapacityOfferings",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        }
    ]
}
```

------

이 정책에서는 와일드카드 문자(\$1)를 사용하여 모두에 대해 설명 권한을 허용하고, 모두에 대해 DynamoDB 예약 용량 구매를 거부합니다.

# IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현
<a name="specifying-conditions"></a>

DynamoDB에서 권한을 부여할 때 권한 정책이 적용되는 방식을 결정하는 조건을 지정할 수 있습니다.

## 개요
<a name="FGAC_DDB.Overview"></a>

DynamoDB에서는 IAM 정책을 사용하여 권한을 부여할 때 조건을 지정하는 옵션이 있습니다([Amazon DynamoDB의 Identity and Access Management](security-iam.md) 참조). 예를 들어, 다음을 수행할 수 있습니다.
+ 사용자에게 테이블 또는 보조 인덱스의 특정 항목 및 속성에 대한 읽기 전용 액세스를 허용하는 권한을 부여할 수 있습니다.
+ 사용자 ID를 기준으로 테이블의 특정 속성에 대한 쓰기 전용 액세스 권한을 해당 사용자에게 부여할 수 있습니다.

다음 단원의 사용 사례에서 설명되어 있듯이 DynamoDB에서는 조건 키를 사용하여 IAM 정책에서 조건을 지정할 수 있습니다.

### 권한 사용 사례
<a name="FGAC_DDB.OverviewUseCase"></a>

DynamoDB API 작업에 대한 액세스를 제어할 수 있을 뿐만 아니라, 개별 데이터 항목과 속성에 대한 액세스도 제어할 수 있습니다. 예를 들면, 다음을 수행할 수 있습니다.
+ 테이블에 대한 권한을 부여하되, 특정 기본 키 값을 기반으로 해당 테이블에서 특정 항목에 대한 액세스를 제한할 수 있습니다. 다음 그림과 같이, 모든 사용자가 저장한 게임 데이터가 단일 테이블에 저장되지만 어떤 사용자도 자신이 소유하지 않은 데이터 항목에 액세스할 수 없는 소셜 네트워크 게임 앱이 그 예입니다.  
![\[사용자에게 테이블 수준 액세스 권한을 부여하지만, 특정 데이터 항목에 대한 액세스는 제한하는 사용 사례입니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/info-hiding-horizontal.png)
+ 속성의 하위 집합만 사용자에게 표시되도록 정보를 숨길 수 있습니다. 사용자 위치에 따라 인근 공항의 항공편 데이터를 표시하는 앱이 그 예입니다. 항공사 이름, 도착 및 출발 시간, 항공편 번호가 모두 표시됩니다. 하지만 다음 그림과 같이, 기장 이름과 승객 수와 같은 속성은 숨겨집니다.  
![\[사용자에게 데이터의 하위 집합만 표시하고 데이터의 특정 속성을 숨기는 사용 사례입니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/info-hiding-vertical.png)

이러한 종류의 세분화된 액세스 제어를 구현하려면 보안 자격 증명에 액세스하기 위한 조건과 관련 권한을 지정하는 IAM 권한 정책을 작성합니다. 그런 다음 IAM 콘솔을 사용하여 만드는 사용자, 그룹 또는 역할에 이 정책을 적용할 수 있습니다. IAM 정책은 테이블의 개별 항목에 대한 액세스 또는 이러한 항목의 속성에 대한 액세스를 제한하거나 이러한 두 가지 액세스를 동시에 제한할 수 있습니다.

또는 웹 자격 증명 연동을 사용하여 Login with Amazon, Facebook 또는 Google에서 인증된 사용자의 액세스를 제어할 수도 있습니다. 자세한 내용은 [웹 아이덴티티 페더레이션 사용](WIF.md) 섹션을 참조하세요.

IAM `Condition` 요소를 사용하여 세분화된 액세스 제어 정책을 구현합니다. `Condition` 요소를 권한 정책에 추가하여 특정 비즈니스 요구 사항에 따라 DynamoDB 테이블 및 인덱스의 항목 및 속성에 대한 액세스를 허용하거나 거부할 수 있습니다.

아래 동영상에서는 IAM 정책 조건을 사용하는 DynamoDB의 세분화된 액세스 제어를 설명합니다.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/LbEmo_yulb0?si=VTSlNHVocAEYwhJi/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/LbEmo_yulb0?si=VTSlNHVocAEYwhJi)


## DynamoDB의 세분화된 액세스 제어 이해
<a name="FGAC_DDB.UnderstandingFineGrainedAccess"></a>

DynamoDB의 세분화된 액세스 제어를 통해 여러 수준에서 정확한 권한 경계를 생성할 수 있습니다.

1. **항목 수준 액세스 제어:** 일반적으로 자격 증명 또는 권한 범위와 일치하는 특정 키 값이 포함된 항목에만 액세스하도록 사용자를 제한합니다.

1. **속성 수준 액세스 제어:** 사용자가 보거나 수정할 수 있는 속성(열)을 제한하여 동일한 항목 내에서 민감하지 않은 데이터에 대한 액세스를 허용하면서 민감한 정보를 보호할 수 있습니다.

1. **작업별 제어:** 수행 중인 작업 유형에 따라 다른 권한 규칙을 적용합니다.

이러한 제어는 DynamoDB별 조건 키를 사용하는 IAM 정책을 통해 구현됩니다.

## 조건 지정: 조건 키 사용
<a name="FGAC_DDB.ConditionKeys"></a>

AWS는 액세스 제어를 위해 IAM을 지원하는 모든 AWS 서비스에 대해 사전 정의된 조건 키(AWS 차원의 조건 키) 집합을 제공합니다. 예를 들어 `aws:SourceIp` 조건 키를 사용하여 요청자의 IP 주소를 확인한 후 작업을 수행하도록 허용할 수 있습니다. AWS 차원 키의 전체 목록은 IAM 사용 설명서의 [사용 가능한 조건 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#AvailableKeys)를 참조하세요.

다음은 DynamoDB에 적용되는 DynamoDB 서비스별 조건 키를 보여 줍니다.

**`dynamodb:LeadingKeys`**  
테이블의 첫 번째 키 속성, 즉 파티션 키를 나타냅니다. 키 이름 `LeadingKeys`는 단일 항목 작업에 사용되는 경우에도 복수형입니다. 또한 조건에서 `ForAllValues`를 사용할 때 `LeadingKeys` 변경자를 사용해야 합니다.

**`dynamodb:Select`**  
요청의 `Select` 파라미터를 나타냅니다. `Select`는 다음 값 중 하나일 수 있습니다.  
+ `ALL_ATTRIBUTES`
+ `ALL_PROJECTED_ATTRIBUTES`
+ `SPECIFIC_ATTRIBUTES`
+ `COUNT`
쿼리 및 스캔 작업과 자주 연관되지만 이 조건 키는 항목 속성을 반환하는 모든 DynamoDB 작업에 적용되며, 모든 API 작업에서 속성 액세스를 제어하는 데 필수적입니다. 이 조건 키에 StringEqualsIfExists 또는 유사한 제약 조건을 사용하면 이 조건 키가 적용되는 작업에 제약 조건이 적용되는 반면, 적용되지 않는 작업에는 제약 조건이 적용됩니다.

**`dynamodb:Attributes`**  
요청에서 액세스하는 *최상위* 속성 목록을 나타냅니다. 최상위 속성은 해당 속성 또는 해당 속성에 포함된 중첩 속성이 요청 파라미터에 지정된 경우 요청에 의해 액세스됩니다. 예를 들어 `"Name, Address.City"`의 `ProjectionExpression`을 지정하는 `GetItem` 요청의 `dynamodb:Attributes` 목록에는 ‘이름’과 ‘주소’가 포함됩니다. `Attributes` 파라미터가 세분화된 액세스 제어 정책에 열거되어 있는 경우 `GetItem`, `Query`, `Scan`과 같은 여러 API 작업에서 지정된 속성에 대한 액세스를 제한하기 위해 `ReturnValues` 및 `Select` 파라미터도 제한하는 것이 좋습니다.  
이 조건은 요청에 지정된 속성(예: ProjectionExpression)에서만 평가되며 응답의 속성에서는 평가되지 않습니다. 요청에 ProjectionExpression이 제공되지 않은 경우 정책의 속성 제한에 관계없이 모든 속성이 반환됩니다. 속성 액세스를 올바르게 보호하는 방법에 대한 자세한 내용은 아래 "속성 기반 제한이 적용되도록 보장" 섹션을 참조하세요.

**`dynamodb:ReturnValues`**  
요청의 `ReturnValues` 파라미터를 나타냅니다. API 작업에 따라 `ReturnValues`는 다음 값 중 하나일 수 있습니다.  
+ `ALL_OLD`
+ `UPDATED_OLD`
+ `ALL_NEW`
+ `UPDATED_NEW`
+ `NONE`

**`dynamodb:ReturnConsumedCapacity`**  
요청의 `ReturnConsumedCapacity` 파라미터를 나타냅니다. `ReturnConsumedCapacity`는 다음 값 중 하나일 수 있습니다.  
+ `TOTAL`
+ `NONE`

**`dynamodb:FirstPartitionKeyValues`**  
테이블의 첫 번째 키 속성, 즉 첫 번째 파티션 키를 나타냅니다. 키 이름 `FirstPartitionKeyValues`는 단일 항목 작업에 사용되는 경우에도 복수형입니다. 또한 조건에서 `FirstPartitionKeyValues`를 사용할 때 `ForAllValues` 변경자를 사용해야 합니다. `FirstPartitionKeyValues` 및 `LeadingKeys`는 상호 교환하여 사용할 수 있습니다.

**`dynamodb:SecondPartitionKeyValues`**  
`dynamodb:FirstPartitionKeyValues`와 유사합니다. 리소스의 두 번째 파티션 키를 나타냅니다. 키 이름 `SecondPartitionKeyValues`는 단일 항목 작업에 사용되는 경우에도 복수형입니다.

**`dynamodb:ThirdPartitionKeyValues`**  
`dynamodb:FirstPartitionKeyValues`와 유사합니다. 리소스의 세 번째 파티션 키를 나타냅니다. 키 이름 `ThirdPartitionKeyValues`는 단일 항목 작업에 사용되는 경우에도 복수형입니다.

**`dynamodb:FourthPartitionKeyValues`**  
`dynamodb:FirstPartitionKeyValues`와 유사합니다. 리소스의 네 번째 파티션 키를 나타냅니다. 키 이름 `FourthPartitionKeyValues`는 단일 항목 작업에 사용되는 경우에도 복수형입니다.

### 속성 기반 제한이 적용되도록 보장
<a name="FGAC_DDB.EnsuringAttributeRestrictions"></a>

속성 기반 조건을 사용하여 특정 속성에 대한 액세스를 제한할 때는 이러한 조건을 평가하는 방법을 이해하는 것이 중요합니다.
+ **속성 조건은 요청에 지정된 속성에서만 평가되며**, 응답의 속성에서 평가되지 않습니다.
+ **ProjectionExpression(GetItem, Query, Scan 등)이 없는 읽기 작업의 경우** 정책의 속성 제한과 관계없이 모든 속성이 반환됩니다. 민감한 데이터의 이러한 잠재적 노출을 방지하려면 속성 조건(`dynamodb:Attributes`)과 특정 속성이 필요한 조건(`dynamodb:Select`)을 모두 구현해야 합니다.
+ **쓰기 작업**(PutItem, UpdateItem, DeleteItem)의 경우 ReturnValues 파라미터는 전체 항목을 반환하여 쓰기 작업 자체가 정책을 준수하더라도 제한된 속성을 노출할 수 있습니다. 이러한 노출을 방지하려면 정책에서 ReturnValues(`dynamodb:ReturnValues`)에 대한 속성 조건(`dynamodb:Attributes`)과 제한 사항을 모두 구현합니다.

### 사용자 액세스 제한
<a name="FGAC_DDB.LimitingAccess"></a>

여러 IAM 권한 정책을 사용하면 사용자가 테이블에서 해시 키 값이 사용자 식별자와 일치하는 항목만 액세스할 수 있습니다. 예를 들어 앞서 다룬 게임 앱은 이러한 방식으로 액세스를 제한하므로 사용자가 자신의 사용자 ID와 연결된 게임 데이터에만 액세스할 수 있습니다. IAM 치환 변수인 `${www.amazon.com:user_id}`, `${graph.facebook.com:id}` 및 `${accounts.google.com:sub}`에는 Login with Amazon, Facebook 및 Google용 사용자 식별자가 포함되어 있습니다. 애플리케이션이 이러한 ID 공급자 중 하나에 로그인하는 방식에 대해 알아보려면 [웹 아이덴티티 페더레이션 사용](WIF.md) 단원을 참조하세요.

**중요**  
글로벌 테이블 복제를 제한하는 데는 세분화된 액세스 제어가 지원되지 않습니다. 글로벌 테이블 복제에 사용되는 DynamoDB [서비스 위탁자 또는 서비스 연결 역할](globaltables-security.md)에 세분화된 액세스 제어를 위한 정책 조건을 적용하면 글로벌 테이블 내에서 복제가 중단될 수 있습니다.

**참고**  
다음 단원의 각 예제에서는 `Effect` 절을 `Allow`로 설정하고 허용할 작업, 리소스 및 파라미터만 지정합니다. 액세스는 IAM 정책에 명시적으로 나열된 항목에만 허용됩니다.  
경우에 따라, `Effect` 절을 `Deny`로 설정하고 정책의 모든 논리를 반전시켜 거부 기반 정책이 되도록 이러한 정책을 다시 작성할 수도 있습니다. 하지만 허용 기반 정책에 비해 올바르게 작성하기가 어려우므로 DynamoDB에서는 거부 기반 정책을 사용하지 않는 것이 좋습니다. 또한, DynamoDB API에 대한 향후 변경(또는 기존 API 입력에 대한 변경)으로 인해 거부 기반 정책이 무효화될 수도 있습니다.

### 정책 예: 조건을 사용하여 세부적인 액세스 제어 구현
<a name="FGAC_DDB.Examples"></a>

이 단원에서는 DynamoDB 테이블 및 인덱스에 대한 세분화된 액세스 제어를 구현하기 위한 몇 가지 정책을 보여 줍니다.

**참고**  
모든 예는 us-west-2 리전을 사용하며 가상의 계정 ID를 포함합니다.

#### 예 1. 속성 제한이 있는 기본 파티션 키 기반 액세스 제어
<a name="FGAC_DDB.Examples.BasicPartitionKeyAccess"></a>

플레이어가 다양한 게임을 선택하고 플레이할 수 있는 모바일 게임 앱을 예로 들어 보겠습니다. 이 앱은 이름이 `GameScores`인 DynamoDB 테이블을 사용하여 높은 점수와 기타 사용자 데이터를 추적합니다. 테이블의 각 항목은 사용자 ID와 사용자가 플레이한 게임의 이름에 따라 고유하게 식별됩니다. `GameScores` 테이블은 파티션 키(`UserId`)와 정렬 키(`GameTitle`)로 구성된 기본 키를 갖습니다. 사용자는 자신의 사용자 ID와 연결된 게임 데이터에만 액세스할 수 있습니다. 게임을 플레이하려는 사용자는 보안 정책이 연결된 `GameRole`이라는 IAM 역할에 속해야 합니다.

이 앱에서 사용자 권한을 관리하기 위해 다음과 같은 권한 정책을 작성할 수 있습니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

`GameScores` 테이블(`Resource` 요소)에서의 특정 DynamoDB 작업(`Action` 요소)에 대한 권한을 부여하는 이외에, `Condition` 요소는 다음의 DynamoDB 고유 조건 키를 사용하여 다음과 같이 권한을 제한합니다.
+ `dynamodb:LeadingKeys` - 이 조건 키는 사용자가 파티션 키 값이 자신의 사용자 ID와 일치하는 항목만 액세스하도록 허용합니다. 이 ID(`${www.amazon.com:user_id}`)는 치환 변수입니다. 치환 변수에 대한 자세한 내용은 [웹 아이덴티티 페더레이션 사용](WIF.md) 단원을 참조하세요.
+ `dynamodb:Attributes` - 이 조건 키는 권한 정책에 나열된 작업만 지정된 속성 값을 반환할 수 있도록 이러한 속성에 대한 액세스를 제한합니다. 또한 `StringEqualsIfExists` 절을 사용하면 앱에서 작업이 적용될 특정 속성 목록만 제공되고 모든 속성을 요청할 수는 없습니다.

IAM 정책을 평가하면 결과가 항상 true(액세스 허용됨)이거나 false(액세스 거부됨)입니다. `Condition` 요소 중 한 부분이라도 false이면 전체 정책이 false로 평가되어 액세스가 거부됩니다.

**중요**  
`dynamodb:Attributes`를 사용하는 경우 해당 정책에 나열된 테이블 및 보조 인덱스에 대한 모든 기본 키 및 인덱스 속성의 이름을 지정해야 합니다. 그렇지 않으면, DynamoDB에서 이러한 키 속성을 사용하여 요청된 작업을 수행할 수 없습니다.

IAM 정책 설명서에는 수평 탭(U\$10009), 라인 피드(U\$1000A), 캐리지 리턴(U\$1000D), 그리고 U\$10020 \$1 U\$100FF 범위의 문자 등 유니코드 문자만 넣을 수 있습니다.

#### 예제 2: 특정 파티션 키 값이 있는 항목에 대한 액세스를 제한하는 권한을 부여
<a name="FGAC_DDB.Examples.PartitionKeyValue"></a>

다음 권한 정책은 `GamesScore` 테이블에서 DynamoDB 작업의 집합을 허용하는 권한을 부여합니다. 이 정책은 `dynamodb:LeadingKeys` 조건 키를 사용하여 사용자 작업을 `UserID` 파티션 키 값이 이 앱의 Login with Amazon 고유 사용자 ID와 일치하는 항목으로만 제한합니다.

**중요**  
작업 목록에는 `Scan` 권한이 포함되지 않는데, `Scan`이 주요 키와 상관없이 모든 항목을 반환하기 때문입니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"FullAccessToUserItems",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ]
            }
         }
      }
   ]
}
```

------

**참고**  
정책 변수를 사용하는 경우 정책에 명시적으로 버전 2012-10-17을 지정해야 합니다. 액세스 정책 언어의 기본 버전인 2008-10-17은 정책 변수를 지원하지 않습니다.

읽기 전용 액세스를 구현하려면 데이터를 수정할 수 있는 작업을 제거할 수 있습니다. 다음 정책에서는 읽기 전용 액세스를 제공하는 작업만 조건에 포함됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"ReadOnlyAccessToUserItems",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ]
            }
         }
      }
   ]
}
```

------

**중요**  
`dynamodb:Attributes`를 사용하는 경우 정책에 나열된 테이블 및 보조 인덱스에 대한 모든 기본 키 및 인덱스 키 속성의 이름을 지정해야 합니다. 그렇지 않으면, DynamoDB에서 이러한 키 속성을 사용하여 요청된 작업을 수행할 수 없습니다.

#### 예제 3: 테이블의 특정 속성에 대한 액세스를 제한하는 권한을 부여
<a name="FGAC_DDB.Examples.SpecificAttributes"></a>

다음 권한 정책은 `dynamodb:Attributes` 조건 키를 추가하여 테이블에서 2개의 속성에만 액세스를 허용합니다. 이러한 속성은 조건부 쓰기 또는 스캔 필터에서 읽거나 쓰거나 평가할 수 있습니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"LimitAccessToSpecificAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem",
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:BatchGetItem",
            "dynamodb:Scan"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:Attributes":[
                  "UserId",
                  "TopScore"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

**참고**  
이 정책은 이름이 지정된 속성 집합에 대한 액세스를 허용하는 허용 목록 방식을 사용합니다. 또는 이에 상응하는 정책으로 다른 속성에 대한 액세스를 거부하는 정책을 작성할 수 있습니다. 이러한 거부 목록 방식은 사용하지 않는 것이 좋습니다. Wikipedia(http://en.wikipedia.org/wiki/Principle\$1of\$1least\$1privilege)에 설명된 대로 사용자가 최소 권한 원칙에 따라 이러한 거부되는 속성의 이름을 결정하고 허용 목록 방식을 사용하여 거부되는 속성을 지정하는 대신 허용되는 값을 모두 열거할 수 있습니다.

이 정책에서는 `PutItem`, `DeleteItem` 또는 `BatchWriteItem`을 허용하지 않습니다. 이들 작업은 항상 이전 항목 전체를 대체함으로써 사용자가 액세스할 수 없는 속성의 이전 값을 삭제할 수 있게 허용합니다.

이 권한 정책의 `StringEqualsIfExists` 절은 다음을 보장합니다.
+ 사용자가 `Select` 파라미터를 지정하는 경우 해당 값은 `SPECIFIC_ATTRIBUTES`이어야 합니다. 이렇게 하면 API 작업이 인덱스 프로젝션 등의 방법으로 허용되지 않는 속성을 반환할 수 없게 됩니다.
+ 사용자가 `ReturnValues` 파라미터를 지정하는 경우 해당 값은 `NONE`, `UPDATED_OLD` 또는 `UPDATED_NEW`이어야 합니다. 이는 `UpdateItem` 작업이 항목을 바꾸기 전에 항목이 존재하는지 여부를 확인하기 위해, 또한 요청한 경우 이전 속성 값을 반환할 수 있도록 암시적인 읽기 작업도 수행하기 때문에 필요합니다. 이 방식으로 `ReturnValues`를 제한하면 사용자가 허용된 속성만 읽거나 쓸 수 있습니다.
+ `StringEqualsIfExists` 절은 허용되는 작업의 컨텍스트에서 요청당 이러한 파라미터 중 하나만(`Select` 또는 `ReturnValues`) 사용할 수 있도록 합니다.

다음은 이 정책에 대한 몇 가지 변형 형태입니다.
+ 읽기 작업만 허용하려면 허용된 작업 목록에서 `UpdateItem`을 제거하면 됩니다. 나머지 작업 중 어떤 것도 `ReturnValues`를 허용하지 않으므로 조건에서 `ReturnValues`를 제거할 수 있습니다. 또한 `StringEqualsIfExists` 파라미터에는 항상 값(별도로 지정하지 않는 경우 `StringEquals`)이 있으므로 `Select`를 `ALL_ATTRIBUTES`로 변경할 수도 있습니다.
+ 쓰기 작업만 허용하려면 허용된 작업 목록에서 `UpdateItem`을 제외한 모든 작업을 제거하면 됩니다. `UpdateItem`에서는 `Select` 파라미터를 사용하지 않으므로 조건에서 `Select`를 제거할 수 있습니다. 또한 `StringEqualsIfExists` 파라미터에는 항상 값(별도로 지정하지 않는 경우 `StringEquals`)이 있으므로 `ReturnValues`를 `NONE`로 변경해야 합니다.
+ 이름이 패턴과 일치하는 모든 속성을 허용하려면 `StringLike` 대신에 `StringEquals`를 사용하고 다중 문자 패턴 와일드카드(\$1)를 사용합니다.

#### 예제 4: 특정 속성의 업데이트를 금지하는 권한을 부여
<a name="FGAC_DDB.Examples.PreventUpdates"></a>

다음 권한 정책은 사용자 액세스를 `dynamodb:Attributes` 조건 키로 식별되는 특정 속성만 업데이트하도록 제한합니다. `StringNotLike` 조건은 애플리케이션이 `dynamodb:Attributes` 조건 키를 사용하여 지정된 속성을 업데이트하는 것을 금지합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"PreventUpdatesOnCertainAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
         "Condition":{
            "ForAllValues:StringNotLike":{
               "dynamodb:Attributes":[
                  "FreeGamesAvailable",
                  "BossLevelUnlocked"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

다음을 참조하세요.
+ `UpdateItem` 작업은 다른 쓰기 작업과 마찬가지로 업데이트 전후의 값을 반환할 수 있도록 항목에 대한 읽기 액세스가 필요합니다. 이 정책에서는 `dynamodb:ReturnValues` 조건 키를 지정하여 작업이 업데이트를 허용할 속성에만 액세스하도록 제한합니다. 조건 키는 요청에서 `ReturnValues`를 제한하여 `NONE`, `UPDATED_OLD` 또는 `UPDATED_NEW`만 지정하며 `ALL_OLD` 또는 `ALL_NEW`를 포함하지 않습니다.
+ `StringEqualsIfExists` 연산자는 `dynamodb:Select` 또는 `dynamodb:ReturnValues`가 요청에 있는 경우 지정된 값과 일치해야 합니다. 이렇게 하면 작업에서 전체 항목을 반환할 수 없습니다.
+ 속성 업데이트를 제한할 때는 보호된 속성의 정보 공개를 방지하기 위해 반환할 수 있는 데이터도 제어해야 합니다.
+ `PutItem` 및 `DeleteItem` 작업은 전체 항목을 대체하므로 애플리케이션이 어떤 속성도 수정할 수 있습니다. 그러므로 애플리케이션을 특정 속성만 업데이트하도록 허용할 경우 이러한 API에 대한 권한을 부여하면 안 됩니다.

#### 예제 5: 인덱스에서 프로젝션 속성만 쿼리하는 권한을 부여
<a name="FGAC_DDB.Examples.QueryProjectedAttributes"></a>

다음 권한 정책은 `dynamodb:Attributes` 조건 키를 사용하여 보조 인덱스(`TopScoreDateTimeIndex`)에 대한 쿼리를 허용합니다. 또한 이 정책은 인덱스로 프로젝션된 특정 속성만 요청하도록 쿼리를 제한합니다.

또한 이 정책은 애플리케이션이 쿼리에서 속성 목록을 지정하도록 하기 위해 `dynamodb:Select` 조건 키를 지정하여 DynamoDB `Query` 작업의 `Select` 파라미터가 `SPECIFIC_ATTRIBUTES`가 되도록 요구합니다. 속성의 목록은 `dynamodb:Attributes` 조건 키를 사용하여 제공되는 특정 목록으로 제한됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"QueryOnlyProjectedIndexAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:Attributes":[
                  "TopScoreDateTime",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "Attempts"
               ]
            },
            "StringEquals":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

다음 권한 정책은 비슷하지만 쿼리가 인덱스로 프로젝션된 모든 속성을 요청해야 합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"QueryAllIndexAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "StringEquals":{
               "dynamodb:Select":"ALL_PROJECTED_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

#### 예제 6: 액세스를 특정 속성 및 파티션 키 값으로 제한하는 권한을 부여
<a name="FGAC_DDB.Examples.AttributesAndKeyValues"></a>

다음 권한 정책은 테이블 및 테이블 인덱스(`Resource` 요소로 지정)에서 특정 DynamoDB 작업(`Action` 요소로 지정)을 허용합니다. 이 정책은 `dynamodb:LeadingKeys` 조건 키를 사용하여 파티션 키 값이 사용자의 Facebook ID와 일치하는 항목으로만 권한을 제한합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"LimitAccessToCertainAttributesAndKeyValues",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem",
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:BatchGetItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${graph.facebook.com:id}"
               ],
               "dynamodb:Attributes":[
                  "attribute-A",
                  "attribute-B"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

다음 사항에 유의하세요.
+ 정책(`UpdateItem`)에서 허용하는 쓰기 작업은 attribute-A 또는 attribute-B만 수정할 수 있습니다.
+ 이 정책은 `UpdateItem`을 허용하므로 애플리케이션이 새 항목을 삽입할 수 있으며 숨겨진 속성은 새 항목에서 null이 됩니다. 이러한 속성이 `TopScoreDateTimeIndex`로 프로젝션되면 이 정책은 쿼리로 인한 테이블에서의 가져오기를 방지하는 부가적인 이점도 얻게 됩니다.
+ 애플리케이션은 `dynamodb:Attributes`에 나열되지 않은 속성은 읽을 수 없습니다. 이 정책을 사용하면 애플리케이션은 읽기 요청에서 `Select` 파라미터를 `SPECIFIC_ATTRIBUTES`로 설정해야 하며, 허용 목록의 속성만 요청할 수 있습니다. 쓰기 요청의 경우, 애플리케이션은 `ReturnValues`를 `ALL_OLD` 또는 `ALL_NEW`로 설정할 수 없으며 다른 속성에 근거하여 조건부 쓰기 작업을 수행할 수 없습니다.

#### 예제 7: 테이블의 특정 속성에 대한 액세스를 제한하는 권한을 거부
<a name="FGAC_DDB.Examples.DenySpecificAttributes"></a>

다음 정책은 민감한 속성에 대한 액세스를 거부하고 프로젝션 표현식을 생략하여 이 제한을 우회할 수 없도록 합니다. `SSN` 및 `CreditCardNumber` 속성에 대한 액세스를 명시적으로 거부하면서 `CustomerData` 테이블에 대한 일반 액세스를 허용합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData"
      },
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData",
         "Condition":{
            "ForAnyValue:StringEquals":{
               "dynamodb:Attributes":[
                  "SSN",
                  "CreditCardNumber"
               ]
            }
         }
      },
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData",
         "Condition":{
            "StringNotEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

## 관련 주제
<a name="w2aac39c21c15c11"></a>
+  [Amazon DynamoDB의 Identity and Access Management](security-iam.md) 
+ [DynamoDB API 권한: 작업, 리소스 및 조건 참조](api-permissions-reference.md)

# 웹 아이덴티티 페더레이션 사용
<a name="WIF"></a>

대규모 사용자를 대상으로 하는 애플리케이션을 작성하려는 경우 필요에 따라 인증 및 권한 부여를 위해 *웹 자격 증명 연동* 기능을 사용할 수 있습니다. 웹 자격 증명 연동을 사용하면 개별 사용자를 생성할 필요가 없습니다. 그 대신에 사용자는 자격 증명 공급자에 로그인한 후 AWS Security Token Service(AWS STS)에서 임시 보안 자격 증명을 얻을 수 있습니다. 그러면 앱은 이러한 자격 증명을 사용하여 AWS 서비스에 액세스할 수 있습니다.

웹 자격 증명 연동은 다음 자격 증명 공급자를 지원합니다.
+ Login with Amazon
+ Facebook
+ Google

## 웹 ID 페더레이션 관련 추가 리소스
<a name="WIF.AdditionalResources"></a>

다음 리소스는 웹 ID 페더레이션에 대해 자세히 알아보는 데 도움이 됩니다.
+ AWS 개발자 블로그의 게시글 [AWS SDK for .NET을 사용한 웹 자격 증명 연동](https://aws.amazon.com/blogs/developer/web-identity-federation-using-the-aws-sdk-for-net)에서는 Facebook에서 웹 자격 증명 연동을 사용하는 방법을 안내합니다. 여기에는 웹 자격 증명으로 IAM 역할을 수임하는 방법과 임시 보안 자격 증명을 사용해 AWS 리소스에 액세스하는 방법을 보여주는 C\$1 코드 조각이 포함되어 있습니다.
+ [AWS Mobile SDK for iOS](https://aws.amazon.com/sdkforios/) 및 [AWS Mobile SDK for Android](https://aws.amazon.com/sdkforandroid/)에는 샘플 앱이 포함되어 있습니다. 이러한 앱에는 자격 증명 공급자를 호출하는 방법과 이러한 공급자의 정보를 사용하여 임시 보안 자격 증명을 가져오고 사용하는 방법을 보여 주는 코드가 포함되어 있습니다.
+ [모바일 애플리케이션을 사용한 웹 자격 증명 연동](https://aws.amazon.com/articles/4617974389850313) 항목에서는 웹 자격 증명 연동에 대해 설명하며, 웹 자격 증명 연동을 사용하여 AWS 리소스에 액세스하는 방법의 예를 보여 줍니다.

## 웹 아이덴티티 페더레이션에 대한 정책 예
<a name="WIF.Example"></a>

DynamoDB에서 웹 자격 증명 연동을 사용하는 방법을 보려면 [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md)에 소개된 *GameScores* 테이블을 다시 살펴보세요. 다음은 *GameScores*의 기본 키입니다.


****  

| 테이블 이름 | 기본 키 속성 | 파티션 키 이름 및 유형 | 정렬 키 이름 및 유형 | 
| --- | --- | --- | --- | 
| GameScores(UserId, GameTitle, ...) | 복합 | 속성 이름: UserId 유형: 문자열 | 속성 이름: GameTitle 유형: 문자열 | 

이번에는 모바일 게임 앱에서 이 테이블을 사용하며 해당 앱에서 수천 명 또는 수만 명의 사용자를 지원해야 한다고 가정해 보겠습니다. 이 규모에서는 개별 앱 사용자를 관리하고 각 사용자가 *GameScores* 테이블에서 자신의 고유 데이터에만 액세스할 수 있도록 하는 것이 매우 어렵습니다. 다행히 많은 사용자가 이미 Facebook, Google 또는 Login with Amazon 같은 타사 자격 증명 공급자의 계정을 이미 보유하고 있습니다. 따라서 인증 작업에 대해 이러한 공급자 중 하나를 활용할 수 있습니다.

웹 자격 증명 연동을 사용하여 이 작업을 수행하려면 앱 개발자가 자격 증명 공급자(예: Login with Amazon)에 앱을 등록하고 고유한 앱 ID를 받아야 합니다. 그러고 나면 개발자는 IAM 역할을 생성해야 합니다. (이 예에서 이 역할의 이름은 *GameRole*입니다.) 이 역할에는 앱이 *GameScores* 테이블에 액세스할 수 있는 조건을 지정하는 IAM 정책 문서가 연결되어 있어야 합니다.

게임을 플레이하려는 사용자는 해당 게임 앱에서 자신의 Login with Amazon 계정에 로그인해야 합니다. 그런 다음 앱은 Login with Amazon 앱 ID를 지정하고 *GameRole*의 멤버십을 요청하여 AWS Security Token Service(AWS STS)를 직접적으로 호출합니다. AWS STS는 임시 AWS 자격 증명을 앱에 반환하여 앱이 *GameRole* 정책 문서에 따라 *GameScores* 테이블에 액세스하도록 허용합니다.

다음 다이어그램은 이러한 각 단계가 어떻게 서로 연결되는지 보여 줍니다.

![\[게임 앱의 워크플로입니다. 앱은 Amazon ID 및 AWS STS를 사용하여 DynamoDB 테이블에 액세스하기 위한 임시 자격 증명을 얻습니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/wif-overview.png)


**웹 아이덴티티 페더레이션 개요**

1. 앱은 타사 자격 증명 공급자를 호출하여 사용자와 앱을 인증합니다. 자격 증명 공급자가 웹 자격 증명 토큰을 앱에 반환합니다.

1. 앱이 AWS STS를 호출하고 웹 자격 증명 토큰을 입력으로 전달합니다. AWS STS는 앱에 권한을 부여하고 임시 AWS 액세스 자격 증명을 제공합니다. 앱은 IAM 역할(*GameRole*)을 수임하고 역할의 보안 정책에 따라 AWS 리소스에 액세스할 수 있습니다.

1. 앱은 DynamoDB를 호출하여 *GameScores* 테이블에 액세스합니다. *GameRole*을 위임했으므로 앱은 해당 역할과 연결된 보안 정책을 준수해야 합니다. 정책 문서는 앱이 사용자와 관련이 없는 데이터에 액세스할 수 없도록 합니다.

다시 한번 다음은 [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md)에 나온 *GameRole*의 보안 정책입니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

`Condition` 절은 앱에 표시되는 *GameScores*의 항목을 결정합니다. 이 작업은 Login with Amazon ID를 `UserId`의 `GameScores` 파티션 키 값과 비교하여 수행됩니다. 이 정책에 나열된 DynamoDB 작업 중 하나를 통해서는 현재 사용자에게 속한 항목만 처리할 수 있습니다. 테이블의 다른 항목에는 액세스할 수 없습니다. 또한 정책에 나열된 특정 속성만 액세스할 수 있습니다.

# 웹 아이덴티티 페더레이션을 사용하기 위한 준비
<a name="WIF.PreparingForUse"></a>

애플리케이션 개발자이며 앱에 대해 웹 자격 증명 연동을 사용하려면 다음 단계를 따릅니다.

1. **타사 자격 증명 공급자에 개발자로 가입합니다.** 다음 외부 링크는 지원되는 자격 증명 공급 가입에 대한 정보를 제공합니다.
   + [Login with Amazon 개발자 센터](http://login.amazon.com/)
   + [Facebook 사이트의 Registration](https://business.facebook.com/business/loginpage)
   + [Google 사이트의 Using OAuth 2.0 to Access Google APIs](https://developers.google.com/accounts/docs/OAuth2)

1. **자신의 앱을 자격 증명 공급자에 등록합니다.** 이 작업을 수행하면 공급자가 앱에 고유한 ID를 제공합니다. 앱이 여러 자격 증명 공급자에서 작동하도록 하려면 각 공급자로부터 앱 ID를 얻어야 합니다.

1. **하나 이상의 IAM 역할을 생성합니다. ** 각 앱에서는 자격 증명 공급자마다 한 개의 역할이 필요합니다 예를 들면 사용자가 Login with Amazon을 사용하여 로그인한 앱에 의해 위임될 수 있는 역할, 사용자가 Facebook을 사용하여 로그인한 동일 앱에 대한 두 번째 역할, 그리고 사용자가 Google을 사용하여 로그인하는 앱에 대한 세 번째 역할을 생성할 수 있습니다.

   역할 생성 과정의 일부로 IAM 정책을 해당 역할에 연결해야 합니다. 정책 문서에 앱이 필요로 하는 DynamoDB 리소스와, 이러한 리소스에 액세스할 수 있는 권한을 정의해야 합니다.

자세한 내용은 *IAM 사용 설명서*의 [웹 자격 증명 연동 정보](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html) 단원을 참조하세요.

**참고**  
AWS Security Token Service 대신 Amazon Cognito를 사용할 수 있습니다. Amazon Cognito는 모바일 앱의 임시 자격 증명을 관리하는 기본 서비스입니다. 자세한 내용은 **Amazon Cognito 개발자 안내서의 [자격 증명 얻기](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-credentials.html)를 참조하세요.

## DynamoDB 콘솔을 사용하여 IAM 정책 생성
<a name="WIF.PreparingForUse.DDBConsole"></a>

DynamoDB 콘솔은 웹 자격 증명 연동에 사용할 IAM 정책을 생성하는 데 도움이 됩니다. 정책을 생성하려면 DynamoDB 테이블을 선택하고 정책에 포함할 자격 증명 공급자, 작업 및 속성을 지정해야 합니다. 그러면 DynamoDB 콘솔에서 IAM 역할에 연결할 수 있는 정책이 생성합니다.

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)에서 DynamoDB 콘솔을 엽니다.

1.  탐색 창에서 **테이블**을 선택합니다.

1.  테이블 목록에서 IAM 정책을 생성할 테이블을 선택합니다.

1.  **작업** 버튼을 클릭하고 **액세스 제어 정책 생성**을 선택합니다.

1.  정책에 대해 ID 공급자, 작업 및 속성을 선택합니다.

    원하는 대로 설정되었으면 **정책 생성**을 선택합니다. 생성된 정책이 표시됩니다.

1.  **설명서 참조**를 선택하고 생성된 정책을 IAM 역할에 연결하는 데 필요한 단계를 따릅니다.

# 웹 아이덴티티 페더레이션을 사용할 앱 작성
<a name="WIF.RunningYourApp"></a>

웹 자격 증명 연동을 사용하려면 사용자가 생성한 IAM 역할을 앱이 수임해야 합니다. 그 시점 이후로 앱은 사용자가 역할에 연결한 액세스 정책을 준수합니다.

런타임 시 앱에 웹 자격 증명 연동이 사용되는 경우 다음 단계를 따라야 합니다.

1. **타사 자격 증명 공급자를 사용하여 인증합니다.** 앱은 제공되는 인터페이스를 사용하여 자격 증명 공급자를 호출해야 합니다. 사용자를 인증하는 정확한 방법은 앱이 실행 중인 플랫폼과 공급자에 따라 달라집니다. 일반적으로 사용자가 아직 로그인하지 않은 경우 자격 증명 공급자가 해당 공급자의 로그인 페이지 표시를 처리합니다.

   자격 증명 공급자는 사용자를 인증한 후 웹 자격 증명 토큰을 앱에 반환합니다. 이 토큰의 형식은 공급자마다 다르지만, 일반적으로는 매우 긴 문자열 형식입니다.

1. **임시 AWS 보안 자격 증명을 얻습니다.** 이렇게 하려면 앱이 `AssumeRoleWithWebIdentity` 요청을 AWS Security Token Service(AWS STS)로 보냅니다. 이 요청은 다음을 포함합니다.
   + 이전 단계의 웹 자격 증명 토큰
   + 자격 증명 공급자에게서 받은 앱 ID
   + 이 앱의 자격 증명 공급자에 대해 생성한 IAM 역할의 Amazon 리소스 이름(ARN)

   AWS STS는 일정 시간(기본적으로 3600초)이 지나면 만료되는 AWS 보안 자격 증명 집합을 반환합니다.

   다음은 샘플 요청과 `AssumeRoleWithWebIdentity`의 AWS STS 작업에서 받은 응답입니다. 웹 자격 증명 토큰은 Login with Amazon 자격 증명 공급자로부터 얻었습니다.

   ```
   GET / HTTP/1.1
   Host: sts.amazonaws.com
   Content-Type: application/json; charset=utf-8
   URL: https://sts.amazonaws.com/?ProviderId=www.amazon.com
   &DurationSeconds=900&Action=AssumeRoleWithWebIdentity
   &Version=2011-06-15&RoleSessionName=web-identity-federation
   &RoleArn=arn:aws:iam::123456789012:role/GameRole
   &WebIdentityToken=Atza|IQEBLjAsAhQluyKqyBiYZ8-kclvGTYM81e...(remaining characters omitted)
   ```

   

   ```
   <AssumeRoleWithWebIdentityResponse
     xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
     <AssumeRoleWithWebIdentityResult>
       <SubjectFromWebIdentityToken>amzn1.account.AGJZDKHJKAUUSW6C44CHPEXAMPLE</SubjectFromWebIdentityToken>
       <Credentials>
         <SessionToken>AQoDYXdzEMf//////////wEa8AP6nNDwcSLnf+cHupC...(remaining characters omitted)</SessionToken>
         <SecretAccessKey>8Jhi60+EWUUbbUShTEsjTxqQtM8UKvsM6XAjdA==</SecretAccessKey>
         <Expiration>2013-10-01T22:14:35Z</Expiration>
         <AccessKeyId>06198791C436IEXAMPLE</AccessKeyId>
       </Credentials>
       <AssumedRoleUser>
         <Arn>arn:aws:sts::123456789012:assumed-role/GameRole/web-identity-federation</Arn>
         <AssumedRoleId>AROAJU4SA2VW5SZRF2YMG:web-identity-federation</AssumedRoleId>
       </AssumedRoleUser>
     </AssumeRoleWithWebIdentityResult>
     <ResponseMetadata>
       <RequestId>c265ac8e-2ae4-11e3-8775-6969323a932d</RequestId>
     </ResponseMetadata>
   </AssumeRoleWithWebIdentityResponse>
   ```

1. **AWS 소스에 액세스합니다.** AWS STS의 응답에는 앱이 DynamoDB 리소스에 액세스하는 데 필요한 정보가 포함되어 있습니다.
   + `AccessKeyID`, `SecretAccessKey` 및 `SessionToken` 필드에는 이 사용자와 이 앱에만 유효한 보안 자격 증명이 들어 있습니다.
   + `Expiration` 필드는 이러한 자격 증명이 유효 상태로 유지되는 제한 시간을 지정합니다.
   + `AssumedRoleId` 필드에는 앱에 의해 수임된 세션별 IAM 역할의 이름이 포함되어 있습니다. 앱은 이 세션 기간 동안 IAM 정책 문서의 액세스 제어를 준수합니다.
   + `SubjectFromWebIdentityToken` 필드에는 이 특정 자격 증명 공급자에 대한 IAM 정책 변수에 표시되는 고유 ID가 포함되어 있습니다. 다음은 지원되는 공급자에 대한 IAM 정책 변수이며, 몇 가지 예를 들면 다음과 같습니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/WIF.RunningYourApp.html)

이러한 정책 변수가 사용되는 IAM 정책의 예는 [정책 예: 조건을 사용하여 세부적인 액세스 제어 구현](specifying-conditions.md#FGAC_DDB.Examples) 단원을 참조하세요.

AWS STS가 임시 액세스 자격 증명을 생성하는 방법에 대한 자세한 내용은 *IAM 사용 설명서*의 [임시 보안 자격 증명 요청](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) 단원을 참조하세요.

# DynamoDB API 권한: 작업, 리소스 및 조건 참조
<a name="api-permissions-reference"></a>

[Amazon DynamoDB의 Identity and Access Management](security-iam.md)를 설정하고 IAM 자격 증명에 연결할 수 있는 권한 정책(자격 증명 기반 정책)을 작성할 때 *IAM 사용 설명서*에서 [Amazon DynamoDB에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html) 목록을 참조로 사용할 수 있습니다. 해당 페이지에는 각 DynamoDB API 작업, 작업을 수행할 권한을 부여할 수 있는 해당 작업, 권한을 부여할 수 있는 대상 AWS 리소스가 나열되어 있습니다. 정책의 `Action`필드에서 작업을 지정하고, 정책의 `Resource`필드에서 리소스 값을 지정합니다.

DynamoDB 정책에서 AWS 차원 조건 키를 사용하여 조건을 표현할 수 있습니다. AWS 차원 키의 전체 목록은 *IAM 사용 설명서*의 [IAM JSON 정책 요소 참조](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#AvailableKeys)를 참조하세요.

AWS 차원 조건 키 이외에도 DynamoDB에는 조건에 사용할 수 있는 고유한 특정 키가 있습니다. 자세한 내용은 [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md) 섹션을 참조하세요.

## 관련 주제
<a name="w2aac39c21c15c15b9"></a>
+  [Amazon DynamoDB의 Identity and Access Management](security-iam.md)
+ [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md)