

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

# DynamoDB Encryption Client for Python의 예제 코드
<a name="python-examples"></a>

**참고**  
클라이언트측 암호화 라이브러리의 [이름이 AWS Database Encryption SDK로 변경되었습니다](DDBEC-rename.md). 다음 주제에서는 Java용 DynamoDB Encryption Client 버전 1.*x*\$12.*x* 와 Python용 DynamoDB Encryption Client 버전 1.*x*\$13.*x*에 대한 정보를 제공합니다. 자세한 내용은 [AWS Database Encryption SDK for DynamoDB 버전 지원](legacy-dynamodb-encryption-client.md#legacy-support)을 참조하세요.

다음 예제에서는 DynamoDB Encryption Client for Python를 사용하여 애플리케이션에서 DynamoDB 데이터를 보호하는 방법을 보여줍니다. GitHub에 있는 [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/) 리포지토리의 [예제](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples) 디렉터리에서 더 많은 예제를 찾고 직접 기여할 수 있습니다.

**Topics**
+ [EncryptedTable 클라이언트 헬퍼 클래스 사용](#python-example-table)
+ [항목 암호화 도구 사용](#python-example-item-encryptor)

## EncryptedTable 클라이언트 헬퍼 클래스 사용
<a name="python-example-table"></a>

다음 예제에서는 [Direct KMS Provider](direct-kms-provider.md)를 `EncryptedTable` [클라이언트 헬퍼 클래스](python-using.md#python-helpers)와 함께 사용하는 방법을 보여줍니다. 이 예제에서는 다음 [항목 암호화 도구 사용](#python-example-item-encryptor) 예제와 동일한 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)를 사용합니다. 그러나 하위 수준 [항목 암호화 도구](DDBEC-legacy-concepts.md#item-encryptor)와 직접 상호 작용하는 대신 `EncryptedTable` 클래스를 사용합니다.

이러한 예제를 비교하면 클라이언트 도우미 클래스가 수행하는 작업을 확인할 수 있습니다. 여기에는 [DynamoDB 암호화 컨텍스트](concepts.md#encryption-context)를 생성하거나 프라이머리 키 속성을 항상 서명하되 절대로 암호화되지 않은 상태로 유지하는 등의 작업이 포함됩니다. 암호화 컨텍스트를 만들고 프라이머리 키를 검색하기 위해 클라이언트 헬퍼 클래스는 DynamoDB [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html) 작업을 호출합니다. 이 코드를 실행하려면 이 작업을 호출할 수 있는 권한이 있어야 합니다.

**전체 코드 샘플 보기**: [aws\$1kms\$1encrypted\$1table.py](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_table.py)

1단계: 테이블 만들기  
테이블 이름을 사용하여 표준 DynamoDB 테이블의 인스턴스를 생성하는 것부터 시작합니다.  

```
table_name='test-table'
table = boto3.resource('dynamodb').Table(table_name)
```

2단계: 암호화 자료 공급자 생성  
선택한 [암호화 자료 공급자](crypto-materials-providers.md)(CMP)의 인스턴스를 생성합니다.  
이 예제에서는 [Direct KMS Provider](direct-kms-provider.md)를 사용하지만, 사용자는 모든 호환되는 CMP를 사용할 수 있습니다. Direct KMS Provider를 생성하려면 [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)를 지정합니다. 이 예제에서는의 Amazon 리소스 이름(ARN)을 사용하지 AWS KMS key만 유효한 키 식별자를 사용할 수 있습니다.  

```
kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
```

3단계: 속성 작업 객체 생성  
[속성 작업](DDBEC-legacy-concepts.md#legacy-attribute-actions)은 항목의 각 속성에 대해 수행할 작업을 항목 암호화 도구에 알려줍니다. 이 예제의 `AttributeActions` 객체는 무시되는 `test` 속성을 제외한 모든 항목을 암호화하고 서명합니다.  
클라이언트 도우미 클래스를 사용할 때 프라이머리 키 속성에 대한 속성 작업을 지정하지 않습니다. `EncryptedTable` 클래스는 프라이머리 키 속성을 서명하지만 암호화하지는 않습니다.  

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
    attribute_actions={'test': CryptoAction.DO_NOTHING}
)
```

4단계: 암호화된 테이블 생성  
표준 테이블, Direct KMS Provider 및 속성 작업을 사용하여 암호화된 테이블을 생성합니다. 이 단계로 구성이 완료됩니다.  

```
encrypted_table = EncryptedTable(
    table=table,
    materials_provider=kms_cmp,
    attribute_actions=actions
)
```

5단계: 테이블에 일반 텍스트 항목 넣기  
`encrypted_table`에 대한 `put_item` 방법을 호출하면 테이블 항목이 투명하게 암호화되고 서명되어 DynamoDB 테이블에 추가됩니다.  
먼저 테이블 항목을 정의합니다.  

```
plaintext_item = {
    'partition_attribute': 'value1',
    'sort_attribute': 55
    'example': 'data',
    'numbers': 99,
    'binary': Binary(b'\x00\x01\x02'),
    'test': 'test-value'
}
```
그런 다음 테이블에 넣습니다.  

```
encrypted_table.put_item(Item=plaintext_item)
```

암호화된 형식으로 DynamoDB 테이블에서 항목을 가져오려면 `table` 객체에 대한 `get_item` 방법을 호출합니다. 복호화된 항목을 얻으려면 `encrypted_table` 객체에 대한 `get_item` 메서드를 호출합니다.

## 항목 암호화 도구 사용
<a name="python-example-item-encryptor"></a>

이 예제에서는 테이블 항목을 암호화할 때 항목 암호화 도구와 상호 작용하는 [클라이언트 헬퍼 클래스](python-using.md#python-helpers)를 사용하는 대신 DynamoDB Encryption Client의 [항목 암호화 도구](DDBEC-legacy-concepts.md#item-encryptor)와 직접 상호 작용하는 방법을 보여줍니다.

이 기술을 사용하면 DynamoDB 암호화 컨텍스트와 구성 객체(`CryptoConfig`)를 수동으로 생성합니다. 또한 한 번의 호출로 항목을 암호화하고 별도의 호출로 DynamoDB 테이블에 넣습니다. 이를 통해 `put_item` 호출을 사용자 지정하고 DynamoDB Encryption Client를 사용하여 DynamoDB로 전송되지 않는 구조화된 데이터를 암호화하고 서명할 수 있습니다.

이 예제에서는 [Direct KMS Provider](direct-kms-provider.md)를 사용하지만, 사용자는 모든 호환되는 CMP를 사용할 수 있습니다.

**전체 코드 샘플 보기**: [aws\$1kms\$1encrypted\$1item.py](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_item.py)

1단계: 테이블 만들기  
테이블 이름을 사용하여 표준 DynamoDB 테이블 리소스의 인스턴스를 생성하는 것부터 시작합니다.  

```
table_name='test-table'
table = boto3.resource('dynamodb').Table(table_name)
```

2단계: 암호화 자료 공급자 생성  
선택한 [암호화 자료 공급자](crypto-materials-providers.md)(CMP)의 인스턴스를 생성합니다.  
이 예제에서는 [Direct KMS Provider](direct-kms-provider.md)를 사용하지만, 사용자는 모든 호환되는 CMP를 사용할 수 있습니다. Direct KMS Provider를 생성하려면 [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)를 지정합니다. 이 예제에서는의 Amazon 리소스 이름(ARN)을 사용하지 AWS KMS key만 유효한 키 식별자를 사용할 수 있습니다.  

```
kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
```

3단계: TableInfo 헬퍼 클래스 사용  
DynamoDB에서 테이블에 대한 정보를 얻으려면 [TableInfo](python-using.md#python-helpers) 헬퍼 클래스의 인스턴스를 생성합니다. 항목 암호화 도구로 직접 작업하는 경우 `TableInfo` 인스턴스를 생성하고 해당 메서드를 호출해야 합니다. [클라이언트 헬퍼 클래스](python-using.md#python-helpers)가 사용자를 대신하여 이 작업을 수행합니다.  
`TableInfo`의 `refresh_indexed_attributes` 메소드는 [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html) DynamoDB 작업을 사용하여 테이블에 대한 정확한 정보를 실시간으로 가져옵니다. 여기에는 프라이머리 키와 로컬 및 글로벌 보조 인덱스가 포함됩니다. 호출자에게 `DescribeTable`을 호출할 수 있는 권한이 있어야 합니다.  

```
table_info = TableInfo(name=table_name)
table_info.refresh_indexed_attributes(table.meta.client)
```

4단계: DynamoDB 암호화 컨텍스트 생성  
[DynamoDB 암호화 컨텍스트](concepts.md#encryption-context)에는 테이블 구조와 암호화 및 서명 방법에 대한 정보가 포함되어 있습니다. 이 예제에서는 항목 암호화 도구와 상호 작용하므로 DynamoDB 암호화 컨텍스트를 명시적으로 생성합니다. [클라이언트 헬퍼 클래스](python-using.md#python-helpers)는 DynamoDB 암호화 컨텍스트를 생성합니다.  
[TableInfo](python-using.md#python-helpers) 헬퍼 클래스의 속성을 사용하여 파티션 키와 정렬 키를 가져올 수 있습니다.  

```
index_key = {
    'partition_attribute': 'value1',
    'sort_attribute': 55
}

encryption_context = EncryptionContext(
    table_name=table_name,
    partition_key_name=table_info.primary_index.partition,
    sort_key_name=table_info.primary_index.sort,
    attributes=dict_to_ddb(index_key)
)
```

5단계: 속성 작업 객체 생성  
[속성 작업](DDBEC-legacy-concepts.md#legacy-attribute-actions)은 항목의 각 속성에 대해 수행할 작업을 항목 암호화 도구에 알려줍니다. 이 예제의 `AttributeActions` 객체는 서명되었지만 암호화되지 않은 프라이머리 키 속성과 무시되는 `test` 속성을 제외한 모든 항목을 암호화하고 서명합니다.  
항목 암호화 도구와 직접 상호작용하고 기본 작업이 `ENCRYPT_AND_SIGN`인 경우 프라이머리 키에 대한 대체 작업을 지정해야 합니다. 프라이머리 키에 대한 `SIGN_ONLY`을 사용하거나 기본 작업인 경우 `DO_NOTHING`을 사용하는 `set_index_keys` 메서드를 사용할 수 있습니다.  
프라이머리 키를 지정하기 위해 이 예제에서는 DynamoDB 호출로 채워지는 [TableInfo](python-using.md#python-helpers) 객체의 인덱스 키를 사용합니다. 이 기술은 프라이머리 키 이름을 하드 코딩하는 것보다 안전합니다.  

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
    attribute_actions={'test': CryptoAction.DO_NOTHING}
)
actions.set_index_keys(*table_info.protected_index_keys())
```

6단계: 항목에 대한 구성 만들기  
DynamoDB Encryption Client를 구성하려면 테이블 항목에 대한 [CryptoConfig](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/config.html) 구성에서 방금 생성한 객체를 사용합니다. 클라이언트 헬퍼 클래스는 사용자를 위해 CryptoConfig를 만듭니다.  

```
crypto_config = CryptoConfig(
    materials_provider=kms_cmp,
    encryption_context=encryption_context,
    attribute_actions=actions
)
```

7단계: 항목 암호화  
이 단계에서는 항목을 암호화하고 서명하지만 DynamoDB 테이블에 저장하지는 않습니다.  
클라이언트 헬퍼 클래스를 사용할 경우 항목이 사용자 모르게 암호화 및 서명된 다음, 사용자가 헬퍼 클래스의 `put_item` 메서드를 호출할 때 DynamoDB 테이블에 추가됩니다. 항목 암호화 도구를 직접 사용하는 경우 암호화 및 입력 작업은 독립적입니다.  
먼저 일반 텍스트 항목을 만듭니다.  

```
plaintext_item = {
    'partition_attribute': 'value1',
    'sort_key': 55,
    'example': 'data',
    'numbers': 99,
    'binary': Binary(b'\x00\x01\x02'),
    'test': 'test-value'
}
```
그런 다음 암호화하고 서명합니다. `encrypt_python_item` 방법에는 `CryptoConfig` 구성 객체가 필요합니다.  

```
encrypted_item = encrypt_python_item(plaintext_item, crypto_config)
```

8단계: 테이블에 항목 넣기  
이 단계에서는 암호화되고 서명된 항목을 DynamoDB 테이블에 넣습니다.  

```
table.put_item(Item=encrypted_item)
```

암호화된 항목을 보려면 `encrypted_table` 객체 대신 원본 `table` 객체에 대한 `get_item` 방법을 호출합니다. 항목을 확인 및 복호화하지 않고 DynamoDB 테이블에서 항목을 가져옵니다.

```
encrypted_item = table.get_item(Key=partition_key)['Item']
```

다음 이미지는 암호화되고 서명된 테이블 항목 예제의 일부를 보여줍니다.

암호화된 속성 값은 이진 데이터입니다. 프라이머리 키 속성(`partition_attribute` 및 `sort_attribute`)의 이름과 값 및 `test` 속성은 일반 텍스트로 유지됩니다. 이 출력은 서명(`*amzn-ddb-map-sig*`)을 포함하는 속성과 [자료 설명 속성](DDBEC-legacy-concepts.md#legacy-material-description)(`*amzn-ddb-map-desc*`)을 보여줍니다.

![\[암호화 및 서명된 항목(발췌)\]](http://docs.aws.amazon.com/ko_kr/database-encryption-sdk/latest/devguide/images/encrypted-item-closeup.png)
