

# DynamoDB 저장 데이터 암호화
<a name="EncryptionAtRest"></a>

Amazon DynamoDB에 저장된 모든 사용자 데이터는 저장 중 완전히 암호화됩니다. DynamoDB 저장 데이터 암호화는 [AWS Key Management Service(AWS KMS)](https://aws.amazon.com/kms/)에 저장된 암호화 키를 사용하여 모든 저장 중 데이터를 암호화하여 향상된 보안을 제공합니다. 이 기능을 사용하면 중요한 데이터 보호와 관련된 운영 부담 및 복잡성을 줄일 수 있습니다. 저장 시 암호화를 사용하면 엄격한 암호화 규정 준수 및 규제 요구 사항이 필요한, 보안에 민감한 애플리케이션을 구축할 수 있습니다.

DynamoDB 유휴 시 암호화는 내구성이 뛰어난 미디어에 데이가 저장될 때마다 프라이머리 키, 로컬 및 글로벌 보조 인덱스, 스트림, 전역 테이블, 백업, DynamoDB Accelerator(DAX) 클러스터 등을 비롯한 데이터를 항상 암호화된 테이블에서 보호하여 추가 데이터 보호 계층을 제공합니다. 조직의 정책, 업계나 정부 규범 및 규정 준수 요건에 따라 유휴 시 암호화를 사용하여 애플리케이션의 데이터 보안을 강화해야 할 수 있습니다. 데이터베이스 애플리케이션의 암호화에 대한 자세한 내용은 [AWS Database Encryption SDK](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/what-is-database-encryption-sdk.html)를 참조하세요.

유휴 시 암호화는 테이블을 암호화하는 데 사용되는 암호화 키를 관리하기 위해 AWS KMS와 통합됩니다. 키 유형 및 상태에 대한 자세한 내용은 **AWS Key Management Service 개발자 안내서의 [AWS Key Management Service 개념](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html#key-state-cmk-type)을 참조하세요.

새 테이블을 만들 때 다음 AWS KMS key 유형 중 하나를 선택하여 테이블을 암호화할 수 있습니다. 언제든지 이러한 키 유형 간에 전환할 수 있습니다.
+ **AWS 소유 키 –** 기본 암호화 유형. 키는 DynamoDB가 소유합니다(추가 비용 없음).
+ **AWS 관리형 키 –** 이 키는 사용자의 계정에 저장되고 AWS KMS에 의해 관리됩니다(AWS KMS 비용 적용).
+ **고객 관리형 키 -** 사용자의 계정에 키가 저장되며 사용자가 생성, 소유, 관리하는 유형입니다. 키에 대해 사용자가 모든 것을 제어합니다(AWS KMS 비용 적용).

키 유형에 대한 자세한 내용은 [고객 키 및 AWS 키](/kms/latest/developerguide/concepts.html#key-mgmt)를 참조하세요.

**참고**  
저장 중 데이터 암호화를 활성화하고 새 DAX 클러스터를 생성할 경우 AWS 관리형 키를 사용하여 클러스터에서 저장 중 데이터를 암호화합니다.
테이블에 정렬 키가 있는 경우 범위 경계를 표시하는 정렬 키 중 일부가 테이블 메타데이터에 일반 텍스트 형태로 저장됩니다.

암호화된 테이블에 액세스하면 DynamoDB가 테이블 데이터를 투명하게 해독합니다. 암호화된 테이블을 사용 또는 관리하기 위해 코드나 애플리케이션을 변경할 필요가 없습니다. DynamoDB는 사용자가 기대하는 한 자릿수 밀리초 지연 시간을 계속해서 제공하며 모든 DynamoDB 쿼리가 암호화된 데이터에 대해 원활하게 처리됩니다.

AWS Management Console, AWS Command Line Interface(AWS CLI) 또는 Amazon DynamoDB API를 사용하여 기존 테이블에서 새로운 테이블을 생성하거나 암호화 키를 전환할 때 암호화 키를 지정할 수 있습니다. 자세한 방법은 [DynamoDB의 암호화된 테이블 관리](encryption.tutorial.md) 단원을 참조하세요.

AWS 소유 키를 사용한 저장 데이터 암호화는 추가 비용 없이 제공됩니다. 그러나 AWS 관리형 키 및 고객 관리형 키에 대해서는 AWS KMS 비용이 부과됩니다. 요금에 대한 자세한 내용은 [AWS KMS 요금](https://aws.amazon.com/kms/pricing)을 참조하세요.

DynamoDB 저정 데이터 암호화는 AWS 중국(베이징), AWS 중국(닝샤), AWS GovCloud(미국)를 포함한 모든 AWS 리전에서 이용 가능합니다. 자세한 내용은 [저장 시 DynamoDB 암호화: 작동 방식](encryption.howitworks.md) 및 [DynamoDB 저장 데이터 암호화 사용 참고 사항](encryption.usagenotes.md)(을)를 참조하세요.

# 저장 시 DynamoDB 암호화: 작동 방식
<a name="encryption.howitworks"></a>

Amazon DynamoDB 저장 데이터 암호화는 256비트 고급 암호화 표준(AES-256)에 따라 데이터를 암호화하여 기본 스토리지에 대한 무단 액세스로부터 데이터를 보호할 수 있도록 지원합니다.

유휴 시 암호화는 테이블을 암호화하는 데 사용되는 암호화 키를 관리하기 위해 AWS Key Management Service(AWS KMS)와 통합됩니다.

**참고**  
2022년 5월, AWS KMS는 AWS 관리형 키에 대한 교체 일정을 3년(약 1,095일)에서 매년(약 365일)으로 변경했습니다.  
새 AWS 관리형 키는 생성된 후 1년이 지나면 자동으로 교체되고, 그 후에도 대략 매년 자동으로 교체됩니다.  
기존 AWS 관리형 키는 가장 최근 교체 후 1년이 지나면 자동으로 교체되고, 그 후에도 매년 자동으로 교체됩니다.

## AWS 소유 키
<a name="ddb-owned"></a>

 AWS 소유 키는 AWS 계정에 저장되지 않습니다. 이들은 AWS가 여러 AWS 계정에서 사용하기 위해 소유 및 관리하는 KMS 키 모음의 일부입니다. AWS 서비스는 AWS 소유 키를 사용하여 데이터를 보호할 수 있습니다. DynamoDB에서 사용하는 AWS 소유 키는 매년(약 365일) 교체됩니다.

사용자는 AWS 소유 키를 확인, 관리 또는 사용하거나 사용을 감사할 수 없습니다. 하지만 데이터를 암호화하는 키를 보호하기 위해 어떤 작업을 수행하거나 어떤 프로그램을 변경할 필요가 없습니다.

월별 요금 또는 AWS 소유 키의 사용량에 따른 요금이 부과되지 않으며, 계정의 AWS KMS 할당량에 포함되지 않습니다.

## AWS 관리형 키
<a name="managed-key-service-default-kms"></a>

AWS 관리형 키는 AWS KMS와 통합된 AWS 서비스가 고객의 계정에서 고객 대신 생성, 관리 및 사용하는 KMS 키입니다. 계정에서 AWS 관리형 키를 확인하고 키 정책을 확인하며, AWS CloudTrail 로그에서 사용을 감사할 수 있습니다. 하지만 이러한 KMS 키를 관리하거나 이들의 권한을 변경할 수는 없습니다.

유휴 시 암호화는 테이블을 암호화하는 데 사용되는 DynamoDB(`aws/dynamodb`)용 AWS 관리형 키를 관리하기 위해 AWS KMS와 자동으로 통합됩니다. 암호화된 DynamoDB 테이블을 생성할 때 AWS 관리형 키가 존재하지 않는 경우 AWS KMS에서 새 키를 자동으로 생성합니다. 이 키는 향후 생성되는 암호화된 테이블에 사용됩니다. AWS KMS는 클라우드에 맞게 조정된 키 관리 시스템을 제공하기 위해 안전하고 가용성이 높은 하드웨어 및 소프트웨어를 결합합니다.

AWS 관리형 키 권한 관리에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [AWS 관리형 키 사용 권한 부여](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-authz)를 참조하세요.

## 고객 관리형 키
<a name="managed-key-customer-managed"></a>

고객 관리형 키는 사용자가 생성, 소유 및 관리하는 AWS 계정의 KMS 키입니다. 사용자는 키 정책 설정 및 관리, IAM 정책, 권한 부여, 활성화 및 비활성화, 암호화 구성 요소 교체, 태그 추가, CMK를 가리키는 별칭 생성 및 삭제를 위한 KMS 예약 등을 포함해 KMS 키에 대한 완전한 제어 권한을 가집니다. 고객 관리형 키의 권한 관리에 대한 자세한 내용은 [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)를 참조하세요.

고객 관리형 키를 테이블 수준 암호화 키로 지정하면 DynamoDB 테이블, 로컬 및 글로벌 보조 인덱스, 스트림은 동일한 고객 관리형 키로 암호화됩니다. 온디맨드 백업은 백업이 생성되는 당시에 지정된 테이블 수준 암호화 키로 암호화됩니다. 테이블 수준 암호화 키를 업데이트하더라도 기존 온디맨드 백업과 연계된 암호화 키는 변경되지 않습니다.

고객 관리형 키의 상태를 비활성화로 설정하거나 삭제를 예약하면 모든 사용자와 DynamoDB 서비스가 데이터를 암호화 또는 암호 해독하고 테이블에서 읽고 쓰는 작업을 수행할 수 없습니다. DynamoDB는 사용자가 테이블에 지속적으로 액세스하고 데이터 유실을 방지하기 위해 암호화 키에 액세스할 수 있어야 합니다.

고객 관리형 키를 비활성화하거나 삭제를 예약한 경우에는 테이블 상태가 **Inaccessible(접근 불가)**로 바뀌게 됩니다. 테이블에서 작업을 계속하기 위해서는 7일 안에 DynamoDB 액세스를 지정된 암호화 키에 제공해야 합니다. 서비스에서 사용자의 암호화 키가 접근 불가 상태인 것을 탐지하면 바로 DynamoDB는 사용자에게 이를 알리기 위해 이메일 공지를 보냅니다.

**참고**  
7일 이상 고객 관리형 키가 DynamoDB 서비스에 접근 불가 상태가 되면 테이블은 아카이브 상태로 넘어가며 더 이상 액세스할 수 없게 됩니다. DynamoDB는 사용자의 테이블에 대해 온디맨드 백업을 생성하며 이에 대한 비용이 청구됩니다. 이 온디맨드 백업을 새로운 테이블에 데이터를 복원할 때 사용할 수 있습니다. 복원을 시작하려면 테이블에 대한 최종 고객 관리형 키가 활성화되어야 하며, DynamoDB는 이에 액세스할 수 있어야 합니다.
글로벌 테이블 복제본을 암호화하는 데 사용된 고객 관리형 키에 액세스할 수 없는 경우 DynamoDB는 복제 그룹에서 이 복제본을 제거합니다. 고객 관리형 키를 액세스할 수 없는 것으로 감지하고 20시간 후 복제본이 삭제되지 않고 이 리전에서와 이 리전으로의 복제가 중지됩니다.

자세한 내용은 [키 활성화](/kms/latest/developerguide/enabling-keys.html) 및 [키 삭제](/kms/latest/developerguide/deleting-keys.html)를 참조하세요.

## AWS 관리형 키 사용 시 참고 사항
<a name="managed-key-notes"></a>

Amazon DynamoDB는 AWS KMS 계정에 저장된 KMS 키에 대한 액세스 권한이 있어야 테이블 데이터를 읽을 수 있습니다. DynamoDB는 봉투 암호화 및 키 계층 구조를 사용하여 데이터를 암호화합니다. AWS KMS 암호화 키는 이 키 계층 구조의 루트 키를 암호화하는 데 사용됩니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [봉투 암호화](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)를 참조하세요.

 DynamoDB는 모든 DynamoDB 작업에 대해 AWS KMS를 호출하지 않습니다. 활성 트래픽을 통한 호출자당 5분마다 키가 새로 고침됩니다.

연결을 재사용하도록 SDK를 구성했는지 확인합니다. 그렇게 되어 있지 않다면 각 DynamoDB 작업에 대해 새 AWS KMS 캐시 항목을 다시 설정해야 하므로 DynamoDB에서 지연 시간이 발생합니다. 뿐만 아니라 더 많은 AWS KMS 및 CloudTrail 비용이 발생할 수 있습니다. 예를 들어 Node.js SDK를 사용하여 이 작업을 수행하려면 `keepAlive`를 켠 상태에서 새 HTTPS 에이전트를 생성합니다. 자세한 내용은 **AWS SDK for JavaScript 개발자 안내서에서 [Node.js에서 keepAlive 구성](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-reusing-connections.html)을 참조하세요.

# DynamoDB 저장 데이터 암호화 사용 참고 사항
<a name="encryption.usagenotes"></a>

Amazon DynamoDB에서 저장 데이터 암호화를 사용할 때 다음을 고려하세요.

## 모든 테이블 데이터는 암호화됩니다.
<a name="encryption.usagenotes.tabledata"></a>

서버 측 저장 데이터 암호화는 모든 DynamoDB 테이블에서 활성화되며 비활성화할 수 없습니다. 테이블에서 항목의 하위 집합만 암호화할 수 없습니다.

저장 시 암호화는 영구 스토리지 미디어에서 정적(저장 시) 상태인 데이터만 암호화합니다. 전송 중인 데이터 또는 사용 중인 데이터에 대한 데이터 보안 문제가 있는 경우 추가 조치를 취해야 합니다.
+ 전송 중 데이터: DynamoDB의 모든 데이터는 전송 중에 암호화됩니다. 기본적으로 DynamoDB와의 통신은 보안 소켓 계층(SSL)/전송 계층 보안(TLS) 암호화를 사용하여 네트워크 트래픽을 보호하는 HTTPS 프로토콜을 사용합니다.
+ 사용 중인 데이터: DynamoDB에 보내기 전에 클라이언트 측 암호화를 사용하여 데이터를 보호합니다. 자세한 내용은 *Amazon DynamoDB Encryption Client 개발자 안내서*의 [클라이언트 측 및 서버 측 암호화](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/client-server-side.html)를 참조하세요.

암호화된 테이블에서 스트림을 사용할 수 있습니다. DynamoDB 스트림은 항상 테이블 수준 암호화 키로 암호화됩니다. 자세한 내용은 [DynamoDB Streams에 대한 변경 데이터 캡처](Streams.md) 섹션을 참조하세요.

DynamoDB 백업은 암호화되고 이 백업에서 복원되는 테이블도 암호화가 활성화되어 있습니다. 백업 데이터를 암호화하기 위해 AWS 소유 키, AWS 관리형 키 또는 고객 관리형 키를 사용할 수 있습니다. 자세한 내용은 [DynamoDB에 대한 백업 및 복원](Backup-and-Restore.md) 섹션을 참조하세요.

로컬 보조 인덱스와 글로벌 보조 인덱스는 베이스 테이블과 동일한 키를 사용해 암호화됩니다.

## 암호화 유형
<a name="encryption.usagenotes.encryptiontypes"></a>

**참고**  
고객 관리형 키는 글로벌 테이블 버전 2017에서 지원되지 않습니다. DynamoDB 글로벌 테이블에서 고객 관리형 키를 사용하려면 테이블을 글로벌 테이블 버전 2019로 업그레이드하고 사용 설정해야 합니다.

AWS Management Console에서 AWS 관리형 키 또는 고객 관리형 키를 사용하여 데이터를 암호화할 때 암호화 유형은 `KMS`입니다. AWS 소유 키를 사용할 경우 암호화 유형은 `DEFAULT`입니다. Amazon DynamoDB API에서 AWS 관리형 키 또는 고객 관리형 키를 사용하여 데이터를 암호화할 때 암호화 유형은 `KMS`입니다. 암호화 유형이 없을 경우 AWS 소유 키를 사용하여 데이터를 암호화합니다. 언제든지 AWS 소유 키, AWS 관리형 키 및 고객 관리형 키 간에 전환할 수 있습니다. 콘솔, AWS Command Line Interface(AWS CLI) 또는 Amazon DynamoDB API를 사용해 암호화 키를 전환할 수 있습니다.

고객 관리형 키를 사용할 때 다음과 같은 제한을 유의하세요.
+ DynamoDB Accelerator(DAX) 클러스터에 고객 관리형 키를 사용할 수 없습니다. 자세한 내용은 [DAX 저장 데이터 암호화](DAXEncryptionAtRest.md) 섹션을 참조하세요.
+ 트랜잭션을 사용하는 테이블을 암호화하기 위해 고객 관리형 키를 사용할 수 없습니다. 그러나 트랜잭션 전파의 내구성을 보장하기 위해 트랜잭션 요청의 복사본이 서비스에 의해 임시로 저장되고 AWS 소유 키를 사용하여 암호화됩니다. 테이블 및 보조 인덱스에서 커밋된 데이터는 항상 고객 관리형 키를 사용하여 저장 중 암호화됩니다.
+ Contributor Insights를 사용하는 테이블을 암호화하기 위해 고객 관리형 키를 사용할 수 있습니다. 그러나 Amazon CloudWatch로 전송되는 데이터는 AWS 소유 키로 암호화됩니다.
+ 새 고객 관리형 키로 전환하는 경우 프로세스가 완료될 때까지 원래 키를 사용하도록 설정해야 합니다. AWS에서 새 키로 암호화하기 전에 데이터를 해독하기 위해 원래 키가 필요합니다. 테이블의 SSEDescription 상태가 활성화되고 새 고객 관리형 키의 KMSMasterKeyArn이 표시되면 프로세스가 완료됩니다. 이 시점에서 원래 키를 비활성화하거나 삭제하도록 예약할 수 있습니다.
+ 새 고객 관리 키가 표시되면 테이블과 모든 새 온디맨드 백업이 새 키로 암호화됩니다.
+ 기존 온디맨드 백업은 백업이 생성될 때 사용된 고객 관리 키로 암호화된 상태로 유지됩니다. 이러한 백업을 복원하려면 동일한 키가 필요합니다. DescripbeBackup API를 사용하여 해당 백업의 SSEDescription을 확인하여 각 백업이 생성된 기간의 키를 식별할 수 있습니다.
+ 고객 관리형 키를 비활성화하거나 삭제를 예약하는 경우 DynamoDB Streams에 있는 모든 데이터는 24시간 수명이 적용됩니다. 24시간이 지날 경우 모든 회수되지 않은 데이터는 트리밍 권한이 주어집니다.
+ 고객 관리형 키를 비활성화하거나 삭제를 예약한 경우에는 유지 시간(TTL) 삭제가 30분간 진행됩니다. 이러한 TTL 삭제는 DynamoDB Streams로 계속 방출되며 표준 트리밍/보존 간격이 적용됩니다.

  자세한 내용은 [키 활성화](/kms/latest/developerguide/enabling-keys.html) 및 [키 삭제](/kms/latest/developerguide/deleting-keys.html)를 참조하세요.

## KMS 키 및 데이터 키 사용
<a name="dynamodb-kms"></a>

DynamoDB 암호화 기능은 AWS KMS key와 데이터 키 계층을 사용하여 테이블 데이터를 보호합니다. DynamoDB는 동일한 키 계층을 사용하여 내구성 있는 미디어에 기록되는 DynamoDB 스트림, 전역 테이블 및 백업을 보호합니다.

DynamoDB에서 테이블을 구현하기 전에 암호화 전략을 계획하는 것이 좋습니다. 민감한 데이터나 기밀 데이터를 DynamoDB에 저장하는 경우 계획에 클라이언트측 암호화를 포함하는 것을 고려해 보세요. 이렇게 하면 데이터를 원본에 최대한 가깝게 암호화하고 전체 수명 주기 동안 데이터를 보호할 수 있습니다. 자세한 내용은 [DynamoDB 암호화 클라이언트](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/what-is-ddb-encrypt.html) 설명서를 참조하세요.

**AWS KMS key**  
유휴 시 암호화는 AWS KMS key에서 DynamoDB 테이블을 보호합니다. 기본적으로 DynamoDB는 DynamoDB 서비스 계정에서 생성 및 관리되는 다중 테넌트 암호화 키인 [AWS 소유 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)를 사용합니다. 그러나 AWS 계정의 DynamoDB(`aws/dynamodb`)용 [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)에서 DynamoDB 테이블을 암호화할 수 있습니다. 각 테이블마다 다른 KMS 키를 선택할 수 있습니다. 테이블에 대해 선택한 KMS 키는 로컬 및 전역 보조 인덱스, 스트림 및 백업을 암호화하는 데에도 사용됩니다.  
테이블을 생성 또는 업데이트할 때 테이블에 대해 KMS 키를 선택합니다. 언제든지 DynamoDB 콘솔에서 또는 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) 작업을 사용하여 테이블에 대한 KMS 키를 변경할 수 있습니다. 키 전환 프로세스는 원활하며 가동 중지 시간 또는 서비스 저하가 발생하지 않습니다.  
DynamoDB는 [대칭 KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)만 지원합니다. [비대칭 KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html#asymmetric-cmks)를 사용하여 DynamoDB 테이블을 암호화할 수 없습니다. 
고객 관리형 키를 사용하여 다음과 같은 기능을 얻을 수 있습니다.  
+ KMS 키에 대한 액세스를 제어하기 위한 [키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html), [IAM 정책](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html) 및 [권한 부여](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html) 설정을 포함하여 KMS 키를 생성하고 관리합니다 KMS 키를 [활성화 및 비활성화](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html)하고, [자동 키 교체](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)를 활성화 및 비활성화하고, KMS 키가 더 이상 사용되지 않을 때 [KMS 키를 삭제](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html)할 수 있습니다.
+ [가져온 키 구성 요소](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html)가 있는 고객 관리형 키를 사용하거나 고객이 소유하고 관리하는 [사용자 지정 키 스토어](https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html)에서 고객 관리형 키를 사용할 수 있습니다.
+ [AWS CloudTrail 로그](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail)에서 AWS KMS에 대한 DynamoDB API 호출을 검사하여 DynamoDB 테이블의 암호화 및 복호화를 감사할 수 있습니다.
다음과 같은 기능이 필요한 경우 AWS 관리형 키를 사용합니다.  
+ [KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html) 및 [해당 키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-viewing.html)을 볼 수 있습니다. 키 정책을 변경할 수 없습니다.
+ [AWS CloudTrail 로그](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail)에서 AWS KMS에 대한 DynamoDB API 호출을 검사하여 DynamoDB 테이블의 암호화 및 복호화를 감사할 수 있습니다.
그러나 AWS 소유 키는 무료이며 그 사용은 [AWS KMS 리소스 또는 요청 할당량](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)에 포함되지 않습니다. 고객 관리형 키 및 AWS 관리형 키는 각 API 호출에 대해 [요금이 부과](https://aws.amazon.com/kms/pricing/)되며 이러한 KMS 키에 AWS KMS 할당량이 적용됩니다.

**테이블 키**  
DynamoDB는 테이블에 대해 KMS 키를 사용하여 *테이블 키*라고 하는 테이블에 대한 고유한 [데이터 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)를 [생성](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)하고 암호화합니다. 테이블 키는 암호화된 테이블의 수명 기간 동안 존속합니다.  
테이블 키는 키 암호화 키로 사용됩니다. DynamoDB는 이 테이블 키를 사용하여 테이블 데이터를 암호화하는 데 사용되는 데이터 암호화 키를 보호합니다. DynamoDB는 테이블에 있는 각 기본 구조의 고유한 데이터 암호화 키를 생성하지만, 동일한 데이터 암호화 키로 여러 테이블 항목을 보호할 수 없습니다.  

![\[영구 암호화로 DynamoDB 테이블 암호화\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/service-ddb-encrypt.png)

암호화된 테이블에 처음 액세스하면 DynamoDB가 KMS 키를 사용하여 테이블 키를 해제하도록 AWS KMS에 요청합니다. 그런 다음 일반 텍스트 테이블 키를 사용하여 데이터 암호화 키를 해독하고, 일반 텍스트 데이터 암호화 키를 사용하여 테이블 데이터를 해독합니다.  
DynamoDB는 AWS KMS 외부에 테이블 키와 데이터 암호화 키를 저장하고 사용합니다. [고급 암호화 표준](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)(AES) 암호화 및 256비트 암호화 키로 모든 키를 보호합니다. 그런 다음 필요에 따라 테이블 데이터를 해독할 때 사용할 수 있도록 암호화된 데이터로 암호화된 키를 저장합니다.  
테이블의 KMS 키를 변경하면 DynamoDB가 새 테이블 키를 생성합니다. 그런 다음 새 테이블 키를 사용하여 데이터 암호화 키를 다시 암호화합니다.

**테이블 키 캐싱**  
각 DynamoDB 작업마다 AWS KMS 를 호출하지 않도록 DynamoDB는 메모리에 있는 각 호출자의 일반 텍스트 테이블 키를 캐싱합니다. 5분의 비활성 시간이 경과하여 DynamoDB가 캐싱된 테이블 키를 요청할 경우 테이블 키를 해독하라는 새로운 요청을 AWS KMS에 보냅니다. 이 호출은 마지막 테이블 키 해제 요청 이후 KMS 키의 액세스 정책에 적용된 모든 변경 사항을 AWS KMS 또는 AWS Identity and Access Management(IAM)에 캡처합니다.

## KMS 키 사용 권한 부여
<a name="dynamodb-kms-authz"></a>

계정에서 [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) 또는 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)를 사용하여 DynamoDB 테이블을 보호할 경우 해당 KMS 키에 대한 정책이 DynamoDB에 사용자 대신 키를 사용할 권한을 부여해야 합니다. DynamoDB용 AWS 관리형 키의 권한 부여 컨텍스트에는 그 사용 권한을 위임하는 키 정책과 권한 부여가 포함되어 있습니다.

고객 관리형 키에 대한 정책 및 권한 부여를 완전히 제어할 수 있습니다. AWS 관리형 키는 계정에 있으므로 해당 정책 및 권한 부여를 볼 수 있습니다. 하지만 정책은 AWS에 의해 관리되므로 사용자가 정책을 변경할 수는 없습니다.

DynamoDB는 기본 [AWS 소유 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)를 사용하여 AWS 계정의 DynamoDB 테이블을 보호하기 위해 추가 인증이 필요하지 않습니다.

**Topics**
+ [AWS 관리형 키에 대한 키 정책](#dynamodb-policies)
+ [고객 관리형 키에 대한 키 정책](#dynamodb-customer-cmk-policy)
+ [권한 부여를 사용하여 DynamoDB 승인](#dynamodb-grants)

### AWS 관리형 키에 대한 키 정책
<a name="dynamodb-policies"></a>

DynamoDB가 암호화 작업에서 DynamoDB(`aws/dynamodb`)에 대해 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)를 사용하는 경우 [DynamoDB 리소스](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-overview.html)에 액세스하는 사용자를 수행합니다. AWS 관리형 키에 대한 키 정책은 계정의 모든 사용자에게 지정된 작업에 대해 AWS 관리형 키를 사용할 권한을 부여합니다. 그러나 DynamoDB가 사용자 대신 요청할 때만 권한이 부여됩니다. 키 정책의 [ViaService 조건](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service)은 요청이 DynamoDB 서비스에서 이루어지지 않은 경우 어떤 사용자도 AWS 관리형 키를 사용하도록 허용하지 않습니다.

이 키 정책은 모든 AWS 관리형 키의 정책과 마찬가지로 AWS에 의해 설정됩니다. 변경은 할 수 없지만 언제든 보는 것은 가능합니다. 자세한 내용은 [키 정책 보기](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-viewing.html)를 참조하세요.

키 정책의 정책 설명문은 다음 효과를 갖습니다.
+ 계정 내 사용자가 DynamoDB에서 대신 요청이 올 때만 암호화 작업에서 DynamoDB에 AWS 관리형 키를 사용할 수 있도록 합니다. 이 정책은 사용자들이 KMS 키의 [권한 부여를 생성하는](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-grants) 것도 허용합니다.
+ 계정의 승인된 IAM 자격 증명이 DynamoDB용 AWS 관리형 키의 속성을 보고 DynamoDB가 KMS 키를 사용하도록 허용하는 [권한을 취소](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)할 수 있습니다. DynamoDB는 지속적인 유지 관리 작업에 [권한 부여](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-grants)를 사용합니다.
+ DynamoDB가 읽기 전용 작업을 수행하여 계정의 DynamoDB용 AWS 관리형 키를 찾을 수 있게 합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id" : "auto-dynamodb-1",
  "Statement" : [ {
    "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "*"
    },
    "Action" : [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey" ],
    "Resource" : "*",
    "Condition" : {
      "StringEquals" : {
        "kms:CallerAccount" : "111122223333",
        "kms:ViaService" : "dynamodb.us-west-2.amazonaws.com"
      }
    }
  }, {
    "Sid" : "Allow direct access to key metadata to the account",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::111122223333:root"
    },
    "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ],
    "Resource" : "*"
  }, {
    "Sid" : "Allow DynamoDB Service with service principal name dynamodb.amazonaws.com to describe the key directly",
    "Effect" : "Allow",
    "Principal" : {
      "Service" : "dynamodb.amazonaws.com"
    },
    "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*" ],
    "Resource" : "*"
  } ]
}
```

------

### 고객 관리형 키에 대한 키 정책
<a name="dynamodb-customer-cmk-policy"></a>

DynamoDB 테이블을 보호하기 위해 [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)를 선택하면 DynamoDB는 선택하는 보안 주체를 대신하여 KMS 키를 사용할 수 있는 권한을 얻습니다. 해당 보안 주체, 즉 사용자 또는 역할은 DynamoDB가 필요한 KMS 키에 대한 권한이 있어야 합니다. [키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html), [IAM 정책](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html) 또는 [권한 부여](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)에 이러한 권한을 제공할 수 있습니다.

DynamoDB는 고객 관리형 키에 대해 최소한 다음 권한이 있어야 합니다.
+ [kms:Encrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)
+ [kms:ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html)\$1(kms:ReEncryptFrom and kms:ReEncryptTo용)
+ kms:GenerateDataKey\$1([kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 및 [kms:GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)용)
+ [kms:DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)
+ [kms:CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)

예를 들어 다음 예제 키 정책은 필수 권한만 제공합니다. 이 정책에는 다음과 같은 효과가 있습니다.
+ DynamoDB가 암호화 작업에 KMS 키를 사용하고 권한 부여를 생성하도록 허용합니다. 단, DynamoDB를 사용할 권한이 있는 계정의 보안 주체를 대신해 동작하는 경우에 한합니다. 정책 문에 지정된 보안 주체가 DynamoDB를 사용할 권한이 없는 경우 DynamoDB 서비스에서 오는 경우에도 호출이 실패합니다.
+ [kms:ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service) 조건 키는 정책 문에 나열된 보안 주체를 대신하여 DynamoDB로부터 요청이 오는 경우에만 사용 권한을 허용합니다. 이러한 보안 주체는 이러한 작업을 직접 호출 할 수 없습니다. 참고: `kms:ViaService` 값(`dynamodb.*.amazonaws.com`)은 리전 위치에 별표(\$1)가 있습니다. DynamoDB는 [DynamoDB 전역 테이블](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html)을 지원하기 위해 교차 리전 호출을 수행할 수 있도록 특정 AWS 리전과 독립적인 권한이 필요합니다.
+ KMS 키 관리자(`db-team` 역할을 수임할 수 있는 사용자)에게 KMS 키에 대한 읽기 전용 액세스와 테이블을 보호하기 위해 [DynamoDB가 필요로 하는](#dynamodb-grants) 권한 부여를 포함하여 권한 부여를 취소할 수 있는 권한을 제공합니다.

예제 키 정책을 사용하기 전에 예제 보안 주체를 AWS 계정의 실제 보안 주체로 바꿉니다.

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

****  

```
{
  "Id": "key-policy-dynamodb",
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::111122223333:user/db-lead"},
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey",
        "kms:CreateGrant"
      ],
      "Resource": "*",      
      "Condition": { 
         "StringLike": {
           "kms:ViaService" : "dynamodb.*.amazonaws.com"
         }
      }
    },
    {
      "Sid":  "Allow administrators to view the KMS key and revoke grants",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/db-team"
       },
      "Action": [
        "kms:Describe*",
        "kms:Get*",
        "kms:List*",
        "kms:RevokeGrant"
      ],
      "Resource": "*"
    }
  ]
}
```

------

### 권한 부여를 사용하여 DynamoDB 승인
<a name="dynamodb-grants"></a>

키 정책 이외에 DynamoDB는 권한 부여를 사용하여 DynamoDB용 AWS 관리형 키(`aws/dynamodb`) 또는 고객 관리형 키에 대한 권한을 설정합니다. 계정에서 KMS 키에 대한 권한 부여를 보려면 [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) 작업을 사용합니다. DynamoDB는 [AWS 소유 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)를 사용하여 테이블을 보호하는 데 권한 부여 또는 추가 권한이 필요하지 않습니다.

DynamoDB는 배경 시스템 유지 관리 및 연속 데이터 보호 태스크를 수행할 때 권한 부여 권한을 사용합니다. 권한 부여를 사용하여 [테이블 키](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-encrypt)도 생성합니다.

각 권한 부여는 테이블마다 다릅니다. 계정에 동일한 KMS 키로 암호화되는 여러 테이블이 있는 경우 각 테이블 유형별 권한 부여가 있습니다. 권한 부여는 [DynamoDB 암호화 컨텍스트](#dynamodb-encryption-context)의 제한을 받는데, 여기에는 테이블 이름과 AWS 계정 ID가 포함되며, 더 이상 필요 없을 경우 [권한 부여 제거](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html) 권한도 포함됩니다.

권한 부여를 생성하려면 DynamoDB가 암호화된 테이블을 생성한 사용자를 대신하여 `CreateGrant`를 호출할 수 있는 권한이 있어야 합니다. AWS 관리형 키의 경우 DynamoDB 는 [키 정책](#dynamodb-policies)에서 `kms:CreateGrant` 권한을 얻습니다. 이를 통해 계정 사용자는 DynamoDB가 승인된 사용자를 대신하여 요청할 때만 KMS 키에서 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)를 호출할 수 있습니다.

이 키 정책은 계정이 KMS 키에 대한 [권한 부여를 취소](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)하도록 허용할 수도 있습니다. 단, 활성 암호화 테이블에서 권한 부여를 취소할 경우에는 DynamoDB가 테이블을 보호하고 유지하지 못합니다.

## DynamoDB 암호화 컨텍스트
<a name="dynamodb-encryption-context"></a>

[암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)는 보안되지 않은 임의의 데이터를 포함하는 키-값 페어 세트입니다. 데이터 암호화 요청에 암호화 컨텍스트를 포함하는 경우 AWS KMS는 암호화된 데이터에 암호화 컨텍스트를 암호 방식으로 바인딩합니다. 따라서 동일한 암호화 컨텍스트로 전달해야 이 데이터를 해독할 수 있습니다.

DynamoDB는 모든 AWS KMS 암호화 작업에서 동일한 암호화 컨텍스트를 사용합니다. [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) 또는 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 를 사용하여 DynamoDB 테이블을 보호할 경우 암호화 컨텍스트를 사용하여 감사 레코드 및 로그에서 KMS 키의 사용을 식별할 수 있습니다. [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 및 [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 같은 로그에서 일반 텍스트에 나타나기도 합니다.

암호화 컨텍스트를 정책 및 권한 부여에서 승인 조건으로 사용할 수도 있습니다. DynamoDB는 암호화 컨텍스트를 사용하여 계정 및 리전에서 고객 관리형 키 또는 AWS 관리형 키에 대한 액세스를 허용하는 [권한](#dynamodb-grants)을 제한합니다.

AWS KMS에 요청할 때 DynamoDB 는 두 개의 키값 쌍이 있는 암호화 컨텍스트를 사용합니다.

```
"encryptionContextSubset": {
    "aws:dynamodb:tableName": "Books"
    "aws:dynamodb:subscriberId": "111122223333"
}
```
+ **테이블** – 첫 번째 키값 쌍은 DynamoDB가 암호화 중인 테이블을 나타냅니다. 키는 `aws:dynamodb:tableName`입니다. 값은 테이블의 이름입니다.

  ```
  "aws:dynamodb:tableName": "<table-name>"
  ```

  예:

  ```
  "aws:dynamodb:tableName": "Books"
  ```
+ **계정** – 두 번째 키값 쌍은 AWS 계정을 나타냅니다. 키는 `aws:dynamodb:subscriberId`입니다. 값은 계정 ID입니다.

  ```
  "aws:dynamodb:subscriberId": "<account-id>"
  ```

  예:

  ```
  "aws:dynamodb:subscriberId": "111122223333"
  ```

## AWS KMS와 DynamoDB 상호 작용 모니터링
<a name="dynamodb-cmk-trail"></a>

[고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) 또는 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)를 사용하여 DynamoDB 테이블을 보호할 경우 AWS CloudTrail 로그를 사용하여 DynamoDB가 사용자 대신 AWS KMS로 전송하는 요청을 추적할 수 있습니다.

`GenerateDataKey`, `Decrypt` 및 `CreateGrant` 요청은 이 섹션에서 다룹니다. 그리고 DynamoDB는 [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) 작업을 사용하여 사용자가 선택한 KMS 키가 계정과 리전에 있는지 확인합니다. 그리고 [RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html) 작업을 사용하여 사용자가 테이블을 삭제할 때 권한 부여를 제거합니다.

**GenerateDataKey**  
사용자가 테이블에서 영구 암호화를 활성화하면 DynamoDB가 고유한 테이블 키를 생성합니다. 테이블에 대한 KMS 키를 지정하는 *[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)* 요청을 AWS KMS로 보냅니다.  
`GenerateDataKey` 작업을 기록하는 이벤트는 다음 예시 이벤트와 유사합니다. 사용자는 DynamoDB 서비스 계정입니다. 파라미터에는 KMS 키의 Amazon 리소스 이름(ARN), 256비트 키가 필요한 키 지정자, 테이블과 AWS 계정를 식별하는 [암호화 컨텍스트](#dynamodb-encryption-context)가 포함됩니다.  

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AWSService", 
        "invokedBy": "dynamodb.amazonaws.com" 
    },
    "eventTime": "2018-02-14T00:15:17Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKey",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "dynamodb.amazonaws.com",
    "userAgent": "dynamodb.amazonaws.com",
    "requestParameters": {
        "encryptionContext": {
            "aws:dynamodb:tableName": "Services",
            "aws:dynamodb:subscriberId": "111122223333"
        }, 
        "keySpec": "AES_256", 
        "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
    }, 
    "responseElements": null,
    "requestID": "229386c1-111c-11e8-9e21-c11ed5a52190",
    "eventID": "e3c436e9-ebca-494e-9457-8123a1f5e979",
    "readOnly": true,
    "resources": [
        {
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333",
            "type": "AWS::KMS::Key" 
        } 
    ],
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333",
    "sharedEventID": "bf915fa6-6ceb-4659-8912-e36b69846aad"
}
```

**Decrypt**  
암호화된 DynamoDB 테이블에 액세스하면 DynamoDB가 테이블 키를 해독해야만 계층에서 그 아래에 있는 키를 해독할 수 있습니다. 이후 테이블에 있는 데이터를 해독합니다. 테이블 키를 복호화하려면 DynamoDB는 테이블에 대한 KMS 키를 지정하는 AWS KMS로 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 요청을 보냅니다.  
`Decrypt` 작업을 기록하는 이벤트는 다음 예시 이벤트와 유사합니다. 사용자는 테이블에 액세스 중인 AWS 계정에 있는 보안 주체입니다. 파라미터에는 암호화된 테이블 키(암호화 텍스트 blob)와, 테이블 및 AWS 계정를 식별하는 [암호화 컨텍스트](#dynamodb-encryption-context)가 포함됩니다. AWS KMS는 암호화 텍스트에서 KMS 키의 ID를 파생합니다.  

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAIGDTESTANDEXAMPLE:user01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01",
        "accountId": "111122223333",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false", 
                "creationDate": "2018-02-14T16:42:15Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAIGDT3HGFQZX4RY6RU",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin" 
            }
        },
        "invokedBy": "dynamodb.amazonaws.com"
    },
    "eventTime": "2018-02-14T16:42:39Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "dynamodb.amazonaws.com",
    "userAgent": "dynamodb.amazonaws.com",
    "requestParameters": 
    {
        "encryptionContext":
        {
            "aws:dynamodb:tableName": "Books",
            "aws:dynamodb:subscriberId": "111122223333" 
        }
    }, 
    "responseElements": null, 
    "requestID": "11cab293-11a6-11e8-8386-13160d3e5db5",
    "eventID": "b7d16574-e887-4b5b-a064-bf92f8ec9ad3", 
    "readOnly": true, 
    "resources": [ 
        {
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333", 
            "type": "AWS::KMS::Key" 
        }
    ],
    "eventType": "AwsApiCall", 
    "recipientAccountId": "111122223333"
}
```

**CreateGrant**  
[고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) 또는 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)를 사용하여 DynamoDB 테이블을 보호하면 DynamoDB는 [권한 부여](#dynamodb-grants)를 사용하여 서비스가 지속적 데이터 보호와 유지 관리 및 내구성 태스크를 수행하도록 허용합니다. 이러한 권한 부여가 [AWS 소유 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)에서는 필요하지 않습니다.  
DynamoDB가 생성하는 권한 부여는 테이블마다 다릅니다. [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 요청에 있는 주체는 테이블을 생성한 사용자입니다.  
`CreateGrant` 작업을 기록하는 이벤트는 다음 예시 이벤트와 유사합니다. 파라미터에는 테이블에 대한 KMS 키의 Amazon 리소스 이름(ARN), 피부여자 주체 및 삭제 주체(DynamoDB 서비스), 권한 부여가 적용되는 작업이 포함됩니다. 모든 암호화 작업에서 지정된 [암호화 컨텍스트](#dynamodb-encryption-context)를 사용할 것을 요구하는 제한도 포함됩니다.  

```
{ 
    "eventVersion": "1.05", 
    "userIdentity": 
    { 
        "type": "AssumedRole", 
        "principalId": "AROAIGDTESTANDEXAMPLE:user01", 
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", 
        "accountId": "111122223333", 
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE", 
        "sessionContext": { 
            "attributes": { 
                "mfaAuthenticated": "false", 
                "creationDate": "2018-02-14T00:12:02Z" 
            }, 
            "sessionIssuer": { 
                "type": "Role", 
                "principalId": "AROAIGDTESTANDEXAMPLE", 
                "arn": "arn:aws:iam::111122223333:role/Admin", 
                "accountId": "111122223333", 
                "userName": "Admin" 
            }
        }, 
        "invokedBy": "dynamodb.amazonaws.com" 
    }, 
    "eventTime": "2018-02-14T00:15:15Z", 
    "eventSource": "kms.amazonaws.com", 
    "eventName": "CreateGrant", 
    "awsRegion": "us-west-2", 
    "sourceIPAddress": "dynamodb.amazonaws.com", 
    "userAgent": "dynamodb.amazonaws.com", 
    "requestParameters": { 
        "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab", 
        "retiringPrincipal": "dynamodb.us-west-2.amazonaws.com", 
        "constraints": { 
            "encryptionContextSubset": {
                "aws:dynamodb:tableName": "Books",
                "aws:dynamodb:subscriberId": "111122223333" 
            } 
        }, 
        "granteePrincipal": "dynamodb.us-west-2.amazonaws.com", 
        "operations": [ 
            "DescribeKey", 
            "GenerateDataKey", 
            "Decrypt", 
            "Encrypt", 
            "ReEncryptFrom", 
            "ReEncryptTo", 
            "RetireGrant" 
        ] 
    }, 
    "responseElements": { 
        "grantId": "5c5cd4a3d68e65e77795f5ccc2516dff057308172b0cd107c85b5215c6e48bde" 
    }, 
    "requestID": "2192b82a-111c-11e8-a528-f398979205d8", 
    "eventID": "a03d65c3-9fee-4111-9816-8bf96b73df01", 
    "readOnly": false, 
    "resources": [ 
        { 
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333", 
            "type": "AWS::KMS::Key" 
        } 
    ], 
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333"
}
```

# DynamoDB의 암호화된 테이블 관리
<a name="encryption.tutorial"></a>

AWS Management Console 또는 AWS Command Line Interface(AWS CLI)를 사용해 새로운 테이블에 암호화 키를 지정하고 Amazon DynamoDB에 있는 기존 테이블의 암호화 키를 업데이트할 수 있습니다.

**Topics**
+ [새 테이블에 대한 암호화 키 지정](#encryption.tutorial-creating)
+ [암호화 키 업데이트](#encryption.tutorial-update)

## 새 테이블에 대한 암호화 키 지정
<a name="encryption.tutorial-creating"></a>

Amazon DynamoDB 콘솔 또는 AWS CLI를 이용해 새로운 테이블에 암호화 키를 지정하기 위해 다음 단계를 따르세요.

### 암호화된 테이블 생성(콘솔)
<a name="encryption.tutorial-console"></a>

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

1.  콘솔 왼쪽의 탐색 창에서 **테이블(Tables)**을 선택합니다.

1. **Create Table(테이블 생성)**을 선택합니다. **테이블 이름**에 **Music**을 입력합니다. 기본 키의 경우 **Artist**를, 정렬 키의 경우 **SongTitle**을 각각 문자열로 입력합니다.

1. **설정(Settings)**에서 **설정 사용자 지정(Customize settings)**이 선택되었는지 확인합니다.
**참고**  
**기본 설정 사용**을 선택한 경우 AWS 소유 키를 사용하여 무료로 테이블이 저장 중 암호화됩니다.

1. **Encryption at rest**(유휴 시 암호화)에서 암호화 유형 -AWS 소유 키, AWS 관리형 키, 또는 고객 관리 키를 선택합니다.
   +  **Owned by Amazon DynamoDB.**(Amazon DynamoDB가 소유.) AWS 소유 키로, 구체적으로는 DynamoDB가 소유하고 관리합니다. 이 키 사용에 대한 추가 요금은 부과되지 않습니다.
   + **AWS 관리형 키**. 키 별칭: `aws/dynamodb`. 이 키는 계정에 저장되고 AWS Key Management Service에서 관리합니다(AWS KMS). AWS KMS 비용이 적용됩니다.
   +  **계정에 저장되며 본인이 소유하고 관리합니다.** 고객 관리형 키. 이 키는 계정에 저장되고 AWS Key Management Service에서 관리합니다(AWS KMS). AWS KMS 비용이 적용됩니다.
**참고**  
자체 키 소유 및 관리를 선택하는 경우 KMS 키 정책이 적절하게 설정되었는지 확인합니다. 예를 포함한 자세한 내용은 [고객 관리형 키에 대한 키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)을 참조하세요.

1. **테이블 생성(Create table)**을 선택하여 암호화된 테이블을 생성합니다. 암호화 유형을 확인하려면 **개요(Overview)** 탭의 테이블 세부 정보를 클릭하고 **추가 세부 정보(Additional details)** 섹션을 검토합니다.

### 암호화된 테이블 생성(AWS CLI)
<a name="encryption.tutorial-cli"></a>

AWS CLI를 사용해 Amazon DynamoDB용 기본 AWS 소유 키, AWS 관리형 키 또는 고객 관리형 키가 있는 테이블을 생성합니다.

**기본 AWS 소유 키를 사용하여 암호화된 테이블을 생성하려면**
+ 다음과 같이 암호화된 `Music` 테이블을 생성합니다.

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5
  ```
**참고**  
이 테이블은 이제 DynamoDB 서비스 계정에서 기본 AWS 소유 키를 사용하여 암호화됩니다.

**DynamoDB용 AWS 관리형 키를 사용하여 암호화된 테이블을 생성하려면**
+ 다음과 같이 암호화된 `Music` 테이블을 생성합니다.

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5 \
    --sse-specification Enabled=true,SSEType=KMS
  ```

   테이블 설명의 `SSEDescription` 상태는 `ENABLED`로 설정되고 `SSEType`은 `KMS`입니다.

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

**DynamoDB용 고객 관리형 키를 사용하여 암호화된 테이블을 생성하려면**
+ 다음과 같이 암호화된 `Music` 테이블을 생성합니다.

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5 \
    --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=abcd1234-abcd-1234-a123-ab1234a1b234
  ```
**참고**  
`KMSMasterKeyId`의 경우 키 ID, 키 ARN 또는 키 별칭을 사용할 수 있습니다. 키 별칭(예: `alias/my-key`)을 사용하는 경우 DynamoDB는 별칭을 확인하고 기본 AWS KMS 키를 테이블과 연결합니다. 테이블 설명에서 `KMSMasterKeyArn`은 항상 별칭이 아닌 확인된 키의 키 ARN을 표시합니다. 키 식별자에 대한 자세한 내용은 *AWS Key Management Service 개발자 가이드*의 [키 식별자(KeyId)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id)를 참조하세요.

   테이블 설명의 `SSEDescription` 상태는 `ENABLED`로 설정되고 `SSEType`은 `KMS`입니다.

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

## 암호화 키 업데이트
<a name="encryption.tutorial-update"></a>

또한 언제든지 DynamoDB 콘솔 또는 AWS CLI를 사용하여 AWS 소유 키, AWS 관리형 키, 고객 관리형 키 중에서 기존 테이블의 암호화 키를 업데이트할 수 있습니다.

### 암호화 키 업데이트(콘솔)
<a name="encryption.tutorial-update-console"></a>

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

1.  콘솔 왼쪽의 탐색 창에서 **테이블(Tables)**을 선택합니다.

1. 업데이트할 테이블을 선택합니다.

1. **작업(Actions)** 드롭다운을 선택한 다음에 **설정 업데이트(Update settings)** 옵션을 선택합니다.

1. **추가 설정(Additional settings)** 탭으로 이동합니다.

1. **암호화(Encryption)**에서 **암호화 관리(Manage encryption)**를 선택합니다.

1. 다음과 같이 암호화 유형을 선택합니다.
   +  **Amazon DynamoDB 소유.** AWS KMS 키는 DynamoDB에서 소유하고 관리합니다. 이 키 사용에 대한 추가 요금은 부과되지 않습니다.
   + **AWS 관리형 키** 키 별칭: `aws/dynamodb`. 이 키는 사용자의 계정에 저장되고 AWS Key Management Service에서 관리합니다(AWS KMS). AWS KMS 비용이 적용됩니다.
   +  **계정에 저장되며 본인이 소유하고 관리합니다.** 이 키는 사용자의 계정에 저장되고 AWS Key Management Service에서 관리합니다(AWS KMS). AWS KMS 비용이 적용됩니다.
**참고**  
자체 키 소유 및 관리를 선택하는 경우 KMS 키 정책이 적절하게 설정되었는지 확인합니다. 자세한 내용은 [ 고객 관리형 키에 대한 키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)을 참조하세요.

   그런 다음 **저장**을 선택하여 암호화된 테이블을 업데이트합니다. 암호화 유형을 확인하려면 **개요** 탭에서 테이블 세부 정보를 확인하세요.

### 암호화 키 업데이트(AWS CLI)
<a name="encryption.tutorial-update-cli"></a>

다음 예에서는 AWS CLI를 사용해 암호화된 테이블을 업데이트하는 방법을 보여줍니다.

**기본 AWS 소유 키를 사용하여 암호화된 테이블을 업데이트하려면**
+ 암호화된 `Music` 테이블을 다음 예와 같이 업데이트합니다.

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=false
  ```
**참고**  
이 테이블은 이제 DynamoDB 서비스 계정에서 기본 AWS 소유 키를 사용하여 암호화됩니다.

**DynamoDB용 AWS 관리형 키를 사용하여 암호화된 테이블을 업데이트하려면**
+ 암호화된 `Music` 테이블을 다음 예와 같이 업데이트합니다.

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=true
  ```

   테이블 설명의 `SSEDescription` 상태는 `ENABLED`로 설정되고 `SSEType`은 `KMS`입니다.

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

**DynamoDB용 고객 관리형 키를 사용하여 암호화된 테이블을 업데이트하려면**
+ 암호화된 `Music` 테이블을 다음 예와 같이 업데이트합니다.

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=abcd1234-abcd-1234-a123-ab1234a1b234
  ```
**참고**  
`KMSMasterKeyId`의 경우 키 ID, 키 ARN 또는 키 별칭을 사용할 수 있습니다. 키 별칭(예: `alias/my-key`)을 사용하는 경우 DynamoDB는 별칭을 확인하고 기본 AWS KMS 키를 테이블과 연결합니다. 테이블 설명에서 `KMSMasterKeyArn`은 항상 별칭이 아닌 확인된 키의 키 ARN을 표시합니다.

   테이블 설명의 `SSEDescription` 상태는 `ENABLED`로 설정되고 `SSEType`은 `KMS`입니다.

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```