

버전 4(V4) AWS SDK for .NET 가 릴리스되었습니다.

변경 사항 해제 및 애플리케이션 마이그레이션에 대한 자세한 내용은 [마이그레이션 주제를](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html) 참조하세요.

 [https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)

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

# S3 암호화 클라이언트 마이그레이션(V1에서 V2로)
<a name="s3-encryption-migration-v1-v2"></a>

**참고**  
V2를 사용 중이고 V4로 마이그레이션하려면 섹션을 참조하세요[S3 암호화 클라이언트 마이그레이션(V2에서 V4로)](s3-encryption-migration-v2-v4.md).

이 주제에서는 Amazon Simple Storage Service(S3) 암호화 클라이언트 버전 1(V1)에서 버전 2(V2)로 애플리케이션을 마이그레이션하고 마이그레이션 프로세스 전반에 걸쳐 애플리케이션 가용성을 보장하는 방법을 보여줍니다.

V2 클라이언트로 암호화된 객체는 V1 클라이언트로 해독할 수 없습니다. 모든 객체를 한 번에 다시 암호화할 필요 없이 새 클라이언트로 쉽게 마이그레이션할 수 있도록 "V1-transitional" 클라이언트가 제공되었습니다. 이 클라이언트는 V1과 V2로 암호화된 객체를 모두 *해독*할 수 있지만 V1 호환 형식으로만 객체를 *암호화*합니다. V2 클라이언트는 V1과 V2로 암호화된 객체를 모두 *해독*할 수 있지만(V1 객체에 대해 활성화된 경우) V2 호환 형식으로만 객체를 *암호화*합니다.

## 마이그레이션 개요
<a name="s3-encryption-migration-v1-v2-overview"></a>

이 마이그레이션은 다음 세 단계로 진행됩니다. 이 단계는 여기에 소개되고 다음에 자세히 설명되어 있습니다. 다음 단계가 시작되기 전에 공유 객체를 사용하는 *모든* 클라이언트에 대해 각 단계를 완료해야 합니다.

1. **새 형식을 읽으려면 기존 클라이언트를 V1 전환 클라이언트로 업데이트하십시오.** 먼저 V1 클라이언트 대신 V1 전환 클라이언트에 종속되도록 애플리케이션을 업데이트합니다. V1 전환 클라이언트를 사용하면 새 V2 클라이언트가 작성한 객체와 V1 호환 형식으로 작성된 객체를 기존 코드에서 해독할 수 있습니다.
**참고**  
V1 전환 클라이언트는 마이그레이션 목적으로만 제공됩니다. V1 전환 클라이언트로 이동한 후 V2 클라이언트로 업그레이드를 진행합니다.

1. **V1 전환 클라이언트를 V2 클라이언트로 마이그레이션하여 새 형식을 작성하십시오.** 다음으로, 애플리케이션의 모든 V1 전환 클라이언트를 V2 클라이언트로 교체하고 보안 프로필을 `V2AndLegacy`로 설정합니다. V2 클라이언트에서 이 보안 프로필을 설정하면 해당 클라이언트가 V1 호환 형식으로 암호화된 객체를 해독할 수 있습니다.

1. **V1 형식을 더 이상 읽지 않도록 V2 클라이언트를 업데이트하십시오.** 마지막으로 모든 클라이언트를 V2로 마이그레이션하고 모든 객체를 V2 호환 형식으로 암호화하거나 다시 암호화한 후에는 V2 보안 프로필을 `V2AndLegacy` 대신 `V2`로 설정합니다. 이렇게 하면 V1 호환 형식의 객체를 해독할 수 없습니다.

## 새 형식을 읽으려면 기존 클라이언트를 V1 전환 클라이언트로 업데이트
<a name="s3-encryption-migration-v1-v2-to-v1n"></a>

V2 암호화 클라이언트는 이전 버전의 클라이언트에서 지원하지 않는 암호화 알고리즘을 사용합니다. 마이그레이션의 첫 번째 단계는 새로운 형식을 읽을 수 있도록 V1 암호 해독 클라이언트를 업데이트하는 것입니다.

V1 전환 클라이언트를 사용하면 애플리케이션이 V1 및 V2로 암호화된 객체를 모두 해독할 수 있습니다. 이 클라이언트는 [Amazon.Extensions.S3.Encryption](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) NuGet 패키지의 일부입니다. V1 전환 클라이언트를 사용하려면 각 애플리케이션에서 다음 단계를 수행하세요.

1. [Amazon.Extensions.S3.Encryption](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) 패키지에 대한 새로운 종속성을 구축합니다. 프로젝트가 **AWSSDK.S3** 또는 **AWSSDK.KeyManagementService** 패키지에 직접 의존하는 경우 이러한 종속성을 업데이트하거나 제거하여 업데이트된 버전을 이 새 패키지와 함께 가져오도록 해야 합니다.

1. 다음과 같이 적절한 `using` 문을 `Amazon.S3.Encryption`에서 `Amazon.Extensions.S3.Encryption`으로 변경합니다.

   ```
   // using Amazon.S3.Encryption;
     using Amazon.Extensions.S3.Encryption;
   ```

1. 애플리케이션을 다시 빌드하고 다시 배포합니다.

V1 전환 클라이언트는 V1 클라이언트와 완전히 API 호환되므로 다른 코드 변경이 필요하지 않습니다.

## V1 전환 클라이언트를 V2 클라이언트로 마이그레이션하여 새 형식 작성
<a name="s3-encryption-migration-v1-v2-v1n-to-v2"></a>

V2 클라이언트는 [Amazon.Extensions.S3.Encryption](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) NuGet 패키지의 일부입니다. 이를 통해 애플리케이션은 V1 및 V2로 암호화된 객체(그렇게 구성된 경우)를 모두 해독할 수 있지만 객체는 V2 호환 형식으로만 암호화합니다.

새 암호화 형식을 읽도록 기존 클라이언트를 업데이트한 후 애플리케이션을 V2 암호화 및 복호화 클라이언트로 안전하게 업데이트를 진행할 수 있습니다. V2 클라이언트를 사용하려면 각 애플리케이션에서 다음 단계를 수행하세요.

1. `EncryptionMaterials`를 `EncryptionMaterialsV2`로 변경합니다.

   1. KMS를 사용하는 경우:

      1. KMS 키 ID를 제공합니다.

      1. 사용 중인 암호화 방법, 즉, `KmsType.KmsContext`를 선언합니다.

      1. 이 데이터 키와 연결할 암호화 컨텍스트를 KMS에 제공합니다. 빈 딕셔너리를 보낼 수 있지만(Amazon 암호화 컨텍스트는 계속 병합됨) 추가 컨텍스트를 제공하는 것이 좋습니다.

   1. 사용자 제공 키 랩 방법(대칭 또는 비대칭 암호화)을 사용하는 경우:

      1. 암호화 자료가 포함된 `AES` 또는 `RSA` 인스턴스를 제공합니다.

      1. 사용할 암호화 알고리즘, 즉, `SymmetricAlgorithmType.AesGcm` 또는 `AsymmetricAlgorithmType.RsaOaepSha1`를 선언합니다.

1. `SecurityProfile` 속성을 `SecurityProfile.V2AndLegacy`로 설정하여 `AmazonS3CryptoConfiguration`을 `AmazonS3CryptoConfigurationV2`로 변경합니다.

1. `AmazonS3EncryptionClient`를 `AmazonS3EncryptionClientV2`로 변경합니다. 이 클라이언트는 이전 단계에서 새로 변환된 `AmazonS3CryptoConfigurationV2` 및 `EncryptionMaterialsV2` 객체를 가져옵니다.

### 예: KMS에서 KMS\$1컨텍스트로
<a name="s3-encryption-migration-v1-v2-ex-kms"></a>

**사전 마이그레이션**

```
using System.Security.Cryptography;
using Amazon.S3.Encryption;

var encryptionMaterial = new EncryptionMaterials("1234abcd-12ab-34cd-56ef-1234567890ab");
var configuration = new AmazonS3CryptoConfiguration()
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);
```

**마이그레이션 후**

```
using System.Security.Cryptography;
using Amazon.Extensions.S3.Encryption;
using Amazon.Extensions.S3.Encryption.Primitives;

var encryptionContext = new Dictionary<string, string>();
var encryptionMaterial = new EncryptionMaterialsV2("1234abcd-12ab-34cd-56ef-1234567890ab", KmsType.KmsContext, encryptionContext);
var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy)
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);
```

### 예: 대칭 알고리즘(AES-CBC에서 AES-GCM 키 랩으로)
<a name="s3-encryption-migration-v1-v2-ex-aes"></a>

`StorageMode`는 `ObjectMetadata` 또는 `InstructionFile`일 수 있습니다.

**사전 마이그레이션**

```
using System.Security.Cryptography;
using Amazon.S3.Encryption;

var symmetricAlgorithm = Aes.Create();
var encryptionMaterial = new EncryptionMaterials(symmetricAlgorithm);
var configuration = new AmazonS3CryptoConfiguration()
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);
```

**마이그레이션 후**

```
using System.Security.Cryptography;
using Amazon.Extensions.S3.Encryption;
using Amazon.Extensions.S3.Encryption.Primitives;

var symmetricAlgorithm = Aes.Create();
var encryptionMaterial = new EncryptionMaterialsV2(symmetricAlgorithm, SymmetricAlgorithmType.AesGcm);
var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy)
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);
```

**참고**  
AES-GCM으로 해독할 때는 해독된 데이터를 사용하기 전에 전체 객체를 끝까지 읽습니다. 이는 암호화되었던 객체이므로 객체가 수정되지 않았는지 확인하기 위함입니다.

### 예: 비대칭 알고리즘(RSA에서 RSA-OAEP-SHA1 키 랩으로)
<a name="s3-encryption-migration-v1-v2-ex-rsa"></a>

`StorageMode`는 `ObjectMetadata` 또는 `InstructionFile`일 수 있습니다.

**사전 마이그레이션**

```
using System.Security.Cryptography;
using Amazon.S3.Encryption;

var asymmetricAlgorithm = RSA.Create();
var encryptionMaterial = new EncryptionMaterials(asymmetricAlgorithm);
var configuration = new AmazonS3CryptoConfiguration()
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);
```

**마이그레이션 후**

```
using System.Security.Cryptography;
using Amazon.Extensions.S3.Encryption;
using Amazon.Extensions.S3.Encryption.Primitives;

var asymmetricAlgorithm = RSA.Create();
var encryptionMaterial = new EncryptionMaterialsV2(asymmetricAlgorithm, AsymmetricAlgorithmType.RsaOaepSha1);
var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy)
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);
```

## V1 형식을 더 이상 읽지 않도록 V2 클라이언트 업데이트
<a name="s3-encryption-migration-v1-v2-v2-cleanup"></a>

결국에는 모든 객체가 V2 클라이언트를 사용하여 암호화되거나 다시 암호화됩니다. *변환이 완료되면* 다음 코드 조각에 표시된 것처럼 `SecurityProfile` 속성을 `SecurityProfile.V2`로 설정하여 V2 클라이언트에서 V1 호환성을 비활성화할 수 있습니다.

```
//var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy);
var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2);
```