

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

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

**참고**  
S3 암호화 클라이언트의 V1을 사용하는 경우 V3로 마이그레이션하기 전에 먼저 V2로 마이그레이션해야 합니다. V3 V1에서 V2로 마이그레이션하는 방법에 대한 지침은 [Amazon S3 암호화 클라이언트 마이그레이션(V1에서 V2로)](s3-encryption-migration-v1-v2.md) 섹션을 참조하세요.

이 주제에서는 Amazon Simple Storage Service(Amazon S3) 암호화 클라이언트 버전 2(V2)에서 버전 3(V3)으로 애플리케이션을 마이그레이션하고 마이그레이션 프로세스 전반에 걸쳐 애플리케이션 가용성을 보장하는 방법을 보여줍니다. V3는 보안을 강화하고 데이터 키 변조로부터 보호하기 위해 키 커밋 및 커밋 정책이 포함된 AES GCM을 도입합니다.

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

Amazon S3 암호화 클라이언트 버전 3에는 보안 강화를 위한 키 커밋이 포함된 AES GCM이 도입되었습니다. 이 새로운 암호화 알고리즘은 데이터 키 변조에 대한 보호를 제공하고 암호화된 데이터의 무결성을 보장합니다. V3로 마이그레이션하려면 프로세스 전반에 걸쳐 애플리케이션 가용성과 데이터 접근성을 유지하기 위한 신중한 계획이 필요합니다.

이 마이그레이션은 다음 두 단계로 진행됩니다.

1. **새 형식을 읽도록 기존 클라이언트를 업데이트합니다.** 먼저 SDK AWS for Ruby의 업데이트된 버전을 애플리케이션에 배포합니다. 이렇게 하면 기존 V2 암호화 클라이언트가 새 V3 클라이언트가 작성한 객체를 복호화할 수 있습니다. 애플리케이션에서 다중 AWS SDKs 사용하는 경우 각 SDK를 별도로 업그레이드해야 합니다.

2. **암호화 및 복호화 클라이언트를 V3로 마이그레이션합니다.** 모든 V2 암호화 클라이언트가 새 형식을 읽을 수 있게 되면 기존 암호화 및 복호화 클라이언트를 해당 V3 버전으로 마이그레이션할 수 있습니다. 여기에는 커밋 정책 구성 및 새 클라이언트 구성 옵션을 사용하도록 코드 업데이트가 포함됩니다.

아직 V1에서 V2로 마이그레이션하지 않은 경우 먼저 해당 마이그레이션을 완료해야 합니다. V1에서 V2로 마이그레이션하는 방법에 대한 자세한 지침은 [Amazon S3 암호화 클라이언트 마이그레이션(V1에서 V2로)](s3-encryption-migration-v1-v2.md) 섹션을 참조하세요.

## V3 기능 이해
<a name="s3-encryption-migration-v2-v3-understanding"></a>

Amazon S3 암호화 클라이언트 버전 3에는 커밋 정책과 키 커밋이 포함된 AES GCM이라는 두 가지 주요 보안 기능이 도입되었습니다. 이러한 기능을 이해하는 것은 마이그레이션 전략을 계획하고 암호화된 데이터의 보안을 보장하는 데 필수적입니다.

### 약정 정책
<a name="s3-encryption-migration-v2-v3-commitment-policies"></a>

커밋 정책은 암호화 및 복호화 작업 중에 암호화 클라이언트가 키 커밋을 처리하는 방법을 제어합니다. 키 커밋은 암호화된 데이터를 암호화하는 데 사용된 정확한 키로만 복호화할 수 있도록 하여 특정 유형의 암호화 공격으로부터 보호합니다.

V3 암호화 클라이언트는 세 가지 커밋 정책 옵션을 지원합니다.

 **`FORBID_ENCRYPT_ALLOW_DECRYPT`** 

이 정책은 키 커밋 없이 객체를 암호화하고 키 커밋이 있는 객체와 없는 객체의 복호화를 허용합니다.
+  **암호화 동작:** 객체는 V2와 동일한 알고리즘 제품군을 사용하여 키 커밋 없이 암호화됩니다.
+  **복호화 동작:** 키 커밋을 사용하거나 사용하지 않고 암호화된 객체를 복호화할 수 있습니다.
+  **보안 영향:**이 정책은 키 커밋을 적용하지 않으며 변조를 허용할 수 있습니다. 이 정책으로 암호화된 객체는 키 커밋의 향상된 보안 보호의 이점을 누릴 수 없습니다. V2 암호화 동작과의 호환성을 유지해야 하는 경우에만 마이그레이션 중에이 정책을 사용합니다.
+  **버전 호환성:**이 정책으로 암호화된 객체는 S3 암호화 클라이언트의 모든 V2 및 V3 구현에서 읽을 수 있습니다. V3 

 **`REQUIRE_ENCRYPT_ALLOW_DECRYPT`**

이 정책은 키 커밋으로 객체를 암호화하고 키 커밋이 있는 객체와 없는 객체의 복호화를 허용합니다.
+  **암호화 동작:** 객체는 키 커밋과 함께 AES GCM을 사용하여 키 커밋으로 암호화됩니다.
+  **복호화 동작:** 키 커밋을 사용하거나 사용하지 않고 암호화된 객체를 복호화하여 이전 버전과의 호환성을 제공할 수 있습니다.
+  **보안 영향:** 새 객체는 키 커밋 보호의 이점을 활용하지만 키 커밋이 없는 기존 객체는 계속 읽을 수 있습니다. 이를 통해 마이그레이션 중에 보안과 이전 버전과의 호환성 간에 균형을 맞출 수 있습니다.
+  **버전 호환성:**이 정책으로 암호화된 객체는 S3V3 암호화 클라이언트의 V3 및 최신 V2 구현에서만 읽을 수 있습니다.

 **`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`** 

이 정책은 키 커밋으로 객체를 암호화하고 키 커밋으로 암호화된 객체의 복호화만 허용합니다.
+  **암호화 동작:** 객체는 키 커밋과 함께 AES GCM을 사용하여 키 커밋으로 암호화됩니다.
+  **복호화 동작:** 키 커밋으로 암호화된 객체만 복호화할 수 있습니다. 키 커밋 없이 객체를 복호화하려는 시도는 실패합니다.
+  **보안 영향:**이 정책은 모든 작업에 키 커밋을 적용하여 최고 수준의 보안을 제공합니다. 모든 객체가 키 커밋으로 다시 암호화되고 모든 클라이언트가 V3로 업그레이드된 후에만이 정책을 사용합니다.
+  **버전 호환성:**이 정책으로 암호화된 객체는 S3V3 암호화 클라이언트의 V3 및 최신 V2 구현에서만 읽을 수 있습니다. 또한이 정책은 V2 또는 V1 클라이언트로 암호화된 객체를 읽는 것을 방지합니다.

**참고**  
마이그레이션을 계획`REQUIRE_ENCRYPT_ALLOW_DECRYPT`할 때 로 시작하여 이전 버전과의 호환성을 유지하면서 새 객체에 대한 키 커밋의 보안 이점을 얻습니다. 모든 객체를 다시 암호화하고 모든 클라이언트를 V3로 업그레이드한 `REQUIRE_ENCRYPT_REQUIRE_DECRYPT` 후에만 로 이동합니다.

### 키 커밋이 있는 AES GCM
<a name="s3-encryption-migration-v2-v3-aes-gcm-kc"></a>

키 커밋(`ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY`)이 포함된 AES GCM은 V3에 도입된 새로운 암호화 알고리즘으로, 데이터 키 변조로부터 보호하여 보안을 강화합니다. 이 알고리즘의 작동 방식과 적용 시기를 이해하는 것이 마이그레이션을 계획하는 데 중요합니다.

 **가 이전 알고리즘과 `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY` 다른 방법** 

이전 버전의 S3 암호화 클라이언트는 명령 파일의 데이터 키를 암호화하기 위해 키 커밋 없이 AES CBC 또는 AES GCM을 사용했습니다.는 암호화 프로세스에 암호화 커밋을 `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY` 추가하여 암호화된 데이터를 특정 키에 바인딩합니다. 이렇게 하면 공격자가 명령 파일의 암호화된 데이터 키를 변조하여 클라이언트가 잘못된 키로 데이터를 복호화하는 것을 방지할 수 있습니다.

키 커밋이 없으면 공격자가 명령 파일의 암호화된 데이터 키를 수정하여 다른 키로 복호화하여 무단 액세스 또는 데이터 손상을 허용할 수 있습니다.는 암호화된 데이터 키가 암호화 중에 사용된 원본 키로만 복호화할 수 있도록 하여이 공격을 `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY` 방지합니다.

 **버전 호환성** 

로 암호화된 객체는 S3 암호화 클라이언트의 V3 구현과 V3 형식 읽기 지원이 포함된 V2의 특정 전환 버전에서만 해독`ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY`할 수 있습니다. 이 전환 지원이 없는 V2 클라이언트는 로 암호화된 지침 파일을 해독할 수 없습니다`ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY`.

**주의**  
`ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY` ( `REQUIRE_ENCRYPT_ALLOW_DECRYPT` 또는 `REQUIRE_ENCRYPT_REQUIRE_DECRYPT` 커밋 정책을 사용하여)를 사용하여 암호화를 활성화하기 전에 암호화된 객체를 읽어야 하는 모든 클라이언트가 V3 또는 V3 형식을 지원하는 전환 버전으로 업그레이드되었는지 확인합니다. 전환 지원이 없는 V2 클라이언트가 로 암호화된 객체를 읽으려고 하면 `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY`복호화가 실패합니다.

마이그레이션 중에 `FORBID_ENCRYPT_ALLOW_DECRYPT` 커밋 정책을 사용하여 V3 클라이언트가 키 커밋으로 암호화된 객체를 읽을 수 있도록 허용`ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY`하면서 없이 계속 암호화할 수 있습니다. 이렇게 하면 먼저 모든 리더를 업그레이드한 다음 키 커밋을 사용하여 암호화로 전환하는 안전한 마이그레이션 경로가 제공됩니다.

## 새 형식을 읽도록 기존 클라이언트를 업데이트하세요
<a name="s3-encryption-migration-v2-v3-update-clients"></a>

V3 암호화 클라이언트는 V2 클라이언트가 기본적으로 지원하지 않는 암호화 알고리즘과 키 커밋 기능을 사용합니다. 마이그레이션의 첫 번째 단계는 V2 복호화 클라이언트를 V3 암호화 객체를 읽을 수 있는 AWS SDK for Ruby 버전으로 업데이트하는 것입니다. 이 단계를 완료하면 애플리케이션의 V2 클라이언트가 V3 암호화 클라이언트로 암호화된 객체를 해독할 수 있습니다.

V3 클라이언트로 암호화된 객체( `REQUIRE_ENCRYPT_ALLOW_DECRYPT` 또는 `REQUIRE_ENCRYPT_REQUIRE_DECRYPT` 커밋 정책을 사용하는 객체)를 읽으려면 `aws-sdk-s3`젬 버전 1.93.0 이상을 사용해야 합니다. 이 버전에는 키 커밋이 있는 AES GCM으로 암호화된 객체의 복호화에 대한 지원이 포함되어 있습니다.

 **명령줄에서 설치** 

명령줄에서 `aws-sdk-s3` Gem을 설치하는 프로젝트의 경우 버전 옵션을 사용하여 최소 버전 1.208.0이 설치되었는지 확인합니다.

```
gem install aws-sdk-s3 -v '>= 1.208.0'
```

 **Gemfile 사용** 

Gemfile을 사용하여 종속성을 관리하는 프로젝트의 경우 `aws-sdk-s3` Gem의 최소 버전을 1.208.0으로 설정합니다. 예제:

```
gem 'aws-sdk-s3', '>= 1.208.0'
```

1. Gemfile을 수정하여 최소 버전을 지정합니다.

1. 를 실행`bundle update aws-sdk-s3`하여 Gem을 업데이트합니다.

1. 버전을 확인하려면 `bundle info aws-sdk-s3`을 실행합니다.

**참고**  
최신 버전으로 업데이트한 후 기존 V2 암호화 클라이언트는 V3 클라이언트로 암호화된 객체를 복호화할 수 있습니다. 그러나 다음 섹션에 설명된 대로 V3로 마이그레이션할 때까지 V2 알고리즘을 사용하여 새 객체를 계속 암호화합니다.

## 암호화 및 복호화 클라이언트를 V3로 마이그레이션
<a name="s3-encryption-migration-v2-v3-migrate"></a>

새 암호화 형식을 읽도록 클라이언트를 업데이트한 후 애플리케이션을 V3 암호화 및 복호화 클라이언트로 업데이트할 수 있습니다. 다음 단계에서는 V2에서 V3로 코드를 성공적으로 마이그레이션하는 방법을 보여줍니다.

V3 암호화 클라이언트를 사용하도록 코드를 업데이트하기 전에 이전 단계를 따르고 `aws-sdk-s3` Gem 버전 1.93.0 이상을 사용하고 있는지 확인합니다.

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

### V3 클라이언트 구성
<a name="s3-encryption-migration-v2-v3-configure"></a>

V3 암호화 클라이언트에는 키 커밋 동작과 이전 버전과의 호환성을 제어하는 새로운 구성 옵션이 도입되었습니다. 성공적인 마이그레이션을 위해서는 이러한 옵션을 이해하는 것이 필수적입니다.

 **commitment\_policy** 

`commitment_policy` 파라미터는 암호화 및 복호화 작업 중에 암호화 클라이언트가 키 커밋을 처리하는 방법을 제어합니다. 이는 V3 클라이언트에 가장 중요한 구성 옵션입니다.
+  `:require_encrypt_allow_decrypt` - 키 커밋으로 새 객체를 암호화하고 키 커밋 유무에 관계없이 객체의 복호화를 허용합니다. 이는 기존 V2 객체와의 이전 버전 호환성을 유지하면서 새 객체에 대한 보안을 강화하므로 마이그레이션에 권장되는 설정입니다.
+  `:forbid_encrypt_allow_decrypt` - 키 커밋 없이 새 객체를 암호화하고(V2 알고리즘 사용) 키 커밋 유무에 관계없이 객체의 복호화를 허용합니다. 일부 클라이언트가 아직 V3 암호화 객체를 읽을 수 없는 경우와 같이 마이그레이션 중에 V2 암호화 동작을 유지해야 하는 경우에만이 설정을 사용합니다. V3 
+  `:require_encrypt_require_decrypt` - 키 커밋으로 새 객체를 암호화하고 키 커밋으로 암호화된 객체의 복호화만 허용합니다. 모든 객체를 키 커밋으로 다시 암호화하고 모든 클라이언트를 V3로 업그레이드한 후에만이 설정을 사용합니다.

 **security\_profile** 

`security_profile` 파라미터는 이전 암호화 클라이언트 버전에서 작성된 객체 읽기에 대한 지원을 결정합니다. 이 파라미터는 마이그레이션 중에 이전 버전과의 호환성을 유지하는 데 필수적입니다.
+  `:v3_and_legacy` - V3 클라이언트가 V1 및 V2 암호화 클라이언트로 암호화된 객체를 복호화할 수 있습니다. 마이그레이션 중에이 설정을 사용하여 V3 클라이언트가 기존의 모든 암호화된 객체를 읽을 수 있도록 합니다.
+  `:v3` - V3 클라이언트가 V2 암호화 클라이언트로 암호화된 객체만 복호화하도록 허용합니다. 이미 모든 V1 객체를 V2 형식으로 마이그레이션한 경우이 설정을 사용합니다.
+ 지정하지 않으면 클라이언트는 V3 클라이언트로 암호화된 객체만 해독합니다. 레거시 객체가 없는 새 애플리케이션 개발에만 사용합니다.

 **envelope\_location** 

`envelope_location` 파라미터는 암호화 메타데이터(암호화된 데이터 키 포함)가 저장되는 위치를 결정합니다. 이 파라미터는 키 커밋이 있는 AES GCM으로 보호되는 객체에 영향을 줍니다.
+  `:metadata` (기본값) - S3 객체의 메타데이터 헤더에 암호화 메타데이터를 저장합니다. 이는 기본 동작이며 대부분의 사용 사례에 권장됩니다. 메타데이터 스토리지를 사용하는 경우 키 커밋이 있는 AES GCM은 적용되지 않습니다.
+  `:instruction_file` - 구성 가능한 접미사가 있는 별도의 S3 객체(지침 파일)에 암호화 메타데이터를 저장합니다. 지침 파일을 사용할 때 키 커밋이 있는 AES GCM은 암호화된 데이터 키가 변조되지 않도록 보호합니다. 데이터 키 자체에 대한 키 커밋에서 제공하는 추가 보안이 필요한 경우이 설정을 사용합니다.

를 사용할 때 선택적으로 `instruction_file_suffix` 파라미터를 지정하여 명령 파일 객체에 사용되는 접미사를 사용자 `:instruction_file`지정할 수 있습니다. 기본 접미사는 입니다`.instruction`.

 **각 구성 옵션을 사용해야 하는 경우** 

마이그레이션 중에 다음 권장 구성 전략을 따릅니다.

1.  **초기 마이그레이션:** `commitment_policy: :require_encrypt_allow_decrypt` 및를 설정합니다`security_profile: :v3_and_legacy`. 이렇게 하면 V3 클라이언트가 키 커밋으로 새 객체를 암호화하는 동시에 기존 V1 및 V2 객체를 모두 복호화할 수 있습니다.

1.  **모든 클라이언트가 업그레이드된 후:** 키 커밋 보호가 필요한 모든 객체를 다시 암호화할 `security_profile: :v3_and_legacy` 때까지 `commitment_policy: :require_encrypt_allow_decrypt` 및를 계속 사용합니다.

1.  **전체 V3 적용:** 모든 객체를 키 커밋으로 다시 암호화하고 더 이상 V1/V2 객체를 읽을 필요가 없는 경우에만 선택적으로 `security_profile` 파라미터를 전환`commitment_policy: :require_encrypt_require_decrypt`하고 제거할 수 있습니다(또는 V2 객체가 여전히 존재하는 `:v2` 경우 로 설정).

의 경우 변경할 특별한 이유가 없는 한 기존 스토리지 방법(`:metadata` 또는 `:instruction_file`)을 `envelope_location`계속 사용합니다. 현재 메타데이터 스토리지를 사용하고 있고 데이터 키에 대한 키 커밋이 있는 AES GCM의 추가 보안을 원하는 경우 로 전환할 수 있지만`:instruction_file`, 이렇게 하려면 이러한 객체를 읽는 모든 클라이언트를 업데이트해야 합니다.

### 암호화 및 복호화 클라이언트를 V3로 마이그레이션
<a name="s3-encryption-migration-v2-v3-migrate"></a>

새 암호화 형식을 읽도록 클라이언트를 업데이트한 후 애플리케이션을 V3 암호화 및 복호화 클라이언트로 업데이트할 수 있습니다. 다음 예제에서는 V2에서 V3로 코드를 성공적으로 마이그레이션하는 방법을 보여줍니다.

#### V3 암호화 클라이언트 사용
<a name="s3-encryption-migration-v2-v3-using-v3-clients"></a>

 **마이그레이션 전(V2)** 

```
require 'aws-sdk-s3'

# Create V2 encryption client with KMS
client = Aws::S3::EncryptionV2::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context,
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v2_and_legacy,
  commitment_policy: :forbid_encrypt_allow_decrypt
)

# Encrypt and upload object
client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data')

# Download and decrypt object
resp = client.get_object(bucket: 'my-bucket', key: 'my-object')
decrypted_data = resp.body.read
```

 **마이그레이션 중(이전 버전과의 호환성을 갖춘 V3)** 

```
require 'aws-sdk-s3'

# Create V3 encryption client with KMS
client = Aws::S3::EncryptionV3::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context,
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v3_and_legacy,
  commitment_policy: :require_encrypt_allow_decrypt
)

# Encrypt and upload object
client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data')

# Download and decrypt object
resp = client.get_object(bucket: 'my-bucket', key: 'my-object')
decrypted_data = resp.body.read
```

 **마이그레이션 후(V3)** 

```
require 'aws-sdk-s3'

# Create V3 encryption client with KMS
client = Aws::S3::EncryptionV3::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context,
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v3,
  # Use the commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT)
  # This encrypts with key commitment and does not decrypt V2 objects
  commitment_policy: :require_encrypt_require_decrypt
)

# Encrypt and upload object
client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data')

# Download and decrypt object
resp = client.get_object(bucket: 'my-bucket', key: 'my-object')
decrypted_data = resp.body.read
```

V3의 주요 차이점은 `commitment_policy` 파라미터를 추가하는 것입니다. 로 설정`:require_encrypt_require_decrypt`하면 새 객체가 키 커밋으로 암호화되고 클라이언트가 키 커밋으로 암호화된 객체만 복호화하여 데이터 키 변조에 대한 보안을 강화할 수 있습니다.

`put_object` 호출 자체는 변경되지 않습니다. 모든 보안 개선 사항은 클라이언트 수준에서 구성됩니다.

### 추가 예제
<a name="s3-encryption-migration-v2-v3-additional-examples"></a>

이 섹션에서는 V2에서 V3로 마이그레이션하는 동안 유용할 수 있는 특정 마이그레이션 시나리오 및 구성 옵션에 대한 추가 예제를 제공합니다.

#### 명령 파일과 메타데이터 스토리지 비교
<a name="s3-encryption-migration-v2-v3-example-storage"></a>

S3 암호화 클라이언트는 암호화 메타데이터(암호화된 데이터 키 포함)를 S3 객체의 메타데이터 헤더 또는 별도의 명령 파일이라는 두 위치에 저장할 수 있습니다. 스토리지 방법 선택은 키 커밋 보호를 통해 AES GCM의 이점을 활용하는 객체에 영향을 미칩니다.

 **메타데이터 스토리지(기본값)** 

기본적으로 암호화 클라이언트는 암호화 메타데이터를 S3 객체의 메타데이터 헤더에 저장합니다. 이는 객체와 함께 암호화 메타데이터를 유지하고 별도의 명령 파일 객체를 관리할 필요가 없으므로 대부분의 사용 사례에 권장되는 접근 방식입니다.

```
require 'aws-sdk-s3'

# Create V3 encryption client with metadata storage (default)
client = Aws::S3::EncryptionV3::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context,
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v3_and_legacy,
  commitment_policy: :require_encrypt_allow_decrypt,
  envelope_location: :metadata # Explicitly set to metadata (this is the default)
)

# Encrypt and upload object
# Encryption metadata is stored in the object's metadata headers
client.put_object(bucket: 'my-bucket', key: 'my-object',body: 'secret data')
```

메타데이터 스토리지를 사용하는 경우 키 커밋이 있는 AES GCM은 암호화된 데이터 키에 적용되지 않습니다. 그러나 콘텐츠 암호화는 `commitment_policy: :require_encrypt_allow_decrypt` 또는를 사용할 때 키 커밋의 이점을 여전히 누릴 수 있습니다`:require_encrypt_require_decrypt`.

 **지침 파일 스토리지** 

또는 명령 파일이라는 별도의 S3 객체에 암호화 메타데이터를 저장하도록 암호화 클라이언트를 구성할 수 있습니다. V3와 함께 지침 파일을 사용하는 경우 암호화된 데이터 키는 키 커밋이 있는 AES GCM으로 보호되므로 데이터 키 변조에 대한 추가 보안을 제공합니다.

```
require 'aws-sdk-s3'

# Create V3 encryption client with instruction file storage
client = Aws::S3::EncryptionV3::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context,
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v3_and_legacy,
  commitment_policy: :require_encrypt_allow_decrypt,
  envelope_location: :instruction_file, # Store metadata in separate instruction file
  instruction_file_suffix: '.instruction' # Optional: customize the suffix (default is '.instruction')
)

# Encrypt and upload object
# Encryption metadata is stored in a separate object: 'my-object.instruction'
client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data')

# When retrieving the object, the client automatically reads the instruction file
resp = client.get_object(bucket: 'my-bucket', key: 'my-object')
decrypted_data = resp.body.read
```

`envelope_location: :instruction_file`를 사용할 때 암호화 클라이언트는 두 개의 S3 객체를 생성합니다.

1. 암호화된 데이터 객체(예: `my-object`)

1. 암호화 메타데이터가 포함된 명령 파일(예: `my-object.instruction`)

`instruction_file_suffix` 파라미터를 사용하면 명령 파일에 사용되는 접미사를 사용자 지정할 수 있습니다. 기본값은 `.instruction`입니다.

 **각 스토리지 방법을 사용해야 하는 경우** 
+  대부분의 시나리오에 **메타데이터 스토리지를 사용합니다**. 암호화 메타데이터가 객체와 함께 이동하므로 객체 관리를 간소화합니다.
+  객체 메타데이터 크기가 문제가 되거나 암호화된 객체와 암호화 메타데이터를 분리해야 하는 경우 **명령 파일 스토리지를 사용합니다**. 지침 파일을 사용하려면 S3 객체(암호화된 객체와 해당 명령 파일)를 하나 대신 관리해야 합니다.

**주의**  
메타데이터 스토리지에서 명령 파일 스토리지로(또는 그 반대로) 변경하는 경우 새 스토리지 방법으로 구성된 클라이언트는 이전 스토리지 방법으로 암호화된 기존 객체를 읽을 수 없습니다. 스토리지 방법을 신중하게 계획하고 애플리케이션 전반에서 일관성을 유지합니다.