

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

# AWS SDK for PHP 버전 3의 Amazon S3 클라이언트 측 암호화
<a name="s3-encryption-client"></a>

클라이언트 측 암호화를 사용하여 사용자 환경에서 직접 데이터를 암호화 및 암호화 해제합니다. 즉, 이 데이터를 Amazon S3에 전송하기 이전에 암호화하므로 암호화 처리를 위해 외부 서비스를 이용할 필요가 없습니다. 새로운 구현의 경우 `S3EncryptionClientV3` 및와 더 이상 사용되지 않는 `S3EncryptionClientV2` `S3EncryptionMultipartUploaderV2` 및에 `S3EncryptionMultipartUploaderV3` 대해 `S3EncryptionClient` 및를 사용하는 것이 좋습니다`S3EncryptionMultipartUploader`. 더 이상 사용되지 않는 버전을 계속 사용하고 있는 이전 구현에서는 마이그레이션을 시도하는 것이 좋습니다. `S3EncryptionClientV3`는 `S3EncryptionClient` 레거시를 사용하여 암호화된 데이터의 암호 해독에 대한 지원을 유지합니다.

는 [봉투 암호화](https://docs.aws.amazon.com/kms/latest/developerguide/workflow.html)를 AWS SDK for PHP 구현하고 암호화 및 복호화에 [OpenSSL](https://www.openssl.org/)을 사용합니다. 구현은 [지원하는 기능이 일치하는 다른 SDK](https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html)와 상호 연동이 가능합니다. [SDK의 promise 기반 비동기 워크플로](guide_promises.md)와도 호환됩니다.

## 마이그레이션 가이드
<a name="migration-guide"></a>

더 이상 사용되지 않는 클라이언트에서 새 클라이언트로 마이그레이션하려는 사용자를 위해 [v](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-encryption-migration-v1-v2-section.html)1에서 v2로 마이그레이션하는 마이그레이션 가이드와 v2에서 v3로 마이그레이션하는 마이그레이션 가이드가 [있습니다](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-encryption-migration-v2-v3-section.html).

## 설정
<a name="setup"></a>

클라이언트 측 암호화를 시작하려면 다음이 필요합니다.
+ [AWS KMS 암호화 키](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) 
+ [S3 버킷](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html) 

예제 코드를 실행하기 전에 AWS 자격 증명을 구성합니다. [AWS SDK for PHP 버전 3의 자격 증명을 참조하세요](guide_credentials.md).

## 암호화(Encryption)
<a name="encryption"></a>

에 암호화된 객체를 업로드하면 표준 파라미터 외에 4개의 추가 `PutObject` 파라미터가 `S3EncryptionClientV3` 사용됩니다.
+  `'@KmsEncryptionContext'`는 암호화된 객체에 추가 보안 계층을 추가하는 데 사용할 수 있는 키-값 쌍입니다. 암호화 클라이언트는 동일한 키를 전달해야 하며, 이 키는 get 호출 시 자동으로 전달됩니다. 추가 컨텍스트가 필요하지 않은 경우 빈 배열을 전달하세요.
+  `@CipherOptions`는 사용할 암호와 키 크기를 포함한 암호화를 위한 추가 구성입니다.
+  `@MaterialsProvider`는 암호 키 및 초기화 벡터 생성과 암호 키 암호화를 처리할 뿐만 아니라 암호 키를 암호화는 공급자입니다.
+  `@CommitmentPolicy`는 키 커밋 또는 키 커밋 없이 객체를 읽는 방법과 키 커밋 또는 키 커밋 없이 객체를 쓰는 방법을 지정하는 정책 옵션입니다.

```
use Aws\S3\S3Client;
use Aws\S3\Crypto\S3EncryptionClientV3;
use Aws\Kms\KmsClient;
use Aws\Crypto\KmsMaterialsProviderV3;

 // Let's construct our S3EncryptionClient using an S3Client
 $encryptionClient = new S3EncryptionClientV3(
     new S3Client([
         'profile' => 'default',
         'region' => 'us-east-1',
         'version' => 'latest',
     ])
 );

 $kmsKeyId = 'kms-key-id';
 $materialsProvider = new KmsMaterialsProviderV3(
     new KmsClient([
         'profile' => 'default',
         'region' => 'us-east-1',
         'version' => 'latest',
     ]),
     $kmsKeyId
 );

 $bucket = 'the-bucket-name';
 $key = 'the-file-name';
 $cipherOptions = [
     'Cipher' => 'gcm',
     'KeySize' => 256,
     // Additional configuration options
 ];

 $result = $encryptionClient->putObject([
     '@MaterialsProvider' => $materialsProvider,
     '@CipherOptions' => $cipherOptions,
     '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
     '@KmsEncryptionContext' => ['context-key' => 'context-value'],
     'Bucket' => $bucket,
     'Key' => $key,
     'Body' => fopen('file-to-encrypt.txt', 'r'),
 ]);
```

**참고**  
Amazon S3 및 AWS KMS기반 서비스 오류 외에도가 올바르게 구성되지 않은 경우 `InvalidArgumentException` 객체가 발생할 수 `'@CipherOptions'` 있습니다.

## 해독
<a name="decryption"></a>

객체 다운로드 및 복호화에는 표준 파라미터 외에도 5개의 추가 `GetObject` 파라미터가 있으며,이 중 2개가 필요합니다. 클라이언트는 기본 암호 옵션을 자동으로 검색합니다.
+   
** `'@SecurityProfile'`: 'V3'로 설정된 경우 V3-compatible으로 암호화된 객체만**  
형식을 해독할 수 있습니다. 이 파라미터를 'V3\$1AND\$1LEGACY'로 설정하면 V1-compatible 형식으로 암호화된 객체도 해독할 수 있습니다. 마이그레이션을 지원하려면 @SecurityProfile을 'V3\$1AND\$1LEGACY'로 설정합니다. 새 애플리케이션 개발에만 'V3'를 사용합니다.
+   
** `'@MaterialsProvider'`는 다음과 같이 암호 키 및 초기화 벡터 생성을 처리하는 공급자입니다.**  
암호 키 암호화도 마찬가지입니다.
+   
** `'@KmsAllowDecryptWithAnyCmk'`: (선택 사항) 이 매개변수를 true로 설정하면 복호화가 활성화됩니다.**  
MaterialsProvider의 생성자에 KMS 키 ID를 제공하지 않아도 됩니다. 기본값은 false입니다.
+   
** `'@CipherOptions'`(선택 사항)은 다음을 포함한 암호화를 위한 추가 구성입니다.**  
사용할 암호 및 키 크기.
+   
** `@CommitmentPolicy`를 사용하여 객체를 읽는 방법을 지정하는 정책 옵션 **  
키 커밋 또는 키 커밋 없음 및 키 커밋 또는 키 커밋 없이 객체를 작성하는 방법.

```
$result = $encryptionClient->getObject([
    '@KmsAllowDecryptWithAnyCmk' => true,
    '@SecurityProfile' => 'V2_AND_LEGACY',
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT',
    '@MaterialsProvider' => $materialsProvider,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
]);
```

**참고**  
Amazon S3 및 AWS KMS기반 서비스 오류 외에도가 올바르게 구성되지 않은 경우 `InvalidArgumentException` 객체가 발생할 수 `'@CipherOptions'` 있습니다.

## 암호 구성
<a name="cipher-configuration"></a>

** `'Cipher'`(문자열)**  
암호화 중에 암호화 클라이언트에서 사용되는 암호 메서드입니다. 현재는 'gcm'만 지원됩니다.

**중요**  
PHP는 GCM 암호화를 위해 OpenSSL을 사용하여 [암호화](http://php.net/manual/en/function.openssl-encrypt.php) 및 [해독](http://php.net/manual/en/function.openssl-decrypt.php)하는 데 필요한 추가 매개변수를 포함하도록 [버전 7.1로 업데이됩니다](http://php.net/manual/en/migration71.new-features.php). PHP 버전 7.0 및 이전 버전의 경우 GCM 지원을 위한 폴리필이 제공되어 암호화 클라이언트 `S3EncryptionClientV2` 및 `S3EncryptionMultipartUploaderV2`에서 사용됩니다. 그러나 대규모 입력의 경우 폴리필을 사용하면 PHP 7.1\$1의 기본 구현을 사용하는 것보다 성능이 훨씬 느려지므로 효과적으로 사용하려면 이전 PHP 버전 환경을 업그레이드해야 할 수 있습니다.

** `'KeySize'` (int)**  
암호화를 위해 생성할 콘텐츠 암호화 키의 길이입니다. 기본값은 256비트입니다. 유효한 구성 옵션은 256비트입니다.

** `'Aad'`(문자열)**  
암호화된 페이로드와 함께 포함할 선택적 '추가 인증 데이터'입니다. 이 정보는 암호화를 풀 때 확인됩니다. `Aad`는 'gcm' 암호를 사용할 경우에만 사용할 수 있습니다.

**중요**  
추가 인증 데이터는 모든 AWS SDKs에서 지원되지 않으므로 다른 SDKs는이 파라미터를 사용하여 암호화된 파일을 해독하지 못할 수 있습니다.

## 메타데이터 전략
<a name="metadata-strategies"></a>

`Aws\Crypto\MetadataStrategyInterface`를 구현하는 클래스의 인스턴스를 제공할 수도 있습니다. 이 간단한 인터페이스는 봉투 암호화 자료를 포함하는 `Aws\Crypto\MetadataEnvelope`의 저장 및 로드를 처리합니다. SDK는 이를 구현하는 `Aws\S3\Crypto\HeadersMetadataStrategy` 및 `Aws\S3\Crypto\InstructionFileMetadataStrategy` 클래스를 제공합니다. 기본적으로 `HeadersMetadataStrategy`가 사용됩니다.

```
$strategy = new InstructionFileMetadataStrategy(
    $s3Client
);

$encryptionClient->putObject([
    '@MaterialsProvider' => $materialsProvider,
    '@MetadataStrategy' => $strategy,
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
    '@KmsEncryptionContext' => [],
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
    'Body' => fopen('file-to-encrypt.txt', 'r'),
]);

$result = $encryptionClient->getObject([
    '@KmsAllowDecryptWithAnyCmk' => false,
    '@MaterialsProvider' => $materialsProvider,
    '@SecurityProfile' => 'V3',
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
    '@MetadataStrategy' => $strategy,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
]);
```

`HeadersMetadataStrategy` 및 `InstructionFileMetadataStrategy`의 클래스 이름 상수는 *::class *를 호출하여 제공할 수도 있습니다.

```
$result = $encryptionClient->putObject([
    '@MaterialsProvider' => $materialsProvider,
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
    '@MetadataStrategy' => HeadersMetadataStrategy::class,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
    'Body' => fopen('file-to-encrypt.txt', 'r'),
]);
```

**참고**  
지침 파일을 업로드한 이후에 오류가 발생하는 경우 지침 파일이 자동으로 삭제됩니다.

## 멀티파트 업로드
<a name="multipart-uploads"></a>

클라이언트 측 암호화를 사용하여 멀티파트 업로드를 수행할 수도 있습니다. `Aws\S3\Crypto\S3EncryptionMultipartUploaderV3`는 업로드 전에 암호화를 위해 소스 스트림을 준비합니다. `Aws\S3\MultipartUploader` 및 `Aws\S3\Crypto\S3EncryptionClientV3`를 사용할 때와 비슷한 방식으로 생성합니다. `S3EncryptionMultipartUploaderV3`는 `'@MetadataStrategy'`와 동일한 `S3EncryptionClientV3` 옵션과 모든 사용 가능한 `'@CipherOptions'` 구성을 처리할 수 있습니다.

```
$kmsKeyId = 'kms-key-id';
$materialsProvider = new KmsMaterialsProviderV3(
    new KmsClient([
        'region' => 'us-east-1',
        'version' => 'latest',
        'profile' => 'default',
    ]),
    $kmsKeyId
);

$bucket = 'the-bucket-name';
$key = 'the-upload-key';
$cipherOptions = [
    'Cipher' => 'gcm'
    'KeySize' => 256,
    // Additional configuration options
];

$multipartUploader = new S3EncryptionMultipartUploaderV3(
    new S3Client([
        'region' => 'us-east-1',
        'version' => 'latest',
        'profile' => 'default',
    ]),
    fopen('large-file-to-encrypt.txt', 'r'),
    [
        '@MaterialsProvider' => $materialsProvider,
        '@CipherOptions' => $cipherOptions,
        '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
        'bucket' => $bucket,
        'key' => $key,
    ]
);
$multipartUploader->upload();
```

**참고**  
Amazon S3 및 AWS KMS기반 서비스 오류 외에도가 올바르게 구성되지 않은 경우 `InvalidArgumentException` 객체가 발생할 수 `'@CipherOptions'` 있습니다.