

# AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용
<a name="UsingKMSEncryption"></a>

**중요**  
이제 Amazon S3가 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)를 Amazon S3 내 모든 버킷 암호화의 기본 수준으로 적용합니다. 2023년 1월 5일부터 Amazon S3로의 모든 새 객체 업로드는 추가 비용 없이 성능에 영향을 미치지 않고 자동으로 암호화됩니다. S3 버킷 기본 암호화 구성에 및 신규 객체 업로드에 대한 자동 암호화 상태는 CloudTrail 로그, S3 인벤토리, S3 Storage Lens, Amazon S3 콘솔에서 사용할 수 있으며, AWS CLI 및 AWS SDK에서 추가 Amazon S3 API 응답 헤더로도 사용할 수 있습니다. 자세한 내용은 [기본 암호화 관련 FAQ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/default-encryption-faq.html)를 참조하세요.

서버 측 암호화는 데이터를 받는 애플리케이션 또는 서비스에 의해 해당 대상에서 데이터를 암호화하는 것입니다.

Amazon S3는 새 객체 업로드에 대해 Amazon S3 관리형 키(SSE-S3)를 통한 서버 측 암호화를 자동으로 활성화합니다.

달리 지정하지 않는 한 버킷은 기본적으로 SSE-S3를 사용하여 객체를 암호화합니다. 하지만 AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 통한 서버 측 암호화를 사용하도록 버킷을 구성할 수도 있습니다. 자세한 내용은 [AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정](specifying-kms-encryption.md) 섹션을 참조하세요.

AWS KMS는 클라우드에 맞게 확장된 키 관리 시스템을 제공하기 위해 안전하고 가용성이 높은 하드웨어 및 소프트웨어를 결합하는 서비스입니다. Amazon S3는 AWS KMS를 사용한 서버 측 암호화(SSE-KMS)를 사용하여 S3 객체 데이터를 암호화합니다. 또한, 객체에 SSE-KMS를 요청하면 S3 체크섬(객체 메타데이터의 일부)이 암호화된 형식으로 저장됩니다. 체크섬에 대한 자세한 내용은 [Amazon S3에서 객체 무결성 확인](checking-object-integrity.md) 페이지를 참조하십시오.

KMS 키를 사용하는 경우 [AWS Management Console](https://console.aws.amazon.com/kms) 또는 [AWS KMS API](https://docs.aws.amazon.com/kms/latest/APIReference/)를 통해 AWS KMS를 사용하여 다음을 수행할 수 있습니다.
+ KMS 키를 중앙에서 생성, 조회, 편집, 모니터링, 활성화/비활성화, 순환, 예약 삭제할 수 있습니다.
+ KMS 키를 사용할 수 있는 방법 및 주체를 제어하는 정책을 정의합니다.
+ 올바른 사용을 위해 KMS 키 사용을 감사합니다. 감사는 [AWS KMS 콘솔](https://console.aws.amazon.com/kms)이 아닌 [AWS KMS API](https://docs.aws.amazon.com/kms/latest/APIReference/)로 지원됩니다.



AWS KMS 내 보안 관리가 암호화 관련 규정 준수 요구 사항을 충족하는 데 도움이 될 수 있습니다. 이러한 KMS 키를 사용하여 Amazon S3 버킷에서 데이터를 보호할 수 있습니다. S3 버킷에 SSE-KMS 암호화를 사용할 때 AWS KMS keys는 버킷과 동일한 리전에 있어야 합니다.

AWS KMS keys 사용에 따르는 추가 요금이 있습니다. 자세한 내용은 *AWS Key Management Service 개발자 가이드*의 [AWS KMS key 개념](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys) 및 [AWS KMS 요금](https://aws.amazon.com/kms/pricing)을 참조하십시오.

IAM 사용자가 KMS 암호화 버킷에 액세스하도록 허용하는 방법에 대한 지침은 [Amazon S3 버킷에 사용자 지정 AWS KMS 키를 사용하는 기본 암호화가 설정되어 있습니다. 사용자가 버킷에서 다운로드 및 업로드를 수행할 수 있도록 하려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/s3-bucket-access-default-encryption)를 AWS re:Post 지식 센터에서 참조하세요.

**권한**  
Amazon S3에 대한 AWS KMS 키로 객체를 암호화하도록 성공적으로 `PutObject` 요청을 수행하려면 키에 대한 `kms:GenerateDataKey` 권한이 필요합니다. AWS KMS key를 사용하여 암호화된 객체를 다운로드하려면 키에 대한 `kms:Decrypt` 권한이 필요합니다. [멀티파트 업로드를 수행](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions)하여 AWS KMS key로 객체를 암호화하려면 키에 대한 `kms:GenerateDataKey` 및 `kms:Decrypt` 권한이 있어야 합니다.

**중요**  
KMS 키 정책에 부여된 권한을 주의 깊게 검토하세요. 고객 관리형 KMS 키 정책 권한은 항상 관련 AWS KMS 키 작업에 액세스해야 하는 IAM 보안 주체 및 AWS 서비스로 제한하세요. 자세한 내용은 [AWS KMS에서 키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)을 참조하세요.

**Topics**
+ [

## AWS KMS keys
](#aws-managed-customer-managed-keys)
+ [

## Amazon S3 버킷 키
](#sse-kms-bucket-keys)
+ [

## 서버 측 암호화 필요
](#require-sse-kms)
+ [

## 암호화 컨텍스트
](#encryption-context)
+ [

## AWS KMS 암호화된 객체에 대한 요청 전송
](#aws-signature-version-4-sse-kms)
+ [

# AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정
](specifying-kms-encryption.md)
+ [

# Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감
](bucket-key.md)

## AWS KMS keys
<a name="aws-managed-customer-managed-keys"></a>

AWS KMS를 통한 서버 측 암호화(SSE-KMS)를 사용하는 경우 기본 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)를 사용하거나 이미 생성한 [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)를 지정할 수 있습니다. AWS KMS는 *봉투 암호화*를 사용합니다. S3는 *봉투 암호화*에 AWS KMS 기능을 사용하여 데이터를 추가로 보호합니다. 봉투 암호화는 데이터 키로 일반 텍스트 데이터를 암호화한 후 KMS 키로 데이터 키를 암호화하는 방법입니다. 봉투 암호화에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*에서 [봉투 암호화](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#enveloping)를 참조하십시오.

고객 관리형 키를 지정하지 않으면 Amazon S3에서는 SSE-KMS로 암호화된 객체를 버킷에 처음 추가할 때 AWS 계정에 AWS 관리형 키를 자동으로 생성합니다. 기본적으로 Amazon S3에서는 SSE-KMS에 이 KMS를 사용합니다.

**참고**  
[AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)로 SSE-KMS를 사용하여 암호화된 객체는 계정 간에 공유할 수 없습니다. 계정 간 SSE-KMS 데이터를 공유해야 하는 경우 AWS KMS의 [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)를 사용해야 합니다.

SSE-KMS에 고객 관리형 키를 사용하려는 경우 SSE-KMS를 구성하기 전에 대칭 암호화 고객 관리형 키를 생성합니다. 그런 다음 버킷에 대해 SSE-KMS를 구성할 때 기존 고객 관리형 키를 지정합니다. 대칭 암호화 키에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [대칭 암호화 KMS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#symmetric-cmks)를 참조하십시오.

고객 관리형 키를 생성하면 보다 유연하게 제어할 수 있습니다. 예를 들어, 고객 관리형 키를 생성, 교체 및 사용 중지할 수 있습니다. 또한 액세스 제어를 정의하고 데이터를 보호하는 데 사용하는 고객 관리형 키를 감사할 수 있습니다. 고객 관리형 및 AWS 관리형 키에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [고객 키 및 AWS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#key-mgmt)를 참조하십시오.

**참고**  
외부 키 스토어에 저장된 고객 관리형 키로 서버 측 암호화를 사용하면, 표준 KMS 키를 사용할 때와는 달리, 키 구성 요소의 가용성과 내구성을 직접 담보할 책임이 있습니다. 외부 키 스토어와 이들이 공유 책임 모델을 전환하는 방법에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [External key stores](https://docs.aws.amazon.com//kms/latest/developerguide/keystore-external.html)(외부 키 스토어)를 참조하십시오.

### 크로스 계정 작업에 SSE-KMS 암호화 사용
<a name="sse-kms-cross-account-operations"></a>

크로스 계정 작업에 암호화를 사용하는 경우 다음 사항에 유의하세요.
+ 요청 시 또는 버킷의 기본 암호화 구성을 통해 AWS KMS key Amazon 리소스 이름(ARN) 또는 별칭이 제공되지 않는 경우 업로드 계정의 AWS 관리형 키(`aws/s3`)가 암호화에 사용되며 복호화 시 필요합니다.
+ 업로드 및 액세스하는 AWS Identity and Access Management(IAM) 보안 주체가 동일한 AWS 계정에 속한 경우 AWS 관리형 키(`aws/s3`)를 교차 계정 작업의 KMS 키로 사용할 수 있습니다.
+ S3 객체에 크로스 계정 액세스 권한을 부여하려면 고객 관리형 키를 사용합니다. 다른 계정으로부터의 액세스를 허용하도록 고객 관리형 키의 정책을 구성할 수 있습니다.
+ 고객 관리형 KMS 키를 지정하는 경우 정규화된 KMS 키 ARN을 사용하는 것이 좋습니다. KMS 키 별칭을 대신 사용하는 경우 AWS KMS가 요청자의 계정 내에서 키를 해독합니다. 이 동작으로 인해 버킷 소유자가 아닌 요청자에게 속한 KMS로 데이터가 암호화될 수 있습니다.
+ 사용자(요청자)에게 `Encrypt` 권한이 부여된 키를 지정해야 합니다. 자세한 내용은 **AWS Key Management Service 개발자 안내서의 [키 사용자가 암호화 작업에 KMS를 사용하도록 허용](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-users-crypto)을 참조하세요.

고객 관리형 키와 AWS 관리형 KMS 키를 사용해야 하는 상황에 대한 자세한 내용은 [Amazon S3의 객체를 암호화하기 위해 AWS 관리형 키와 고객 관리형 KMS 키 중 무엇을 사용해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/s3-object-encryption-keys/)를 참조하세요.

### SSE-KMS 암호화 워크플로
<a name="sse-kms-encryption-workflow"></a>

AWS 관리형 키 또는 고객 관리형 키를 사용하여 데이터를 암호화하도록 선택하면, AWS KMS 및 Amazon S3가 다음 봉투 암호화 작업을 수행합니다.

1. Amazon S3는 일반 텍스트 [데이터 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#data-keys)와 지정된 KMS 키로 암호화된 키의 사본을 요청합니다.

1. AWS KMS가 데이터 키를 생성하고 KMS 키 하에서 암호화한 후, 일반 텍스트 데이터 키와 암호화된 데이터 키를 모두 Amazon S3로 보냅니다.

1. Amazon S3는 데이터 키를 사용해 데이터를 암호화하고, 사용 후 가급적 빨리 메모리에서 일반 텍스트 키를 제거합니다.

1. Amazon S3는 암호화한 데이터 키를 암호화한 데이터와 함께 메타데이터로 저장합니다.

사용자가 데이터 복호화를 요청하면 Amazon S3와 AWS KMS가 다음 작업을 수행합니다.

1. Amazon S3가 `Decrypt` 요청 내 AWS KMS로 암호화된 데이터 키를 보냅니다.

1. AWS KMS가 동일한 KMS 키를 사용하여 암호화된 데이터 키를 복호화하고 일반 텍스트 데이터 키를 Amazon S3에 반환합니다.

1. Amazon S3가 암호화된 데이터를 일반 텍스트 데이터 키를 사용해 복호화하고, 가급적 신속하게 일반 텍스트 데이터 키를 메모리에서 제거합니다.

**중요**  
Amazon S3에서 서버 측 암호화에 AWS KMS key을 사용하는 경우 대칭 암호화 KMS 키를 선택해야 합니다. Amazon S3는 대칭 암호화 KMS 키만 지원합니다. 이들 키에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [대칭 암호화 KMS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#symmetric-cmks)를 참조하십시오.

### SSE-KMS 암호화 감사
<a name="sse-kms-encryption-audit"></a>

SSE-KMS를 지정하는 요청을 식별하려면 Amazon S3 스토리지 렌즈 지표 내에서 **All SSE-KMS requests**(모든 SSE-KMS 요청) 및 **% all SSE-KMS requests**(모든 SSE-KMS 요청 비율) 지표를 사용하면 됩니다. S3 스토리지 렌즈는 조직 전반에서 객체 스토리지 사용 및 활동에 대한 가시성을 확보하는 데 사용할 수 있는 클라우드 스토리지 분석 기능입니다. SSE-KMS 활성화 버킷 수 및 SSE-KMS 활성화 버킷 비율을 사용하여 [기본 버킷 암호화](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-encryption.html)에 대한 SSE-KMS 활성화 버킷 수를 파악할 수도 있습니다. 자세한 내용은 [S3 스토리지 렌즈를 사용한 스토리지 활동 및 사용량 평가](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html?icmpid=docs_s3_user_guide_UsingKMSEncryption.html)를 참조하십시오. 지표의 전체 목록은 [S3 스토리지 렌즈 지표 용어집](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_UsingKMSEncryption.html)을 참조하십시오.

AWS CloudTrail 로그를 사용하여 SSE-KMS 암호화 데이터의 AWS KMS 키 사용을 감사할 수 있습니다. [https://docs.aws.amazon.com/kms/latest/developerguide/ct-generatedatakey.html](https://docs.aws.amazon.com/kms/latest/developerguide/ct-generatedatakey.html) 및 [https://docs.aws.amazon.com/kms/latest/developerguide/ct-decrypt.html](https://docs.aws.amazon.com/kms/latest/developerguide/ct-decrypt.html)와 같은 [암호화 작업](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations)에 대한 인사이트를 얻을 수 있습니다. CloudTrail은 이벤트 이름, 사용자 이름, 이벤트 소스 등 검색 필터링을 위한 다양한 [속성 값](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_LookupEvents.html)을 지원합니다.

## Amazon S3 버킷 키
<a name="sse-kms-bucket-keys"></a>

AWS KMS(SSE-KMS)를 통한 서버 측 암호화를 구성할 때 SSE-KMS용 S3 버킷 키를 사용하도록 버킷을 구성할 수 있습니다. SSE-KMS용 버킷 수준 키를 사용하면 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS KMS 요청 비용을 최대 99%까지 줄일 수 있습니다.

새 객체에서 SSE-KMS용 S3 버킷 키를 사용하도록 버킷을 구성하면 AWS KMS는 버킷의 객체에 대해 고유한 [데이터 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)를 만드는 데 사용되는 버킷 수준 키를 생성합니다. 이 S3 버킷 키는 Amazon S3 내에서 제한된 기간 동안 사용되므로 Amazon S3가 암호화 작업을 완료하기 위해 AWS KMS에 요청할 필요성이 추가적으로 줄어듭니다. S3 버킷 키 사용에 대한 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 단원을 참조하십시오.

## 서버 측 암호화 필요
<a name="require-sse-kms"></a>

특정 Amazon S3 버킷의 모든 객체에 대한 서버 측 암호화를 요구하려면 버킷 정책을 사용하면 됩니다. 예를 들어, 다음 버킷 정책은 요청에 SSE-KMS를 사용한 서버 측 암호화를 요청하는 `s3:PutObject` 헤더가 포함되지 않을 경우 모든 사용자에게 객체 업로드(`x-amz-server-side-encryption-aws-kms-key-id`) 권한을 거부합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Id":"PutObjectPolicy",
   "Statement":[{
         "Sid":"DenyObjectsThatAreNotSSEKMS",
         "Effect":"Deny",
         "Principal":"*",
         "Action":"s3:PutObject",
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/*",
         "Condition":{
            "Null":{
               "s3:x-amz-server-side-encryption-aws-kms-key-id":"true"
            }
         }
      }
   ]
}
```

------

버킷의 객체를 암호화하는 데 특정 AWS KMS key를 사용하도록 하려면 `s3:x-amz-server-side-encryption-aws-kms-key-id` 조건 키를 사용합니다. KMS 키를 지정하려면 `arn:aws:kms:region:acct-id:key/key-id` 형식의 Amazon 리소스 이름(ARN) 키를 사용해야 합니다. AWS Identity and Access Management는 `s3:x-amz-server-side-encryption-aws-kms-key-id` 문자열이 존재하는지 검증하지 않습니다.

**참고**  
객체를 업로드할 때 `x-amz-server-side-encryption-aws-kms-key-id` 헤더를 사용하여 KMS 키를 지정하거나 [기본 버킷 암호화 구성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-encryption.html)을 사용할 수 있습니다. PutObject 요청이 `x-amz-server-side-encryption` 헤더에 `aws:kms`를 지정하지만 `x-amz-server-side-encryption-aws-kms-key-id` 헤더는 지정하지 않는 경우 Amazon S3에서 사용자가 AWS 관리형 키를 사용하려는 것으로 간주합니다. 이와 관계없이 Amazon S3가 객체 암호화에 사용하는 AWS KMS 키 ID는 정책의 AWS KMS 키 ID와 일치해야 합니다. 그렇지 않으면 Amazon S3는 요청을 거부합니다.

Amazon S3에서 사용되는 조건 키의 전체 목록을 보려면 **서비스 승인 참조에서 [Amazon S3에 사용되는 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html#amazons3-policy-keys)를 참조하세요.

## 암호화 컨텍스트
<a name="encryption-context"></a>

**암호화 컨텍스트는 데이터에 대한 추가 컨텍스트 정보를 포함하는 키-값 페어 집합입니다. 암호화 컨텍스트는 암호화되지 않습니다. 암호화 작업에 대해 암호화 컨텍스트가 지정되면 Amazon S3가 복호화 작업에 대해 동일한 암호화 컨텍스트를 지정해야 합니다. 그렇지 않으면 암호화 해제가 실패합니다. AWS KMS는 암호화 컨텍스트를 [추가 인증 데이터](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/concepts.html#digital-sigs)(AAD)로 사용하여 [인증된 암호화](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations#digital-sigs)를 지원합니다. 암호화 컨텍스트에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)를 참조하십시오.

기본적으로 Amazon S3는 객체 또는 버킷의 Amazon 리소스 이름(ARN)을 암호화 컨텍스트 쌍으로 사용합니다.
+ **S3 버킷 키를 활성화하지 않고 SSE-KMS를 사용하는 경우** 객체 ARN이 암호화 컨텍스트로 사용됩니다.

  ```
  arn:aws:s3:::object_ARN
  ```
+ **S3 버킷 키를 활성화하고 SSE-KMS를 사용하는 경우** 버킷 ARN이 암호화 컨텍스트로 사용됩니다. S3 버킷 키에 대한 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 단원을 참조하십시오.

  ```
  arn:aws:s3:::bucket_ARN
  ```

필요한 경우 [s3:PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html#API_PutObject_RequestSyntax) 요청에서 `x-amz-server-side-encryption-context` 헤더를 사용하여 추가 암호화 컨텍스트 쌍을 제공할 수 있습니다. 그러나 암호화 컨텍스트는 암호화되지 않으므로 민감한 정보를 포함하지 않도록 해야 합니다. Amazon S3는 기본 암호화 컨텍스트와 함께 이 추가 키 페어를 저장합니다. `PUT` 요청을 처리할 때 Amazon S3는 의 기본 암호화 컨텍스트를 사용자가 제공한 `aws:s3:arn` 암호화 컨텍스트에 추가합니다.

암호화 컨텍스트를 사용하여 암호화 작업을 식별하고 분류할 수 있습니다. 또한 기본 암호화 컨텍스트 ARN 값을 사용하면 어떤 Amazon S3 ARN이 어떤 암호화 키와 함께 사용되었는지 확인하여 AWS CloudTrail에서 관련 요청을 추적할 수 있습니다.

CloudTrail 로그 파일의 `requestParameters` 필드에서 암호화 컨텍스트는 다음과 비슷하게 표시됩니다.

```
"encryptionContext": {
    "aws:s3:arn": "arn:aws:s3:::amzn-s3-demo-bucket1/file_name"
}
```

S3 버킷 키 기능과 함께 SSE-KMS를 사용하는 경우 암호화 컨텍스트 값은 버킷의 ARN입니다.

```
"encryptionContext": {
    "aws:s3:arn": "arn:aws:s3:::amzn-s3-demo-bucket1"
}
```

## AWS KMS 암호화된 객체에 대한 요청 전송
<a name="aws-signature-version-4-sse-kms"></a>

**중요**  
AWS KMS 암호화된 객체에 대한 모든 `GET` 및 `PUT` 요청은 Secure Sockets Layer(SSL) 또는 전송 계층 보안(TLS)을 사용하여 이루어져야 합니다. 또한 AWS 서명 버전 4(또는 AWS 서명 버전 2)와 같은 유효한 자격 증명을 사용하여 요청에 서명해야 합니다.

AWS Signature 버전 4는 HTTP로 전송된 AWS 요청에 인증 정보를 추가하는 프로세스입니다. 보안을 위해 대부분의 AWS 요청은 액세스 키 ID와 비밀 액세스 키로 구성된 액세스 키로 서명해야 합니다. 이 두 키는 일반적으로 보안 자격 증명이라고 합니다. 자세한 내용은 [요청 인증(AWS 서명 버전 4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) 및 [서명 버전 4 서명 프로세스](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)를 참조하십시오.

**중요**  
객체가 SSE-KMS를 사용하는 경우 `GET` 요청 및 `HEAD` 요청에 암호화 요청 헤더를 전송하면 안 됩니다. 그러면 HTTP 400 Bad Request 오류가 발생합니다.

**Topics**
+ [

## AWS KMS keys
](#aws-managed-customer-managed-keys)
+ [

## Amazon S3 버킷 키
](#sse-kms-bucket-keys)
+ [

## 서버 측 암호화 필요
](#require-sse-kms)
+ [

## 암호화 컨텍스트
](#encryption-context)
+ [

## AWS KMS 암호화된 객체에 대한 요청 전송
](#aws-signature-version-4-sse-kms)
+ [

# AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정
](specifying-kms-encryption.md)
+ [

# Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감
](bucket-key.md)

# AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정
<a name="specifying-kms-encryption"></a>

모든 Amazon S3 버킷에는 기본적으로 암호화가 구성되어 있으며 S3 버킷에 업로드되는 신규 객체는 모두 저장 시 자동으로 암호화됩니다. Amazon S3 관리형 키(SSE-S3)를 사용한 서버 측 암호화가 Amazon S3 내 모든 버킷의 기본 암호화 구성입니다. 다른 유형의 암호화를 사용하려면 S3 `PUT` 요청에 사용할 서버 측 암호화 유형을 지정하거나 대상 버킷에 기본 암호화 구성을 업데이트할 수 있습니다.

`PUT` 요청에 다른 암호화 유형을 지정하려는 경우 AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS), AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 또는 고객 제공 키를 사용한 서버 측 암호화 (SSE-C)를 사용할 수 있습니다. 대상 버킷에 다른 기본 암호화 구성을 설정하려는 경우 SSE-KMS 또는 DSSE-KMS를 사용할 수 있습니다.

범용 버킷의 기본 암호화 구성을 변경하는 방법에 대한 자세한 내용은 [기본 암호화 구성](default-bucket-encryption.md) 섹션을 참조하세요.

버킷의 기본 암호화 구성을 SSE-KMS로 변경해도 버킷에 있는 기존 Amazon S3 객체의 암호화 유형은 변경되지 않습니다. 기본 암호화 구성을 SSE-KMS로 업데이트한 후 기존 객체의 암호화 유형을 변경하려는 경우 Amazon S3 Batch Operations를 사용할 수 있습니다. 객체 목록을 S3 Batch Operations에 제공하면 Batch Operations가 각각의 API 작업을 직접적으로 호출합니다. [객체 복사](batch-ops-copy-object.md) 작업을 사용하면 기존 객체를 복사하여 SSE-KMS로 암호화된 객체와 동일한 버킷에 다시 쓸 수 있습니다. 단일 배치 작업 건으로 수십억 개의 객체에서 지정된 작업을 수행할 수 있습니다. 자세한 내용은 [Batch Operations를 사용하여 대량으로 객체 작업 수행](batch-ops.md) 및 *AWS Storage Blog* 게시물 [How to retroactively encrypt existing objects in Amazon S3 using S3 Inventory, Amazon Athena, and S3 Batch Operations](https://aws.amazon.com/blogs/security/how-to-retroactively-encrypt-existing-objects-in-amazon-s3-using-s3-inventory-amazon-athena-and-s3-batch-operations/)를 참조하세요.

Amazon S3 콘솔, REST API 작업, AWS SDK 및 AWS Command Line Interface(AWS CLI)를 사용하여 SSE-KMS를 지정할 수 있습니다. 자세한 내용은 다음 항목을 참조하세요.

**참고**  
Amazon S3에서 다중 리전 AWS KMS keys를 사용할 수 있습니다. 그러나 Amazon S3는 현재 다중 리전 키를 단일 리전 키인 것처럼 취급하며, 키의 다중 리전 기능을 사용하지 않습니다. 자세한 내용은 **AWS Key Management Service 개발자 안내서에서 [다중 리전 키 사용](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html)을 참조하세요.

**참고**  
다른 계정에서 소유한 KMS 키를 사용하려면 먼저 해당 키에 대한 사용 권한이 있어야 합니다. KMS 키의 크로스 계정 권한에 대한 자세한 내용은 **AWS Key Management Service 개발자 안내서에서 [다른 계정에서 사용할 수 있는 KMS 키 만들기](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console)를 참조하십시오.

## S3 콘솔 사용
<a name="add-object-encryption-kms"></a>

이 주제에서는 Amazon S3 콘솔을 사용하여 AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 통한 서버 측 암호화를 사용하도록 객체 암호화 유형을 설정하거나 변경하는 방법을 설명합니다.

**참고**  
객체의 용량이 5GB 미만인 경우 객체의 암호화를 변경할 수 있습니다. 객체가 5GB보다 큰 경우, 객체의 암호화를 변경하려면 [AWS CLI](mpu-upload-object.md#UsingCLImpUpload) 또는 [AWS SDK](CopyingObjectsMPUapi.md)를 사용해야 합니다.
객체의 암호화를 변경하는 데 필요한 추가 권한 목록은 [Amazon S3 API 작업에 필요한 권한](using-with-s3-policy-actions.md) 섹션을 참조하세요. 이 권한을 부여하는 정책의 예시는 [Amazon S3의 ID 기반 정책 예시](example-policies-s3.md) 단원을 참조하세요.
객체 암호화를 변경하면 새 객체가 생성되어 이전 객체를 대체합니다. S3 버전 관리가 사용 설정된 경우 객체의 새 버전이 생성되고 기존 객체는 이전 버전이 됩니다. 또한 속성을 변경하는 역할도 새 객체(또는 객체 버전)의 소유자가 됩니다.

**객체에 대한 암호화 추가 또는 변경**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. 탐색 창에서 **버킷**을 선택하고 **범용 버킷** 탭을 선택합니다. 변경할 객체가 포함된 Amazon S3 버킷 또는 폴더로 이동합니다.

1. 변경하려는 객체의 확인란을 선택합니다.

1. **작업** 메뉴에 표시되는 옵션 목록에서 **서버 측 암호화 편집**을 선택합니다.

1. **서버 측 암호화** 섹션으로 스크롤합니다.

1. **암호화 설정**에서 **버킷 기본 암호화 설정 사용** 또는 **기본 암호화에 버킷 설정 재정의**를 선택합니다.
**중요**  
기본 암호화 구성에 대해 SSE-KMS 옵션을 사용할 경우 AWS KMS의 초당 요청 수(RPS) 제한이 적용됩니다. AWS KMS 할당량과 할당량 증대를 요청하는 방법에 대한 자세한 내용은 **AWS Key Management Service 개발자 안내서의 [할당량](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)을 참조하세요.

1. **기본 암호화에 버킷 설정 재정의**를 선택한 경우 다음과 같은 암호화 설정을 구성해야 합니다.

   1. **암호화 유형**에서 **AWS Key Management Service  키를 사용한 서버 측 암호화(SSE-KMS)**를 선택합니다.

   1. **AWS KMS 키**에서 다음 중 하나를 수행하여 KMS 키를 선택합니다.
      + 사용 가능한 KMS 키 목록에서 **AWS KMS keys 중에서 선택**을 선택한 다음, 사용 가능한 키 목록에서 **KMS 키**를 선택합니다.

        AWS 관리형 키(`aws/s3`)와 고객 관리형 키가 모두 목록에 표시됩니다. 고객 관리형 키에 대한 자세한 내용은 *AWS Key Management Service* 개발자 안내서의 [ 고객 키 및 AWS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#key-mgmt)를 참조하세요.
      + KMS 키 ARN을 입력하려면 **AWS KMS key ARN 입력**을 선택한 다음 나타나는 필드에 KMS 키 ARN을 입력합니다.
      + AWS KMS 콘솔에서 고객 관리형 키를 생성하려면 **KMS 키 생성**을 선택합니다.

        AWS KMS key 생성에 대한 자세한 내용은 *AWS Key Management Service 개발자 가이드*의 [키 생성](https://docs.aws.amazon.com//kms/latest/developerguide/create-keys.html)을 참조하십시오.
**중요**  
버킷과 동일한 AWS 리전에서 사용할 수 있는 KMS 키만 사용 가능합니다. Amazon S3 콘솔은 버킷과 동일한 리전에 있는 처음 100개의 KMS 키만 나열합니다. 목록에 없는 KMS 키를 사용하려면 KMS 키 ARN을 입력해야 합니다. 다른 계정에서 소유한 KMS 키를 사용하려면 먼저 해당 키에 대한 사용 권한이 있어야 하고, 다음 단계로 KMS 키 ARN을 입력해야 합니다.  
Amazon S3는 대칭 암호화 KMS 키만 지원하며 비대칭 KMS 키는 지원하지 않습니다. 자세한 내용은 **AWS Key Management Service 개발자 안내서에서 [대칭 및 비대칭 KMS 키 식별](https://docs.aws.amazon.com//kms/latest/developerguide/find-symm-asymm.html)을 참조하세요.

1. **추가 복사 설정**에서 **소스 설정 복사**, **설정 지정 안 함** 또는 **설정 지정** 중 원하는 것을 선택합니다. **소스 설정 복사**가 기본 옵션입니다. 소스 설정 속성 없이 객체만 복사하려면 **설정 지정 안 함**을 선택합니다. 스토리지 클래스, ACL, 객체 태그, 메타데이터, 서버 측 암호화 및 추가 체크섬에 대한 설정을 지정하려면 **설정 지정**을 선택합니다.

1. [**변경 사항 저장(Save changes)**]을 선택합니다.

**참고**  
이 작업은 지정된 모든 객체에 암호화를 적용합니다. 폴더를 암호화할 때 폴더에 새 객체를 추가하기 전에 저장 작업이 완료될 때까지 기다립니다.

## REST API 사용
<a name="KMSUsingRESTAPI"></a>

객체를 만들 때, 즉 새 객체를 업로드하거나 기존 객체를 복사할 때 AWS KMS keys(SSE-KMS)를 통한 서버 측 암호화를 사용하여 데이터를 암호화하도록 지정할 수 있습니다. 이렇게 하려면 요청에 `x-amz-server-side-encryption` 헤더를 추가합니다. 암호화 알고리즘 `aws:kms`로 헤더의 값을 설정합니다. Amazon S3는 `x-amz-server-side-encryption` 응답 헤더를 반환하여 객체가 SSE-KMS를 사용하여 저장됨을 확인해 줍니다.

`x-amz-server-side-encryption`의 값을 사용하여 `aws:kms` 헤더를 지정하는 경우 다음 요청 헤더를 사용할 수도 있습니다.
+ `x-amz-server-side-encryption-aws-kms-key-id`
+ `x-amz-server-side-encryption-context`
+ `x-amz-server-side-encryption-bucket-key-enabled`

**Topics**
+ [

### SSE-KMS를 지원하는 Amazon S3 REST API 작업
](#sse-request-headers-kms)
+ [

### 암호화 컨텍스트(`x-amz-server-side-encryption-context`)
](#s3-kms-encryption-context)
+ [

### AWS KMS 키 ID(`x-amz-server-side-encryption-aws-kms-key-id`)
](#s3-kms-key-id-api)
+ [

### S3 버킷 키(`x-amz-server-side-encryption-aws-bucket-key-enabled`)
](#bucket-key-api)

### SSE-KMS를 지원하는 Amazon S3 REST API 작업
<a name="sse-request-headers-kms"></a>

다음 REST API 작업은 `x-amz-server-side-encryption`, `x-amz-server-side-encryption-aws-kms-key-id` 및 `x-amz-server-side-encryption-context` 요청 헤더를 수락합니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) - `PUT` API 작업을 사용하여 데이터를 업로드할 때 이러한 요청 헤더를 지정할 수 있습니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) - 객체를 복사할 때 소스 객체 및 대상 객체가 모두 있어야 합니다. `CopyObject` 작업을 사용하여 SSE-KMS 헤더를 전달할 경우 헤더가 대상 객체에만 적용됩니다. 기존 객체를 복사할 때 소스 객체의 암호화 여부와 관계없이 명시적으로 서버 측 암호화를 요청하지 않는 한 대상 객체는 암호화되지 않습니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html) - `POST` 작업을 사용하여 객체를 업로드할 경우에는 요청 헤더 대신 양식 필드에 동일한 정보를 제공합니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) - 멀티파트 업로드 API 작업을 사용하여 대형 객체를 업로드할 때 이러한 헤더를 지정할 수 있습니다. `CreateMultipartUpload` 요청에서 이 헤더를 지정합니다.

객체가 서버 측 암호화를 사용하여 저장될 경우 다음 REST API 작업의 응답 헤더는 `x-amz-server-side-encryption` 헤더를 반환합니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)

**중요**  
보안 소켓 계층(SSL), 전송 계층 보안(TLS) 또는 서명 버전 4를 사용하여 요청을 수행하지 않으면 AWS KMS로 보호되는 객체에 대한 모든 `GET` 및 `PUT` 요청이 실패합니다.
객체가 SSE-KMS를 사용하는 경우 `GET` 요청 및 `HEAD` 요청에 대해 암호화 요청 헤더를 전송하면 HTTP 400 BadRequest 오류가 발생합니다.

### 암호화 컨텍스트(`x-amz-server-side-encryption-context`)
<a name="s3-kms-encryption-context"></a>

`x-amz-server-side-encryption:aws:kms`를 지정하면 Amazon S3 API는 `x-amz-server-side-encryption-context` 헤더가 있는 암호화 컨텍스트를 지원합니다. 암호화 컨텍스트는 데이터에 대한 추가 컨텍스트 정보를 포함하는 키-값 페어 집합입니다.

Amazon S3는 자동으로 객체 또는 버킷의 Amazon 리소스 이름(ARN)을 암호화 컨텍스트 쌍으로 사용합니다. S3 버킷 키를 활성화하지 않고 SSE-KMS를 사용하는 경우 객체 ARN을 암호화 컨텍스트로 사용합니다. 예: `arn:aws:s3:::object_ARN`. 그러나 SSE-KMS를 사용하고 S3 버킷 키를 활성화하는 경우 암호화 컨텍스트에 버킷 ARN을 사용합니다. 예: `arn:aws:s3:::bucket_ARN`.

필요한 경우 `x-amz-server-side-encryption-context` 헤더를 사용하여 추가 암호화 컨텍스트 쌍을 제공할 수 있습니다. 그러나 암호화 컨텍스트는 암호화되지 않으므로 민감한 정보를 포함하지 않도록 해야 합니다. Amazon S3는 기본 암호화 컨텍스트와 함께 이 추가 키 페어를 저장합니다.

Amazon S3의 암호화 컨텍스트에 대한 자세한 내용은 [암호화 컨텍스트](UsingKMSEncryption.md#encryption-context) 단원을 참조하십시오. 암호화 컨텍스트에 대한 일반 내용은 *AWS Key Management Service 개발자 안내서*의 [AWS Key Management Service 개념 - 암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)를 참조하십시오.

### AWS KMS 키 ID(`x-amz-server-side-encryption-aws-kms-key-id`)
<a name="s3-kms-key-id-api"></a>

`x-amz-server-side-encryption-aws-kms-key-id` 헤더를 사용하여 데이터를 보호하는 데 사용되는 고객 관리형 키의 ID를 지정할 수 있습니다. `x-amz-server-side-encryption:aws:kms` 헤더를 지정하지만 `x-amz-server-side-encryption-aws-kms-key-id` 헤더를 제공하지 않는 경우 Amazon S3는 AWS 관리형 키(`aws/s3`)를 사용하여 데이터를 보호합니다. 고객 관리형 키를 사용하려면 고객 관리형 키의 `x-amz-server-side-encryption-aws-kms-key-id` 헤더를 제공해야 합니다.

**중요**  
Amazon S3에서 서버 측 암호화에 AWS KMS key을 사용하는 경우 대칭 암호화 KMS 키를 선택해야 합니다. Amazon S3는 대칭 암호화 KMS 키만 지원합니다. 이들 키에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [대칭 암호화 KMS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#symmetric-cmks)를 참조하십시오.

### S3 버킷 키(`x-amz-server-side-encryption-aws-bucket-key-enabled`)
<a name="bucket-key-api"></a>

`x-amz-server-side-encryption-aws-bucket-key-enabled` 요청 헤더를 사용하여 객체 수준에서 S3 버킷 키를 활성화하거나 비활성화할 수 있습니다. S3 버킷 키는 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS KMS 요청 비용을 줄입니다. 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 섹션을 참조하세요.

`x-amz-server-side-encryption:aws:kms` 헤더를 지정하되 `x-amz-server-side-encryption-aws-bucket-key-enabled` 헤더를 제공하지 않은 경우 객체는 대상 버킷에 대한 S3 버킷 키 설정을 사용하여 객체를 암호화합니다. 자세한 내용은 [객체 수준에서 S3 버킷 키 구성](configuring-bucket-key-object.md) 섹션을 참조하세요.

## AWS CLI 사용
<a name="KMSUsingCLI"></a>

다음 예시 AWS CLI 명령을 사용하려면 `user input placeholders`를 실제 정보로 대체하세요.

새 객체를 업로드하거나 기존 객체를 복사할 때 AWS KMS 키를 사용하여 서버 측 암호화를 통해 데이터를 암호화하도록 지정할 수 있습니다. 이렇게 하려면 요청에 `--server-side-encryption aws:kms` 헤더를 추가합니다. `--ssekms-key-id example-key-id`를 사용하여, 생성해둔 [고객 관리형 AWS KMS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#customer-cmk)를 추가합니다. AWS KMS를 지정했지만 `--server-side-encryption aws:kms` 키 ID를 제공하지 않으면, Amazon S3가 AWS 관리형 키를 사용합니다.

```
aws s3api put-object --bucket amzn-s3-demo-bucket --key example-object-key --server-side-encryption aws:kms --ssekms-key-id example-key-id --body filepath
```

`--bucket-key-enabled` 또는 `--no-bucket-key-enabled`를 추가하면 PUT 또는 COPY 작업에서 Amazon S3 버킷 키를 추가로 활성화하거나 비활성화할 수 있습니다. Amazon S3 버킷 키는 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS KMS 요청 비용을 줄일 수 있습니다. 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](https://docs.aws.amazon.com//AmazonS3/latest/userguide/bucket-key.html)을 참조하십시오.

```
aws s3api put-object --bucket amzn-s3-demo-bucket --key example-object-key --server-side-encryption aws:kms --bucket-key-enabled --body filepath
```

암호화되지 않은 객체를 암호화하면, 해당 객체를 제자리에 복사하여 SSE-KMS를 사용할 수 있습니다.

```
aws s3api copy-object --bucket amzn-s3-demo-bucket --key example-object-key --body filepath --bucket amzn-s3-demo-bucket --key example-object-key --sse aws:kms --sse-kms-key-id example-key-id --body filepath
```

## AWS SDK 사용
<a name="kms-using-sdks"></a>

AWS SDK를 사용하는 경우 서버 측 암호화에 AWS KMS keys를 사용하도록 Amazon S3에 요청할 수 있습니다. 다음 예시에서는 Java 및 .NET용 AWS SDK와 함께 SSE-KMS를 사용하는 방법을 보여줍니다. 다른 SDK 사용에 대한 자세한 내용은 AWS 개발자 센터의 [샘플 코드 및 라이브러리](https://aws.amazon.com/code)를 참조하세요.

**중요**  
Amazon S3에서 서버 측 암호화에 AWS KMS key을 사용하는 경우 대칭 암호화 KMS 키를 선택해야 합니다. Amazon S3는 대칭 암호화 KMS 키만 지원합니다. 이들 키에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [대칭 암호화 KMS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#symmetric-cmks)를 참조하십시오.

### `CopyObject` 작업
<a name="kms-copy-operation"></a>

객체를 복사할 때 동일한 요청 속성(`ServerSideEncryptionMethod` 및 `ServerSideEncryptionKeyManagementServiceKeyId`)을 추가하여 Amazon S3에서 AWS KMS key를 사용하도록 요청합니다. 객체 복사에 대한 자세한 내용은 [객체 복사, 이동, 이름 변경](copy-object.md) 단원을 참조하십시오.

### `PUT` 작업
<a name="kms-put-operation"></a>

------
#### [ Java ]

AWS SDK for Java를 사용하여 객체를 업로드할 때 다음 요청에 표시된 대로 `SSEAwsKeyManagementParams` 속성을 추가하여 Amazon S3에서 AWS KMS key를 사용하도록 요청할 수 있습니다.

```
PutObjectRequest putRequest = new PutObjectRequest(bucketName,
   keyName, file).withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams());
```

이 경우 Amazon S3는 AWS 관리형 키(`aws/s3`)를 사용합니다. 자세한 내용은 [AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용](UsingKMSEncryption.md) 섹션을 참조하세요. 필요한 경우 대칭 암호화 KMS 키를 생성하고 다음 예시와 같이 요청에서 지정할 수 있습니다.

```
PutObjectRequest putRequest = new PutObjectRequest(bucketName,
   keyName, file).withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams(keyID));
```

고객 관리형 키 생성에 대한 자세한 내용은 *AWS Key Management Service 개발자 가이드*의 [AWS KMS API 프로그래밍](https://docs.aws.amazon.com/kms/latest/developerguide/programming-top.html)을 참조하십시오.

객체를 업로드하는 사용 가능한 코드 예제는 다음 주제를 참조하십시오. 이 예시를 사용하려면 코드 예시를 업데이트하고 이전 코드 조각에서 표시된 바와 같이 암호화 정보를 제공해야 합니다.
+ 단일 작업으로 객체를 업로드하려면 [객체 업로드](upload-objects.md) 단원을 참조하십시오.
+ 상위 수준 또는 하위 수준의 멀티파트 업로드 API 작업을 사용하는 멀티파트 업로드에 대해서는 [멀티파트 업로드를 사용한 객체 업로드](mpu-upload-object.md) 섹션을 참조하세요.

------
#### [ .NET ]

AWS SDK for .NET를 사용하여 객체를 업로드할 때 다음 요청에 표시된 대로 `ServerSideEncryptionMethod` 속성을 추가하여 Amazon S3에서 AWS KMS key를 사용하도록 요청할 수 있습니다.

```
PutObjectRequest putRequest = new PutObjectRequest
 {
     BucketName = amzn-s3-demo-bucket,
     Key = keyName,
     // other properties
     ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS
 };
```

이 경우 Amazon S3는 AWS 관리형 키를 사용합니다. 자세한 내용은 [AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용](UsingKMSEncryption.md) 섹션을 참조하세요. 필요한 경우 자체적인 대칭 암호화 고객 관리형 키를 생성하고 다음 예시와 같이 요청에서 지정할 수 있습니다.

```
PutObjectRequest putRequest1 = new PutObjectRequest
{
  BucketName = amzn-s3-demo-bucket,
  Key = keyName,
  // other properties
  ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS,
  ServerSideEncryptionKeyManagementServiceKeyId = keyId
};
```

고객 관리형 키 생성에 대한 자세한 내용은 *AWS Key Management Service 개발자 가이드*의 [AWS KMS API 프로그래밍](https://docs.aws.amazon.com/kms/latest/developerguide/programming-top.html)을 참조하십시오.

객체를 업로드하는 사용 가능한 코드 예제는 다음 주제를 참조하십시오. 이 예시를 사용하려면 코드 예시를 업데이트하고 이전 코드 조각에서 표시된 바와 같이 암호화 정보를 제공해야 합니다.
+ 단일 작업으로 객체를 업로드하려면 [객체 업로드](upload-objects.md) 단원을 참조하십시오.
+ 상위 수준 또는 하위 수준의 멀티파트 업로드 API 작업을 사용하는 멀티파트 업로드에 대해서는 [멀티파트 업로드를 사용한 객체 업로드](mpu-upload-object.md) 섹션을 참조하세요.

------

### 미리 서명된 URL
<a name="kms-presigned-urls"></a>

------
#### [ Java ]

AWS KMS key를 사용하여 암호화된 객체에 대해 미리 서명된 URL을 생성할 때 다음 예시와 같이 서명 버전 4를 명시적으로 지정해야 합니다.

```
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setSignerOverride("AWSS3V4SignerType");
AmazonS3Client s3client = new AmazonS3Client(
        new ProfileCredentialsProvider(), clientConfiguration);
...
```

코드에 대한 예는 [미리 서명된 URL을 통해 객체 공유](ShareObjectPreSignedURL.md) 단원을 참조하세요.

------
#### [ .NET ]

AWS KMS key를 사용하여 암호화된 객체에 대해 미리 서명된 URL을 생성할 때 다음 예시와 같이 서명 버전 4를 명시적으로 지정해야 합니다.

```
AWSConfigs.S3Config.UseSignatureVersion4 = true;
```

코드에 대한 예는 [미리 서명된 URL을 통해 객체 공유](ShareObjectPreSignedURL.md) 섹션을 참조하세요.

------

# Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감
<a name="bucket-key"></a>

Amazon S3 버킷 키는 AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 사용하여 Amazon S3 서버 측 암호화 비용을 절감합니다. SSE-KMS용 버킷 수준 키를 사용하면 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS KMS 요청 비용을 최대 99%까지 줄일 수 있습니다. AWS Management Console에서 몇 번만 클릭하면 클라이언트 애플리케이션을 변경하지 않고도 새 객체에 대한 SSE-KMS 암호화에 S3 버킷 키를 사용하도록 버킷을 구성할 수 있습니다.

**참고**  
S3 버킷 키는 AWS Key Management Service(AWS KMS) 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)에 지원되지 않습니다.

## SSE-KMS용 S3 버킷 키
<a name="bucket-key-overview"></a>

SSE-KMS로 암호화된 수백만 또는 수십억 개의 객체에 액세스하는 워크로드는 AWS KMS에 대한 대규모 볼륨 요청을 생성할 수 있습니다. S3 버킷 키 없이 SSE-KMS를 사용하여 데이터를 보호하는 경우 Amazon S3는 모든 객체에 대해 개별 AWS KMS [데이터 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)를 사용합니다. 이 경우, Amazon S3는 KMS 암호화 객체에 대해 요청이 이루어질 때마다 AWS KMS를 호출합니다. SSE-KMS 작동 방식에 대한 자세한 내용은 [AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용](UsingKMSEncryption.md) 단원을 참조하십시오.

SSE-KMS에 S3 버킷 키를 사용하도록 버킷을 구성하면, AWS가 AWS KMS에서 수명이 짧은 버킷 수준 키를 생성하여 S3 내에 임시로 보관합니다. 이 버킷 수준 키는 수명 주기 동안 새 객체의 데이터 키를 생성합니다. S3 버킷 키는 Amazon S3 내에서 제한된 기간 동안 사용되므로 S3가 암호화 작업을 완료하기 위해 AWS KMS에 요청할 필요성이 줄어듭니다. 이렇게 하면 S3에서 AWS KMS로 가는 트래픽이 줄어들어, 이전 비용의 일부만 부담하면 Amazon S3의 AWS KMS 암호화 객체에 액세스할 수 있습니다.

요청자의 키 액세스가 AWS KMS CloudTrail 이벤트에서 캡처되도록 요청자당 최소 한 번은 고유한 버킷 수준 키를 가져옵니다. Amazon S3는 호출자가 서로 다른 역할 또는 계정을 사용하거나 범위 지정 정책이 다른 동일한 역할을 사용하는 경우 호출자를 다른 요청자로 취급합니다. AWS KMS 요청 절감액에는 요청자 수, 요청 패턴 및 요청된 객체의 상대적 기간이 반영됩니다. 예를 들어, 요청자 수가 적고 제한된 시간 내에 여러 객체를 요청한다면, 동일한 버킷 수준 키로 암호화해도 절감 효과가 큽니다.

**참고**  
S3 버킷 키를 사용하면 버킷 수준 키를 사용하여 `Encrypt`, `GenerateDataKey`, `Decrypt` 작업에 대한 AWS KMS 요청을 줄여 AWS KMS 요청 비용을 절감할 수 있습니다. 설계상 이 버킷 수준 키를 이용하는 후속 요청은 AWS KMS API 요청으로 이어지지 않으며 AWS KMS 키 정책에 대한 액세스를 검증하지 않습니다.

S3 버킷 키를 구성할 때 이미 버킷에 있는 객체에는 S3 버킷 키가 사용되지 않습니다. 기존 객체에 대해 S3 버킷 키를 구성하려면 `CopyObject` 작업을 사용하면 됩니다. 자세한 내용은 [객체 수준에서 S3 버킷 키 구성](configuring-bucket-key-object.md) 섹션을 참조하세요.

Amazon S3는 동일한 AWS KMS key로 암호화된 객체에 대해서만 S3 버킷 키를 공유합니다. S3 버킷 키는 AWS KMS에서 생성한 KMS 키, [가져온 키 구성 요소](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html) 및 [사용자 지정 키 스토어가 지원하는 키 구성 요소](https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html)와 호환됩니다.

![\[버킷의 객체에 대한 데이터 키를 만드는 버킷 키를 생성하는 AWS KMS를 보여 주는 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/S3-Bucket-Keys.png)


## S3 버킷 키 구성
<a name="configure-bucket-key"></a>

Amazon S3 콘솔, AWS SDK, AWS CLI 또는 REST API를 통해 새 객체에 SSE-KMS용 S3 버킷 키를 사용하도록 버킷을 구성할 수 있습니다. 버킷에서 S3 버킷 키가 활성화되면, SSE-KMS 키가 별도로 지정된 채로 업로드된 객체는 자체 S3 버킷 키를 사용합니다. S3 버킷 키 설정과 무관하게 `true` 또는 `false` 값이 있는 `x-amz-server-side-encryption-bucket-key-enabled` 헤더를 요청에 포함하면 버킷 설정을 재정의할 수 있습니다.

S3 버킷 키를 사용하도록 버킷을 구성하기 전에 [S3 버킷 키를 사용 설정하기 전에 유의할 변경 사항](#bucket-key-changes)을(를) 검토하세요.

### Amazon S3 콘솔을 사용하여 S3 버킷 키 구성
<a name="configure-bucket-key-console"></a>

새 버킷을 생성할 때 새 객체에 SSE-KMS용 S3 버킷 키를 사용하도록 버킷을 구성할 수 있습니다. 버킷 속성을 업데이트하여 새 객체에 SSE-KMS용 S3 버킷 키를 사용하도록 기존 버킷을 구성할 수도 있습니다. 

자세한 내용은 [새 객체에 SSE-KMS와 함께 S3 버킷 키를 사용하도록 버킷 구성](configuring-bucket-key.md) 섹션을 참조하세요.

### S3 버킷 키에 대한 REST API, AWS CLI 및 AWS SDK 지원
<a name="configure-bucket-key-programmatic"></a>

REST API, AWS CLI 또는 AWS SDK를 사용하여 새 객체에서 SSE-KMS용 S3 버킷 키를 사용하도록 버킷을 구성할 수 있습니다. 객체 수준에서 S3 버킷 키를 사용 설정할 수도 있습니다.

자세한 내용은 다음을 참조하세요. 
+ [객체 수준에서 S3 버킷 키 구성](configuring-bucket-key-object.md)
+ [새 객체에 SSE-KMS와 함께 S3 버킷 키를 사용하도록 버킷 구성](configuring-bucket-key.md)

다음 API 작업은 SSE-KMS에 대한 S3 버킷 키를 지원합니다.
+ [PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html)
  + `ServerSideEncryptionRule`은(는) S3 버킷 키를 사용 설정 및 사용 중지하기 위한 `BucketKeyEnabled` 파라미터를 허용합니다.
+ [GetBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html)
  + `ServerSideEncryptionRule`은(는) 에 대한 설정을 반환합니다.`BucketKeyEnabled`
+ [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html), [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html), [CreateMutlipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) 및 [POST Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)
  + `x-amz-server-side-encryption-bucket-key-enabled` 요청 헤더는 객체 수준에서 S3 버킷 키를 활성화하거나 비활성화합니다.
+ [HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html), [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html), [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html), [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) 및 [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
  + `x-amz-server-side-encryption-bucket-key-enabled` 응답 헤더는 S3 버킷 키가 객체에 대해 활성화 또는 비활성화되었는지 여부를 나타냅니다.

### CloudFormation 작업
<a name="configure-bucket-key-cfn"></a>

CloudFormation에서 `AWS::S3::Bucket` 리소스에는 S3 버킷 키를 사용하거나 사용 중지하는 데 사용할 수 있는 `BucketKeyEnabled`라는 암호화 속성이 포함되어 있습니다.

자세한 내용은 [사용CloudFormation](configuring-bucket-key.md#enable-bucket-key-cloudformation) 섹션을 참조하십시오.

## S3 버킷 키를 사용 설정하기 전에 유의할 변경 사항
<a name="bucket-key-changes"></a>

S3 버킷 키를 활성화하기 전에 다음과 같은 관련 변경 사항에 유의하십시오.

### IAM 및 AWS KMS 키 정책
<a name="bucket-key-policies"></a>

기존 AWS Identity and Access Management(IAM) 정책 또는 AWS KMS 키 정책이 객체 Amazon 리소스 이름(ARN)을 암호화 컨텍스트로 사용하여 KMS 키에 대한 액세스를 구체화하거나 제한하는 경우, 이러한 정책은 S3 버킷 키와 함께 작동하지 않습니다. S3 버킷 키는 버킷 ARN을 암호화 컨텍스트로 사용합니다. S3 버킷 키를 사용하기 전에 버킷 ARN을 암호화 컨텍스트로 사용하도록 IAM 정책 또는 AWS KMS 키 정책을 업데이트합니다.

암호화 컨텍스트 및 S3 버킷 키에 대한 자세한 내용은 [암호화 컨텍스트](UsingKMSEncryption.md#encryption-context) 섹션을 참조하십시오.

### AWS KMS에 대한 CloudTrail 이벤트
<a name="bucket-key-cloudtrail"></a>

S3 버킷 키를 사용하면 AWS KMS CloudTrail 이벤트가 객체 ARN 대신 버킷 ARN을 기록합니다. 또한, 로그에 SSE-KMS 객체에 대한 KMS CloudTrail 이벤트가 줄어든 것을 확인할 수 있습니다. Amazon S3에서 키 구성 요소의 시간은 제한되어 있으므로 AWS KMS에 대한 요청 수가 줄어듭니다.

## 복제와 함께 S3 버킷 키 사용
<a name="bucket-key-replication"></a>

S3 버킷 키를 동일 리전 복제(SRR) 및 교차 리전 복제(CRR)와 함께 사용할 수 있습니다.

Amazon S3는 암호화된 객체를 복제할 때 일반적으로 대상 버킷에 복제본 객체의 암호화 설정을 보존합니다. 그러나 원본 객체가 암호화되지 않고 대상 버킷에서 기본 암호화 또는 S3 버킷 키를 사용하는 경우, Amazon S3는 대상 버킷의 구성으로 객체를 암호화합니다.

다음 예에서는 S3 버킷 키가 복제와 함께 작동하는 방식을 보여 줍니다. 자세한 내용은 [암호화(SSE-S3, SSE-KMS, DSSE-KMS, SSE-C)된 객체 복제](replication-config-for-kms-objects.md) 섹션을 참조하세요. 

**Example 예시 1 – 소스 객체가 S3 버킷 키를 사용하고 대상 버킷은 기본 암호화를 사용합니다.**  
원본 객체가 S3 버킷 키를 사용하지만 대상 버킷은 SSE-KMS와 함께 기본 암호화를 사용하는 경우, 복제본 객체는 대상 버킷에서 S3 버킷 키 암호화 설정을 유지합니다. 대상 버킷은 여전히 SSE-KMS와 함께 기본 암호화를 사용합니다.  


**Example 예시 2 – 소스 객체가 암호화되지 않았고 대상 버킷은 SSE-KMS와 함께 S3 버킷 키를 사용합니다.**  
소스 객체가 암호화되지 않았고 대상 버킷은 SSE-KMS와 함께 S3 버킷 키를 사용하는 경우, 복제본 객체는 대상 버킷에서 SSE-KMS와 함께 S3 버킷 키로 암호화됩니다. 결과적으로 원본 객체의 `ETag`는 복제본 객체의 `ETag`와 다릅니다. 이러한 차이점을 수용하도록 `ETag`를 사용하는 애플리케이션을 업데이트해야 합니다.

## S3 버킷 키를 사용한 작업
<a name="using-bucket-key"></a>

S3 버킷 키 사용 설정 및 사용에 대한 자세한 내용은 다음 섹션을 참조하십시오.
+ [새 객체에 SSE-KMS와 함께 S3 버킷 키를 사용하도록 버킷 구성](configuring-bucket-key.md)
+ [객체 수준에서 S3 버킷 키 구성](configuring-bucket-key-object.md)
+ [S3 버킷 키에 대한 설정 보기](viewing-bucket-key-settings.md)

# 새 객체에 SSE-KMS와 함께 S3 버킷 키를 사용하도록 버킷 구성
<a name="configuring-bucket-key"></a>

AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 통해 서버 측 암호화를 구성할 때 새 객체에서 SSE-KMS용 S3 버킷 키를 사용하도록 버킷을 구성할 수 있습니다. S3 버킷 키는 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄이고 SSE-KMS 비용을 절감합니다. 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 섹션을 참조하세요.

Amazon S3 콘솔, REST API, AWS SDK, AWS Command Line Interface(AWS CLI) 또는 CloudFormation을 사용하여 새 객체에 SSE-KMS용 S3 버킷 키를 사용하도록 버킷을 구성할 수 있습니다. 기존 객체에 대해 S3 버킷 키를 사용하거나 사용 중지하려는 경우 `CopyObject` 작업을 사용할 수 있습니다. 자세한 내용은 [객체 수준에서 S3 버킷 키 구성](configuring-bucket-key-object.md) 및 [Batch Operations를 사용하여 SSE-KMS용 S3 버킷 키 활성화](batch-ops-copy-example-bucket-key.md) 섹션을 참조하십시오.

원본 또는 대상 버킷에 대해 S3 버킷 키가 사용 설정되면 암호화 컨텍스트는 객체 ARN이 아니라 버킷 Amazon 리소스 이름(ARN)이 됩니다. 예: `arn:aws:s3:::bucket_ARN`. 암호화 컨텍스트에 버킷 ARN을 사용하려면 IAM 정책을 업데이트해야 합니다. 자세한 내용은 [S3 버킷 키 및 복제](replication-config-for-kms-objects.md#bk-replication) 섹션을 참조하세요.

다음 예에서는 S3 버킷 키가 복제와 함께 작동하는 방식을 보여 줍니다. 자세한 내용은 [암호화(SSE-S3, SSE-KMS, DSSE-KMS, SSE-C)된 객체 복제](replication-config-for-kms-objects.md) 섹션을 참조하세요. 

**사전 조건**  
S3 버킷 키를 사용하도록 버킷을 구성하기 전에 [S3 버킷 키를 사용 설정하기 전에 유의할 변경 사항](bucket-key.md#bucket-key-changes)을(를) 검토하십시오.

**Topics**

## S3 콘솔 사용
<a name="enable-bucket-key"></a>

S3 콘솔에서 새 버킷 또는 기존 버킷에 대해 S3 버킷 키를 사용 설정하거나 사용 중지할 수 있습니다. S3 콘솔의 객체는 버킷 구성에서 S3 버킷 키 설정을 상속합니다. 버킷에 대해 S3 버킷 키를 활성화하면 버킷에 업로드하는 새 객체는 SSE-KMS용 S3 버킷 키를 사용합니다.

**S3 버킷 키가 사용 설정된 버킷의 객체 업로드, 복사 또는 수정**  
S3 버킷 키가 활성화된 버킷의 객체를 업로드, 수정 또는 복사하는 경우 해당 객체에 대한 S3 버킷 키 설정이 버킷 구성에 맞게 업데이트될 수 있습니다.

객체에 이미 S3 버킷 키가 사용 설정되어 있으면 객체를 복사하거나 수정할 때 해당 객체에 대한 S3 버킷 키 설정이 변경되지 않습니다. 그러나 S3 버킷 키가 사용 설정되지 않은 객체를 수정하거나 복사하고 대상 버킷에 S3 버킷 키 구성이 있으면 객체는 대상 버킷의 S3 버킷 키 설정을 상속합니다. 예를 들어, 소스 객체에 S3 버킷 키가 활성화되어 있지 않지만 대상 버킷에 S3 버킷 키가 활성화되어 있으면 객체에 대해 S3 버킷 키가 활성화됩니다.

**새 버킷을 생성할 때 S3 버킷 키 사용 설정**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷 만들기**를 선택합니다.

1. 버킷 이름을 입력하고 AWS 리전을 선택합니다.

1. **기본 암호화**의 **암호화 키 유형**에서 **AWS Key Management Service 키(SSE-KMS)**를 선택합니다.

1. **AWS KMS 키**에서 다음 중 하나를 수행하여 KMS 키를 선택합니다.
   + 사용 가능한 KMS 키 목록에서 **AWS KMS keys 중에서 선택**을 선택한 다음, 사용 가능한 키 목록에서 **KMS 키**를 선택합니다.

     AWS 관리형 키(`aws/s3`)와 고객 관리형 키가 모두 목록에 표시됩니다. 고객 관리형 키에 대한 자세한 내용은 *AWS Key Management Service* 개발자 안내서의 [ 고객 키 및 AWS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#key-mgmt)를 참조하십시오.
   + KMS 키 ARN을 입력하려면 **AWS KMS key ARN 입력**을 선택하고 나타나는 필드에 KMS 키 ARN을 입력합니다.
   + AWS KMS 콘솔에서 고객 관리형 키를 생성하려면 **KMS 키 생성**을 선택합니다.

     AWS KMS key 생성에 대한 자세한 내용은 *AWS Key Management Service 개발자 가이드*의 [키 생성](https://docs.aws.amazon.com//kms/latest/developerguide/create-keys.html)을 참조하십시오.

1. **버킷 키(Bucket Key)**에서 **사용(Enable)**을 선택합니다.

1. **버킷 만들기**를 선택합니다.

   Amazon S3는 S3 버킷 키가 사용 설정된 버킷을 생성합니다. 버킷에 업로드하는 새 객체는 S3 버킷 키를 사용합니다. 

   S3 버킷 키를 사용 중지하려면 이전 단계를 따르고 **사용 중지(Disable)**를 선택합니다.

**기존 버킷에 대해 S3 버킷 키 사용 설정**

1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷**을 선택합니다.

1. **버킷(Buckets)** 목록에서 S3 버킷 키를 사용 설정할 버킷을 선택합니다.

1. **속성** 탭을 선택합니다.

1. **기본 암호화**에서 **편집**을 선택합니다.

1. **기본 암호화**의 **암호화 키 유형**에서 **AWS Key Management Service 키(SSE-KMS)**를 선택합니다.

1. **AWS KMS 키**에서 다음 중 하나를 수행하여 KMS 키를 선택합니다.
   + 사용 가능한 KMS 키 목록에서 **AWS KMS keys 중에서 선택**을 선택한 다음, 사용 가능한 키 목록에서 **KMS 키**를 선택합니다.

     AWS 관리형 키(`aws/s3`)와 고객 관리형 키가 모두 목록에 표시됩니다. 고객 관리형 키에 대한 자세한 내용은 *AWS Key Management Service* 개발자 안내서의 [ 고객 키 및 AWS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#key-mgmt)를 참조하십시오.
   + KMS 키 ARN을 입력하려면 **AWS KMS key ARN 입력**을 선택하고 나타나는 필드에 KMS 키 ARN을 입력합니다.
   + AWS KMS 콘솔에서 고객 관리형 키를 생성하려면 **KMS 키 생성**을 선택합니다.

     AWS KMS key 생성에 대한 자세한 내용은 *AWS Key Management Service 개발자 가이드*의 [키 생성](https://docs.aws.amazon.com//kms/latest/developerguide/create-keys.html)을 참조하십시오.

1. **버킷 키(Bucket Key)**에서 **사용(Enable)**을 선택합니다.

1. [**변경 사항 저장(Save changes)**]을 선택합니다.

   Amazon S3는 버킷에 추가된 새 객체에 대해 S3 버킷 키를 사용 설정합니다. 기존 객체는 S3 버킷 키를 사용하지 않습니다. 기존 객체에 대해 S3 버킷 키를 구성하려면 `CopyObject` 작업을 사용하면 됩니다. 자세한 내용은 [객체 수준에서 S3 버킷 키 구성](configuring-bucket-key-object.md) 섹션을 참조하세요.

   S3 버킷 키를 사용 중지하려면 이전 단계를 따르고 **사용 중지(Disable)**를 선택합니다.

## REST API 사용
<a name="enable-bucket-key-rest"></a>

[PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html)을 선택하여 버킷에 대한 S3 버킷 키를 사용하거나 사용 중지할 수 있습니다. `PutBucketEncryption`에서 S3 버킷 키를 구성하려면 [ServerSideEncryptionRule](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ServerSideEncryptionRule.html) 데이터 유형을 사용합니다. 여기에는 SSE-KMS를 사용하는 기본 암호화가 포함되어 있습니다. 원하면 고객 관리형 키에 대한 KMS 키 ID를 지정하여 고객 관리형 키를 사용할 수도 있습니다.  

자세한 내용과 예제 구문에 대해서는 [PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html)을 참조하십시오.

## Java용 AWS SDK 사용
<a name="enable-bucket-key-sdk"></a>

다음 예시에서는 AWS SDK for Java를 사용하여 SSE-KMS 및 S3 버킷 키로 기본 버킷 암호화를 사용합니다.

------
#### [ Java ]

```
AmazonS3 s3client = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.DEFAULT_REGION)
    .build();
    
ServerSideEncryptionByDefault serverSideEncryptionByDefault = new ServerSideEncryptionByDefault()
    .withSSEAlgorithm(SSEAlgorithm.KMS);
ServerSideEncryptionRule rule = new ServerSideEncryptionRule()
    .withApplyServerSideEncryptionByDefault(serverSideEncryptionByDefault)
    .withBucketKeyEnabled(true);
ServerSideEncryptionConfiguration serverSideEncryptionConfiguration =
    new ServerSideEncryptionConfiguration().withRules(Collections.singleton(rule));

SetBucketEncryptionRequest setBucketEncryptionRequest = new SetBucketEncryptionRequest()
    .withServerSideEncryptionConfiguration(serverSideEncryptionConfiguration)
    .withBucketName(bucketName);
            
s3client.setBucketEncryption(setBucketEncryptionRequest);
```

------

## AWS CLI 사용
<a name="enable-bucket-key-cli"></a>

다음 예시에서는 AWS CLI를 사용하여 SSE-KMS 및 S3 버킷 키로 기본 버킷 암호화를 사용합니다. `user input placeholders`를 사용자의 정보로 대체합니다.

```
aws s3api put-bucket-encryption --bucket amzn-s3-demo-bucket --server-side-encryption-configuration '{
        "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "aws:kms",
                    "KMSMasterKeyID": "KMS-Key-ARN"
                },
                "BucketKeyEnabled": true
            }
        ]
    }'
```

## 사용CloudFormation
<a name="enable-bucket-key-cloudformation"></a>

CloudFormation을 통해 S3 버킷 키를 구성하는 방법에 대한 자세한 내용은 **AWS CloudFormation 사용 설명서의 [AWS::S3::Bucket ServerSideEncryptionRule](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html)을 참조하십시오.

# 객체 수준에서 S3 버킷 키 구성
<a name="configuring-bucket-key-object"></a>

REST API, AWS SDK 또는 AWS CLI를 사용하여 PUT 또는 COPY 작업을 수행할 때 `true` 또는 `false` 값이 있는 `x-amz-server-side-encryption-bucket-key-enabled` 요청 헤더를 추가하면 객체 수준에서 S3 버킷 키를 활성화하거나 비활성화할 수 있습니다. S3 버킷 키는 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS Key Management Service(AWS KMS)(SSE-KMS)를 사용한 서버 측 암호화 비용을 절감합니다. 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 섹션을 참조하세요.

PUT 또는 COPY 작업을 사용하여 객체에 대한 S3 버킷 키를 구성하면 Amazon S3는 해당 객체에 대한 설정만 업데이트합니다. 대상 버킷에 대한 S3 버킷 키 설정은 변경되지 않습니다. KMS로 암호화된 객체에 대한 PUT 또는 COPY 요청을 S3 버킷 키가 활성화된 버킷에 제출하면, 요청 헤더에서 키를 비활성화하지 않은 한 객체 수준 작업에서 자동으로 S3 버킷 키를 사용합니다. 객체에 S3 버킷 키를 지정하지 않으면 Amazon S3가 대상 버킷에 대한 S3 버킷 키 설정을 객체에 적용합니다.

**사전 조건:**  
S3 버킷 키를 사용하도록 객체를 구성하기 전에 [S3 버킷 키를 사용 설정하기 전에 유의할 변경 사항](bucket-key.md#bucket-key-changes)을(를) 검토하십시오.

**Topics**
+ [

## Amazon S3 배치 작업
](#bucket-key-object-bops)
+ [

## REST API 사용
](#bucket-key-object-rest)
+ [

## Java용 AWS SDK(PutObject) 사용
](#bucket-key-object-sdk)
+ [

## AWS CLI(PutObject) 사용
](#bucket-key-object-cli)

## Amazon S3 배치 작업
<a name="bucket-key-object-bops"></a>

기존 Amazon S3 객체를 암호화하기 위해 Amazon S3 배치 작업을 사용할 수 있습니다. 작업할 객체 목록을 S3 배치 작업에 제공하면 배치 작업은 각각의 API를 호출하여 지정된 작업을 수행합니다.

[S3 배치 작업 복사 작업](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-copy-object.html)을 사용하여 암호화되지 않은 기존 객체를 복사하고 암호화된 새로운 객체를 동일한 버킷에 작성할 수 있습니다. 단일 배치 작업 건으로 수십억 개의 객체에서 지정된 작업을 수행할 수 있습니다. 자세한 내용은 [Batch Operations를 사용하여 대량으로 객체 작업 수행](batch-ops.md) 및 [Amazon S3 Batch Operations에서 객체 암호화](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations/)를 참조하십시오.

## REST API 사용
<a name="bucket-key-object-rest"></a>

SSE-KMS를 사용하면 다음 API 작업을 사용하여 객체에 대해 S3 버킷 키를 활성화할 수 있습니다.
+ [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) – 객체를 업로드하면 `x-amz-server-side-encryption-bucket-key-enabled` 요청 헤더를 지정하여 객체 레벨에서 S3 버킷 키를 사용 설정하거나 사용 중지할 수 있습니다.
+ [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) – 객체를 복사하고 SSE-KMS를 구성하면 `x-amz-server-side-encryption-bucket-key-enabled` 요청 헤더를 지정하여 객체에 대한 S3 버킷 키를 사용 설정하거나 사용 중지할 수 있습니다.
+ [Post Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html) – `POST` 작업을 사용하여 객체를 업로드하고 SSE-KMS를 구성하면 `x-amz-server-side-encryption-bucket-key-enabled` 양식 필드를 사용하여 객체에 대한 S3 버킷 키를 활성화하거나 비활성화할 수 있습니다.
+ [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) – `CreateMultipartUpload` API 작업을 사용하여 대용량 객체를 업로드하고 SSE-KMS를 구성하면 `x-amz-server-side-encryption-bucket-key-enabled` 요청 헤더를 사용하여 객체에 대한 S3 버킷 키를 활성화하거나 비활성화할 수 있습니다.

객체 수준에서 S3 버킷 키를 사용 설정하려면 `x-amz-server-side-encryption-bucket-key-enabled` 요청 헤더를 포함합니다. SSE-KMS 및 REST API에 대한 자세한 내용은 [REST API 사용](specifying-kms-encryption.md#KMSUsingRESTAPI) 단원을 참조하십시오.

## Java용 AWS SDK(PutObject) 사용
<a name="bucket-key-object-sdk"></a>

다음 예제를 사용하여 AWS SDK for Java를 사용해 객체 수준에서 S3 버킷 키를 구성할 수 있습니다.

------
#### [ Java ]

```
AmazonS3 s3client = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.DEFAULT_REGION)
    .build();

String bucketName = "amzn-s3-demo-bucket1";
String keyName = "key name for object";
String contents = "file contents";

PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, keyName, contents)
    .withBucketKeyEnabled(true);
    
s3client.putObject(putObjectRequest);
```

------

## AWS CLI(PutObject) 사용
<a name="bucket-key-object-cli"></a>

다음 AWS CLI 예제를 사용하여 `PutObject` 요청의 일부로 객체 수준에서 S3 버킷 키를 구성할 수 있습니다.

```
aws s3api put-object --bucket amzn-s3-demo-bucket --key object key name --server-side-encryption aws:kms --bucket-key-enabled --body filepath
```

# S3 버킷 키에 대한 설정 보기
<a name="viewing-bucket-key-settings"></a>

Amazon S3 콘솔, REST API, AWS Command Line Interface(AWS CLI) 또는 AWS SDK를 사용하여 버킷 수준 또는 객체 수준에서 S3 버킷 키에 대한 설정을 볼 수 있습니다.

S3 버킷 키는 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS Key Management Service(SSE-KMS)를 사용한 서버 측 암호화 비용을 절감합니다. 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 섹션을 참조하세요.

버킷 구성에서 S3 버킷 키 설정을 상속받은 버킷 또는 객체에 대한 S3 버킷 키 설정을 보려면 `s3:GetEncryptionConfiguration` 작업을 수행할 권한이 필요합니다. 자세한 내용은 *Amazon Simple Storage Service API Reference*의 [GetBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html)을 참조하세요.

## S3 콘솔 사용
<a name="bucket-key-settings"></a>

S3 콘솔에서 버킷 또는 객체에 대한 S3 버킷 키 설정을 볼 수 있습니다. S3 버킷 키 설정은 원본 객체에 S3 버킷 키가 이미 구성되어 있는 경우를 제외하고는 버킷 구성에서 상속됩니다.

동일한 버킷의 객체와 폴더는 다른 S3 버킷 키 설정을 가질 수 있습니다. 예를 들어, REST API를 사용하여 객체를 업로드하고 객체에 대해 S3 버킷 키를 사용 설정하는 경우, 대상 버킷에서 S3 버킷 키가 사용 중지되어 있더라도 객체는 대상 버킷에 S3 버킷 키 설정을 유지합니다. 또 다른 예로, 기존 버킷에 대해 S3 버킷 키를 사용 설정하면 이미 버킷에 있는 객체는 S3 버킷 키를 사용하지 않습니다. 그러나 새 객체에는 S3 버킷 키가 사용 설정되어 있습니다.

**버킷에 대한 S3 버킷 키 설정 보기**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷(Buckets)** 목록에서 S3 버킷 키를 사용 설정할 버킷을 선택합니다.

1. [**속성(Properties)**]을 선택합니다.

1. **기본 암호화(Default encryption)** 섹션의 **버킷 키(Bucket Key)** 아래에 버킷의 S3 버킷 키 설정이 표시됩니다.

   S3 버킷 키 설정이 표시되지 않으면 사용자는 `s3:GetEncryptionConfiguration` 작업을 수행할 권한이 없을 수 있습니다. 자세한 내용은 *Amazon Simple Storage Service API Reference*의 [GetBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html)을 참조하십시오.

**객체에 대한 S3 버킷 키 설정 보기**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷(Buckets)** 목록에서 S3 버킷 키를 사용 설정할 버킷을 선택합니다.

1. **객체(Objects)** 목록에서 사용자의 객체 이름을 선택합니다.

1. **세부 정보(Details)** 탭의 **서버 측 암호화 설정(Server-side encryption settings)**에서 **편집(Edit)**을 선택합니다.

   **버킷 키**에서 객체에 대한 S3 버킷 키 설정을 볼 수 있습니다. 이 설정은 편집할 수 없습니다.

## AWS CLI 사용
<a name="bucket-key-settings-cli"></a>

**버킷 수준의 S3 버킷 키 설정 반환**  
이 예제를 사용하려면 각 `user input placeholder`를 사용자의 정보로 대체합니다.

```
aws s3api get-bucket-encryption --bucket amzn-s3-demo-bucket1
```

자세한 내용은 **AWS CLI Command Reference의 [get-bucket-encryption](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-encryption.html)을 참조하십시오.

**객체 수준 S3 버킷 키 설정 반환**  
이 예제를 사용하려면 각 `user input placeholder`를 사용자의 정보로 대체합니다.

```
aws s3api head-object --bucket amzn-s3-demo-bucket1 --key my_images.tar.bz2
```

자세한 내용은 **AWS CLI Command Reference의 [head-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/head-object.html)를 참조하십시오.

## REST API 사용
<a name="bucket-key-settings-rest"></a>

**버킷 수준의 S3 버킷 키 설정 반환**  
S3 버킷 키 설정을 포함하여 버킷에 대한 암호화 정보를 반환하려면 `GetBucketEncryption` 작업을 사용합니다. S3 버킷 키 설정은 `BucketKeyEnabled` 설정과 함께 `ServerSideEncryptionConfiguration` 요소의 응답 본문에 반환됩니다. 자세한 내용은 *Amazon S3 API Reference*의 [GetBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html)을 참조하십시오.

**S3 버킷 키에 대한 객체 수준 설정 반환**  
객체에 대한 S3 버킷 키 상태를 반환하려면 `HeadObject` 작업을 사용합니다. `HeadObject`은(는) 객체에 대해 S3 버킷 키가 사용 설정되었는지 또는 사용 중지되었는지를 표시하는 `x-amz-server-side-encryption-bucket-key-enabled` 응답 헤더를 반환합니다. 자세한 내용은 *Amazon S3 API Reference*에서 [HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)를 참조하십시오.

객체에 대해 S3 버킷 키가 구성된 경우 다음 API 작업도 `x-amz-server-side-encryption-bucket-key-enabled` 응답 헤더를 반환합니다.
+ [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) 
+ [PostObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html) 
+ [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 
+ [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) 
+ [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 
+ [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) 
+ [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) 
+ [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 