

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

# DynamoDB Encryption Client for Python
<a name="python"></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 Pytho를 설치하고 사용하는 방법을 설명합니다. 시작하는 데 도움이 되는 전체 및 테스트된 [샘플 코드](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples)를 포함하여 GitHub의 [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/) 리포지토리에서 코드를 찾을 수 있습니다.

**참고**  
DynamoDB Encryption Client for Python의 버전 1.*x*.*x* 및 2.*x*.*x*는 2022년 7월부터 [지원 종료 단계](what-is-database-encryption-sdk.md#support)에 있습니다. 가능한 한 빨리 최신 버전으로 업그레이드하세요.

**Topics**
+ [사전 조건](#python-prerequisites)
+ [설치](#python-installation)
+ [DynamoDB Encryption Client for Python 사용](python-using.md)
+ [Python 예제](python-examples.md)

## 사전 조건
<a name="python-prerequisites"></a>

Amazon DynamoDB Encryption Client for Python를 설치하기 전에 다음 사전 조건이 충족되었는지 확인합니다.

**지원되는 Python 버전**  
Amazon DynamoDB Encryption Client for Python 버전 3.3.0 이상에는 Python 3.8 이상이 필요합니다. Python을 다운로드하려면 [Python 다운로드](https://www.python.org/downloads/)를 참조하세요.  
이전 버전의 Amazon DynamoDB Encryption Client for Python는 Python 2.7 및 Python 3.4 이상을 지원하지만 최신 버전의 DynamoDB Encryption Client를 사용하는 것이 좋습니다.

**Python용 pip 설치 도구**  
Python 3.6 이상에는 **pip**가 포함되어 있지만 업그레이드가 필요할 수도 있습니다. pip 업그레이드 또는 설치에 대한 자세한 내용은 **pip** 설명서의 [설치](https://pip.pypa.io/en/latest/installation/)를 참조하세요.

## 설치
<a name="python-installation"></a>

다음 예제와 같이 **pip**를 사용하여 Amazon DynamoDB Encryption Client for Python를 설치합니다.

**최신 버전 설치**  

```
pip install dynamodb-encryption-sdk
```

**pip**를 사용하여 패키지를 설치 및 업그레이드하는 방법에 대한 자세한 내용은 [패키지 설치](https://packaging.python.org/tutorials/installing-packages/)를 참조하십시오.

DynamoDB Encryption Client에는 모든 플랫폼에 [암호화 라이브러리](https://cryptography.io/en/latest/)가 필요합니다. 모든 버전의 **pip**는 Windows에 **암호화** 라이브러리를 설치하고 빌드합니다. **pip** 8.1 이상은 Linux에 **암호화**를 설치하고 구축합니다. 이전 버전의 **pip**를 사용 중이고 Linux 환경에 **암호**화 라이브러리를 빌드하는 데 필요한 도구가 없는 경우 해당 도구를 설치해야 합니다. 자세한 내용은 [Linux에서 암호화 빌드](https://cryptography.io/en/latest/installation/#building-cryptography-on-linux)를 참조하세요.

GitHub의 [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/) 리포지토리에서 DynamoDB Encryption Client의 최신 개발 버전을 얻을 수 있습니다.

DynamoDB Encryption Client를 설치한 후 이 가이드의 Python 코드 예제를 살펴보고 시작하세요.

# DynamoDB Encryption Client for Python 사용
<a name="python-using"></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 Encryption Client를 더 쉽게 사용할 수 있도록 설계되었습니다. 특별한 사용 사례가 아니라면 이를 사용하는 것이 좋습니다.

DynamoDB Encryption Client를 사용한 프로그래밍에 대한 자세한 내용은 이 가이드의 [Python 예제](python-examples.md), GitHub의 ws-dynamodb-encryption-pytho 리포지토리의 [예제](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples) 및 DynamoDB Encryption Client에 대한 [Python 설명서](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/)를 참조하세요.

**Topics**
+ [클라이언트 헬퍼 클래스](#python-helpers)
+ [TableInfo 클래스](#table-info)
+ [Python의 속성 작업](#python-attribute-actions)

## 클라이언트 헬퍼 클래스
<a name="python-helpers"></a>

DynamoDB Encryption Client for Python에는 DynamoDB용 Boto 3 클래스를 미러링하는 여러 클라이언트 헬퍼 클래스가 포함되어 있습니다. 이러한 헬퍼 클래스는 다음과 같이 기존 DynamoDB 애플리케이션에 암호화 및 서명을 더 쉽게 추가하고 가장 일반적인 문제를 방지할 수 있도록 설계되었습니다.
+ 기본 키에 대한 재정의 작업을 [AttributeActions](#python-attribute-actions) 객체에 추가하거나 `AttributeActions` 객체가 기본 키를 암호화하도록 클라이언트에 명시적으로 지시하는 경우 예외를 발생시키는 방식으로 항목에서 기본 키를 암호화하지 못하도록 합니다. `AttributeActions` 객체의 기본 작업이 `DO_NOTHING`이면 클라이언트 헬퍼 클래스는 프라이머리 키에 대해 해당 작업을 사용합니다. 그렇지 않으면 `SIGN_ONLY`를 사용합니다.
+ [TableInfo 객체](#python-helpers)를 생성하고 DynamoDB 호출을 기반으로 [DynamoDB 암호화 컨텍스트](concepts.md#encryption-context)를 채웁니다. 이는 DynamoDB 암호화 컨텍스트가 정확하고 클라이언트가 프라이머리 키를 식별할 수 있도록 하는 데 도움이 됩니다.
+ 테이블에 쓰거나 읽어올 때 사용자 모르게 테이블 항목을 암호화 및 복호화하는 `put_item` 및 `get_item`와 같은 방법을 지원합니다. `update_item` 메소드만 지원되지 않습니다.

하위 수준의 [항목 암호화 도구](DDBEC-legacy-concepts.md#item-encryptor)를 사용하여 직접 상호 작용하는 대신에 클라이언트 헬퍼 클래스를 사용할 수 있습니다. 항목 암호화 도구에서 고급 옵션을 설정해야 하는 경우가 아니면 이 클래스를 사용합니다.

클라이언트 헬퍼 클래스에는 다음이 포함됩니다.
+ DynamoDB의 [테이블](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#table) 리소스를 사용하여 한 번에 하나의 테이블을 처리하는 애플리케이션을 위한 [EncryptedTable](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/table.html#module-dynamodb_encryption_sdk.encrypted.table).
+ 일괄 처리를 위해 DynamoDB의 [서비스 리소스](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#service-resource) 클래스를 사용하는 애플리케이션을 위한 [EncryptedResource](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/resource.html).
+ DynamoDB에서 [하위 수준 클라이언트](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#client)를 사용하는 애플리케이션을 위한 [EncryptedClient](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/client.html).

클라이언트 헬퍼 클래스를 사용하려면 호출자에게 대상 테이블에서 DynamoDB [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html) 작업을 호출할 수 있는 권한이 있어야 합니다.

## TableInfo 클래스
<a name="table-info"></a>

[TableInfo](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/tools/structures.html#dynamodb_encryption_sdk.structures.TableInfo) 클래스는 프라이머리 키 및 보조 인덱스에 대한 필드가 포함된 DynamoDB 테이블을 나타내는 헬퍼 클래스입니다. 테이블에 대한 정확한 실시간 정보를 얻는 데 도움이 됩니다.

[클라이언트 헬퍼 클래스](#python-helpers)를 사용하는 경우 이 클래스에서 사용자를 대신하여 `TableInfo` 객체를 만들고 사용합니다. 그렇지 않으면 명시적으로 생성할 수 있습니다. 예제는 [항목 암호화 도구 사용](python-examples.md#python-example-item-encryptor) 섹션을 참조하세요.

`TableInfo` 객체에 대해 `refresh_indexed_attributes` 방법을 호출하면 DynamoDB [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html) 작업을 호출하여 객체의 속성 값이 채워집니다. 테이블 쿼리는 하드 코딩된 인덱스 이름보다 훨씬 더 안정적입니다. `TableInfo` 클래스에는 [DynamoDB 암호화 컨텍스트](concepts.md#encryption-context)에 필요한 값을 제공하는 `encryption_context_values` 속성도 포함되어 있습니다.

`refresh_indexed_attributes` 방법을 사용하려면 호출자에게 대상 테이블에서 DynamoDB [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html) 작업을 호출할 수 있는 권한이 있어야 합니다.

## Python의 속성 작업
<a name="python-attribute-actions"></a>

[속성 작업](DDBEC-legacy-concepts.md#legacy-attribute-actions)은 항목의 각 속성에 대해 수행할 작업을 항목 암호화 도구에 알려줍니다. Python에서 속성 작업을 지정하려면 기본 작업과 특정 속성에 대한 예외가 포함된 `AttributeActions` 객체를 만듭니다. 유효한 값은 `CryptoAction` 열거 유형에 정의됩니다.

**중요**  
속성 작업을 사용하여 테이블 항목을 암호화한 후 데이터 모델에서 속성을 추가하거나 제거하면 서명 검증 오류가 발생하여 데이터를 복호화하지 못할 수 있습니다. 자세한 내용은 [데이터 모델 변경](data-model.md) 단원을 참조하십시오.

```
DO_NOTHING = 0
SIGN_ONLY = 1
ENCRYPT_AND_SIGN = 2
```

예를 들어, 이 `AttributeActions` 객체는 모든 속성에 대한 기본값을 `ENCRYPT_AND_SIGN`으로 설정하고 `ISBN` 및 `PublicationYear` 속성에 대한 예외를 지정합니다.

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

[클라이언트 헬퍼 클래스](#python-helpers)를 사용하는 경우 기본 키 속성에 대한 속성 작업을 지정할 필요가 없습니다. 클라이언트 헬퍼 클래스는 프라이머리 키를 암호화하는 것을 방지합니다.

클라이언트 헬퍼 클래스를 사용하지 않고 프라이머리 작업이`ENCRYPT_AND_SIGN` 인 경우 프라이머리 키에 대한 작업을 지정해야 합니다. 프라이머리 키에 대한 권장 조치는 `SIGN_ONLY`입니다. 이를 쉽게 하려면 프라이머리 키에 SIGN\$1ONLY를 사용하거나 기본 작업인 경우 DO\$1NOTHING을 사용하는 `set_index_keys` 방법을 사용합니다.

**주의**  
기본 키 속성은 암호화하지 마십시오. 일반 텍스트로 남겨 두어야 DynamoDB에서 전체 테이블 스캔을 실행하지 않고 해당 항목을 찾을 수 있습니다.

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
)
actions.set_index_keys(*table_info.protected_index_keys())
```

# 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)
