

# Amazon S3의 보안
<a name="security"></a>

**중요**  
2026년 4월부터 AWS는 모든 새 버킷에 대해 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 비활성화합니다. 또한 SSE-C 암호화 데이터가 없는 AWS 계정의 모든 기존 버킷에 대해 SSE-C 암호화가 비활성화됩니다. 이러한 변경으로 인해 SSE-C 암호화가 필요한 몇 가지 애플리케이션은 버킷을 생성한 후 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) API를 통해 SSE-C 사용을 의도적으로 활성화해야 합니다. 이러한 경우 자동화 스크립트,CloudFormation 템플릿 또는 기타 인프라 구성 도구를 업데이트하여 해당 설정을 구성해야 할 수 있습니다. 자세한 내용은 [AWS 스토리지 블로그 게시물](https://aws.amazon.com/blogs/storage/advanced-notice-amazon-s3-to-disable-the-use-of-sse-c-encryption-by-default-for-all-new-buckets-and-select-existing-buckets-in-april-2026/)을 참조하세요.

AWS에서는 클라우드 보안을 가장 중요하게 생각합니다. AWS 고객은 보안에 가장 보안에 민감한 조직의 요구 사항에 부합하도록 빌드된 데이터 센터 및 네트워크 아키텍처의 혜택을 누릴 수 있습니다.

보안은 AWS와 귀하의 공동 책임입니다. [공동 책임 모델](https://aws.amazon.com/compliance/shared-responsibility-model/)은 이를 클라우드*의* 보안과 클라우드 *내* 보안으로 설명합니다.

**클라우드의 보안**  
AWS는 AWS 클라우드에서 AWS 서비스를 실행하는 인프라를 보호할 책임이 있습니다. AWS 또한 안전하게 사용할 수 있는 서비스를 제공합니다. 서드 파티 감사자는 정기적으로 [AWS 규정 준수 프로그램](https://aws.amazon.com/compliance/programs/)의 일환으로 보안 효과를 테스트하고 검증합니다. Amazon S3에 적용되는 규정 준수 프로그램에 대한 자세한 내용은 [AWS규정 준수 프로그램 제공 범위 내 서비스](https://aws.amazon.com/compliance/services-in-scope/)를 참조하십시오.

**클라우드의 보안**  
귀하의 책임은 귀하가 사용하는 AWS 서비스에 의해 결정됩니다. 또한 데이터의 민감도, 조직의 요건 및 관련 법률 및 규정을 비롯한 기타 요소에 대해서도 책임이 있습니다. Amazon S3에 대한 고객의 책임에는 다음 영역이 포함됩니다.
+ [객체 소유권](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html) 및 [암호화](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html)를 포함한 데이터 관리.
+ 자산 분류
+ [IAM 역할](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-best-practices.html#roles)과 적절한 권한을 적용하기 위한 기타 서비스 구성을 사용하여 데이터에 대한 [액세스를 관리](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-iam.html)합니다. 
+ [AWS CloudTrail](https://docs.aws.amazon.com/AmazonS3/latest/userguide/cloudtrail-logging.html) 또는 Amazon S3용 [Amazon GuardDuty](https://docs.aws.amazon.com/guardduty/latest/ug/s3_detection.html)와과 같은 탐지 제어 사용 설정.

이 설명서는 Amazon S3 사용 시 공동 책임 모델을 적용하는 방법을 이해하는 데 도움이 됩니다. 다음 주제에서는 보안 및 규정 준수 목적에 맞게 Amazon S3를 구성하는 방법을 보여줍니다. 또한, Amazon S3 리소스를 모니터링하고 보호하는 데 도움이 되는 다른 AWS 서비스의 사용 방법을 배우게 됩니다.

**참고**  
Amazon S3 Express One Zone 스토리지 클래스를 디렉터리 버킷과 함께 사용하는 방법에 대한 자세한 내용은 [S3 Express One Zone](directory-bucket-high-performance.md#s3-express-one-zone) 및 [디렉터리 버킷 작업](directory-buckets-overview.md) 섹션을 참조하세요.

**Topics**
+ [Amazon S3의 보안 모범 사례](security-best-practices.md)
+ [Amazon S3의 데이터 보호](DataDurability.md)
+ [암호화로 데이터 보호](UsingEncryption.md)
+ [인터네트워크 트래픽 개인 정보](inter-network-traffic-privacy.md)
+ [Amazon S3에 대한 규정 준수 확인](s3-compliance.md)
+ [Amazon S3의 복원성](disaster-recovery-resiliency.md)
+ [Amazon S3의 인프라 보안](network-isolation.md)
+ [Amazon S3의 구성 및 취약성 분석](vulnerability-analysis-and-management.md)
+ [액세스 관리](security-access-management.md)
+ [Amazon Simple Storage Service 데이터 인벤토리](s3-data-inventory.md)

# Amazon S3의 보안 모범 사례
<a name="security-best-practices"></a>

**중요**  
2026년 4월부터 AWS는 모든 새 버킷에 대해 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 비활성화합니다. 또한 SSE-C 암호화 데이터가 없는 AWS 계정의 모든 기존 버킷에 대해 SSE-C 암호화가 비활성화됩니다. 이러한 변경으로 인해 SSE-C 암호화가 필요한 몇 가지 애플리케이션은 버킷을 생성한 후 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) API를 통해 SSE-C 사용을 의도적으로 활성화해야 합니다. 이러한 경우 자동화 스크립트,CloudFormation 템플릿 또는 기타 인프라 구성 도구를 업데이트하여 해당 설정을 구성해야 할 수 있습니다. 자세한 내용은 [AWS 스토리지 블로그 게시물](https://aws.amazon.com/blogs/storage/advanced-notice-amazon-s3-to-disable-the-use-of-sse-c-encryption-by-default-for-all-new-buckets-and-select-existing-buckets-in-april-2026/)을 참조하세요.

Amazon S3는 자체 보안 정책을 개발하고 구현할 때 고려해야 할 여러 보안 기능을 제공합니다. 다음 모범 사례는 일반적인 지침이며 완벽한 보안 솔루션을 나타내지는 않습니다. 이러한 모범 사례는 환경에 적절하지 않거나 충분하지 않을 수 있으므로 지침이라기보다는 권장 사항으로만 사용해 주십시오.

**Topics**
+ [Amazon SNS 보안 모범 사례](#security-best-practices-prevent)
+ [Amazon S3 모니터링 및 감사 모범 사례](#security-best-practices-detect)
+ [관리형 AWS 보안 서비스를 사용하여 데이터 보안 모니터링](#monitoring-data-security)

## Amazon SNS 보안 모범 사례
<a name="security-best-practices-prevent"></a>

다음과 같은 Amazon S3 모범 사례를 통해 보안 사고를 예방할 수 있습니다.

**액세스 제어 목록(ACL) 비활성화**  
S3 객체 소유권은 버킷에 업로드되는 객체의 소유권을 제어하고 ACL을 비활성화 또는 활성화하는 데 사용할 수 있는 Amazon S3 버킷 수준 설정입니다. 기본적으로 객체 소유권은 버킷 소유자 적용 설정으로 설정되며 모든 ACL이 비활성화되어 있습니다. ACL이 비활성화되면 버킷 소유자는 버킷의 모든 객체를 소유하고 액세스 관리 정책을 사용하여 데이터에 대한 액세스를 독점적으로 관리합니다.  
Amazon S3의 현대적인 사용 사례 대부분은 더 이상 [액세스 제어 목록(ACL)](acl-overview.md) 사용을 요구하지 않습니다. 각 객체에 대해 액세스를 개별적으로 제어해야 하는 상황을 제외하고는 ACL을 비활성화하는 것이 좋습니다. ACL을 비활성화하고 버킷 내 모든 객체의 소유권을 얻으려면 S3 객체 소유권에 버킷 소유자 적용 설정을 적용합니다. ACL을 사용 중지하면 다른 AWS 계정이 업로드한 객체로 버킷을 쉽게 유지 관리할 수 있습니다.  
ACL이 비활성화되면 데이터에 대한 액세스 제어가 다음과 같은 정책을 기반으로 합니다.  
+ AWS Identity and Access Management(IAM) 사용자 정책
+ S3 버킷 정책
+ 가상 프라이빗 클라우드(VPC) 엔드포인트 정책
+ AWS Organizations 서비스 제어 정책(SCP)
+ AWS Organizations 리소스 제어 정책(RCP)
  
ACL을 비활성화하면 권한 관리와 감사가 단순화됩니다. 신규 버킷에는 기본적으로 ACL이 비활성화됩니다. 기존 버킷에 대해서도 ACL을 비활성화할 수 있습니다. 이미 객체가 있는 기존 버킷이 있는 경우 ACL을 비활성화하면 객체 및 버킷 ACL이 더 이상 액세스 평가 프로세스에 포함되지 않습니다. 대신 정책에 따라 액세스가 허용되거나 거부됩니다.  
ACL을 사용하려면 다음을 수행해야 합니다.  
+ 버킷 정책을 검토하여 계정 외부에서 버킷에 대한 액세스 권한을 부여하려는 모든 방법을 포함하는지 확인합니다.
+ 버킷 ACL을 기본값으로 재설정합니다(버킷 소유자에 대한 전체 제어 권한).
  
ACL을 비활성화하면 다음과 같은 동작이 발생합니다.  
+ 버킷은 ACL을 지정하지 않은 `PUT` 요청이나 버킷 소유자의 전체 제어 ACL이 있는 `PUT` 요청만 수락합니다. 이러한 ACL에는 `bucket-owner-full-control` 미리 준비된 ACL 또는 XML로 표현되는 이와 동등한 형식의 ACL이 포함됩니다.
+ 버킷 소유자 전체 제어 ACL을 지원하는 기존 애플리케이션은 영향을 받지 않습니다.
+ 다른 ACL(예: 특정 AWS 계정에 대한 사용자 정의 권한 부여)이 포함된 `PUT` 요청은 실패하고 오류 코드 `AccessControlListNotSupported`와 함께 `400 (Bad Request)` 오류를 반환합니다.
   
자세한 내용은 [객체 소유권 제어 및 버킷에 대해 ACL 사용 중지](about-object-ownership.md) 섹션을 참조하세요.

**Amazon S3 버킷이 올바른 정책을 사용하게 하고 이 버킷에 대한 퍼블릭 액세스 방지**  
인터넷의 누군가에게 S3 버킷을 읽거나 이 버킷에 쓰도록 명시적으로 요구하지 않을 경우 S3 버킷이 공개되지 않도록 하십시오. 퍼블릭 액세스를 차단하기 위해 다음과 같이 몇 가지 단계를 수행할 수 있습니다.  
+ S3 퍼블릭 액세스 차단을 사용합니다. S3 퍼블릭 액세스 차단을 사용하면 중앙 집중식 제어를 쉽게 설정하여 Amazon S3 리소스에 대한 퍼블릭 액세스를 제한할 수 있습니다. 이러한 중앙 집중식 제어는 리소스 생성 방식과 관계없이 적용됩니다. 여러 AWS 계정을 관리하는 조직의 경우 이제 AWS Organizations를 통해 조직 수준 적용을 사용하여 단일 정책 구성으로 전체 조직의 S3 Block Public Access 설정을 중앙에서 관리할 수 있습니다.

  자세한 내용은 [Amazon S3 스토리지에 대한 퍼블릭 액세스 차단](access-control-block-public-access.md) 섹션을 참조하세요.
+ `"Principal": "*"`(사실상 '누구나'를 의미함)과 같은 와일드카드 ID를 허용하는 Amazon S3 버킷 정책을 식별합니다. 와일드카드 작업 `"*"`(Amazon S3 버킷에서 작업을 수행하도록 사용자에게 효과적으로 허용)를 허용하는 정책을 찾습니다.
+ 마찬가지로 '모든 사용자'나 '인증된 모든 AWS 사용자'에게 읽기, 쓰기 또는 모든 액세스 권한을 제공하는 Amazon S3 버킷 액세스 제어 목록(ACL)을 찾습니다.
+ `ListBuckets` API 작업을 사용하여 모든 Amazon S3 버킷을 스캔합니다. 그런 다음 `GetBucketAcl`, `GetBucketWebsite` 및 `GetBucketPolicy`를 사용하여 버킷에 규정을 준수하는 액세스 제어와 규정을 준수하는 구성이 있는지 확인합니다.
+ [AWS Trusted Advisor](https://docs.aws.amazon.com/awssupport/latest/user/getting-started.html#trusted-advisor)를 사용하여 Amazon S3 구현을 조사합니다.
+ [https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-public-read-prohibited.html](https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-public-read-prohibited.html) 및 [https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-public-write-prohibited.html](https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-public-write-prohibited.html) 관리형 AWS Config 규칙을 사용하여 지속적인 탐지 제어를 구현하는 것을 고려해 보십시오.
**AWS 계정이 여러 개인 조직의 경우 조직 수준의 Block Public Access 관리를 사용하는 것이 좋습니다.**  
+ 중앙 집중식 정책 관리: AWS Organizations를 사용하여 모든 멤버 계정 또는 선택한 조직 단위(OU)에 자동으로 적용되는 단일 S3 Block Public Access 정책을 생성합니다.
+ 자동 상속: 정책을 루트 또는 OU 수준에서 연결하면 새 멤버 계정은 개별 계정 설정 없이 Block Public Access 설정을 자동으로 상속합니다.
+ 간소화된 규정 준수: 조직 수준 정책은 Block Public Access 적용을 위해 복잡한 서비스 제어 정책(SCP)을 유지하고 개별 계정 구성 관리의 운영 오버헤드를 줄일 필요가 없습니다.
+ 감사 기능: 규정 준수 추적을 위해 AWS CloudTrail을 사용하여 멤버 계정 전반의 정책 연결 및 적용을 모니터링합니다.
자세한 내용은 [Amazon S3의 ID 및 액세스 관리](security-iam.md) 섹션을 참조하세요.

**버킷에 고객 제공 키를 사용한 서버 측 암호화(SSE-C) 비활성화**  
Amazon S3의 최신 사용 사례에서는 더 이상 SSE-C를 사용하지 않습니다. SSE-C는 Amazon S3 관리형 키(SSE-S3) 또는 AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS)에 비해 유연성이 부족하기 때문입니다. SSE-C는 SSE-C 암호화 데이터와 상호 작용할 때마다 암호화 키를 제공해야 하므로 SSE-C 키를 S3 버킷에서 데이터를 읽는 다른 사용자, 역할 또는 AWS 서비스와 공유하여 데이터를 운영할 수 없습니다.  
범용 버킷에서 사용할 수 있는 서버 측 암호화 유형을 제한하려면 버킷의 기본 암호화 구성을 업데이트하여 SSE-C 쓰기 요청을 차단하도록 선택할 수 있습니다. 이 버킷 수준 구성은 SSE-C를 지정하는 객체 업로드 요청을 차단합니다. 버킷에 대해 SSE-C가 차단되면 SSE-C 암호화를 지정하는 모든 `PutObject`, `CopyObject`, `PostObject` 또는 멀티파트 업로드 또는 복제 요청이 `HTTP 403 AccessDenied` 오류와 함께 거부됩니다.  
SSE-C 차단에 대한 자세한 내용은 [범용 버킷에 대한 SSE-C 차단 또는 차단 해제](blocking-unblocking-s3-c-encryption-gpb.md) 섹션을 참조하세요.

**계정 리전 네임스페이스에 버킷 생성**  
기본적으로 공유 글로벌 네임스페이스에 글로벌 범용 버킷을 생성하게 됩니다. 공유 글로벌 네임스페이스에 범용 버킷을 생성한 후에는 해당 버킷 이름을 사용하여 파티션 내에서 다른 사용자가 버킷을 생성할 수 없습니다. 글로벌 범용 버킷을 삭제하면 해당 버킷 이름은 글로벌 네임스페이스에서 다시 사용 가능해져서 누구나 다시 생성할 수 있습니다.  
Amazon S3 범용 버킷은 공유 글로벌 네임스페이스에 존재하지만 선택적으로 계정 리전 네임스페이스에 버킷을 생성할 수 있습니다. 계정 리전 네임스페이스는 글로벌 버킷 네임스페이스의 예약된 하위 영역으로, 해당 사용자 계정만 범용 버킷을 생성할 수 있습니다. 계정 리전 네임스페이스에 버킷을 생성하는 것이 좋습니다. 이러한 버킷은 사용자의 계정에 고유하며 다른 계정에서 다시 생성할 수 없기 때문입니다. 자세한 내용은 [범용 버킷의 네임스페이스](gpbucketnamespaces.md) 섹션을 참조하세요.  
공유 글로벌 네임스페이스에서 글로벌 범용 버킷을 삭제하지 않는 것이 좋습니다. 이제 모든 AWS 계정에 버킷 10,000개의 기본 버킷 할당량이 있으므로 계정에서 빈 버킷을 삭제할 필요성이 줄어듭니다. 공유 글로벌 네임스페이스에서 버킷을 삭제하는 경우 동일한 파티션의 다른 AWS 계정이 삭제된 버킷 이름을 사용하여 새 버킷을 생성할 수 있습니다. 따라서 다른 계정이 삭제된 버킷에 대한 요청을 수신할 수도 있다는 점에 유의하세요. 이 현상을 방지하고 싶거나 같은 버킷 이름을 사용하려면 버킷을 삭제하지 마세요. 버킷을 비우고 그대로 유지하는 것이 좋습니다. 버킷을 삭제하는 대신 필요에 따라 버킷 요청을 차단합니다. 더 이상 적극적으로 사용되지 않는 버킷의 경우 버킷 자체를 유지하면서 비용을 최소화하기 위해 버킷에서 모든 객체를 비우는 것이 좋습니다. 자세한 내용은 [범용 버킷 삭제](delete-bucket.md) 섹션을 참조하세요.

**최소 권한 액세스 구현**  
권한을 부여할 때 누가 어떤 Amazon S3 리소스에 대해 어떤 권한을 갖는지 결정합니다. 해당 리소스에서 허용할 작업을 사용 설정합니다. 따라서 작업을 수행하는 데 필요한 권한만 부여하는 것을 권장합니다. 최소 권한 액세스를 구현하는 것이 오류 또는 악의적인 의도로 인해 발생할 수 있는 보안 위험과 영향을 최소화할 수 있는 근본적인 방법입니다.  
다음과 같은 도구를 사용하여 최소 권한 액세스를 구현할 수 있습니다.  
+ [Amazon S3의 정책 작업](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-actions) 및 [IAM 엔터티의 권한 범위](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)
+ [Amazon S3에서 IAM을 사용하는 방법](security_iam_service-with-iam.md)
+ [ACL(액세스 제어 목록) 개요](acl-overview.md)
앞에 나온 메커니즘 중 하나 이상을 선택할 때 고려할 사항에 관한 지침은 [Amazon S3의 ID 및 액세스 관리](security-iam.md) 단원을 참조하십시오.

**Amazon S3 액세스가 필요한 애플리케이션 및 AWS 서비스에 IAM 역할 사용**  
Amazon EC2 또는 다른 AWS 서비스에서 실행되는 애플리케이션이 Amazon S3 리소스에 액세스하기 위해서는 AWS API 요청에 유효한 AWS 자격 증명이 있어야 합니다. AWS 자격 증명을 애플리케이션이나 Amazon EC2 인스턴스에 직접 저장하지 않는 것을 권장합니다. 이러한 보안 인증은 자동으로 교체되지 않으며 손상된 경우 비즈니스에 큰 영향을 줄 수 있는 장기 보안 인증입니다.  
그 대신 IAM 역할을 사용하여 Amazon S3에 액세스해야 하는 애플리케이션이나 서비스의 임시 자격 증명을 관리하십시오. 역할을 사용할 때 Amazon EC2 인스턴스나 AWS 서비스(예: AWS Lambda)에 장기 자격 증명(예: 사용자 이름과 암호 또는 액세스 키)를 배포할 필요가 없습니다. 애플리케이션에서 다른 AWS 리소스를 호출할 때 사용할 수 있는 임시 권한을 역할이 제공합니다.  
자세한 내용은 *IAM 사용 설명서*에서 다음 주제를 참조하세요.  
+ [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)
+ [역할에 대한 일반적인 시나리오: 사용자, 애플리케이션 및 서비스](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios.html)

  

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

  또한 Amazon S3는 다음과 같은 서버 측 암호화 옵션을 제공합니다.
  + AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 사용한 서버 측 암호화 
  + AWS Key Management Service(AWS KMS) 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)
  + 고객 제공 키를 사용한 서버 측 암호화(SSE-C)

  자세한 내용은 [서버 측 암호화를 사용하여 데이터 보호](serv-side-encryption.md) 섹션을 참조하세요.
+ **클라이언트측 암호화** – 클라이언트 측에서 데이터를 암호화하여 암호화된 데이터를 Amazon S3에 업로드합니다. 이 경우 사용자가 암호화 프로세스, 암호화 키 및 관련 도구를 관리합니다. 서버 측 암호화를 사용할 때처럼, 클라이언트 측 암호화를 사용하면 데이터 자체를 저장하는 것과는 다른 메커니즘으로 저장되는 키로 데이터를 암호화하여 위험을 줄일 수 있습니다.

  Amazon S3에서는 여러 가지 클라이언트 측 암호화 옵션을 제공합니다. 자세한 내용은 [클라이언트측 암호화를 사용하여 데이터 보호](UsingClientSideEncryption.md) 섹션을 참조하세요.

**전송 중인 데이터의 암호화 강제 시행**  
HTTPS(TLS)를 사용하여 잠재적 공격자가 네트워크 트래픽을 염탐하거나 중간자 또는 그와 유사한 공격을 사용하여 네트워크 트래픽을 조작하지 못하게 할 수 있습니다. Amazon S3 버킷 IAM 정책에 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean) 조건을 사용하여 HTTPS(TLS)를 통해 암호화된 연결만 허용하는 것을 권장합니다. 자세한 내용은 예시 S3 버킷 정책 [HTTP 또는 HTTPS 요청 기반 액세스 관리](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-HTTP-HTTPS)를 참조하세요. HTTP 요청을 거부하는 것 외에도 콘텐츠에 HTTP 액세스 시도가 이루어지는 경우 알림을 보내도록 `tlsDetails.tlsVersion NOT EXISTS`에 대해 Amazon CloudWatch 경보를 설정하는 것이 좋습니다. Amazon CloudWatch 경보를 구성하는 방법에 대한 자세한 내용은 *AWS CloudTrail 사용 설명서*의 [Creating CloudWatch alarms for CloudTrail events: examples](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html) 및 [CloudTrail record contents](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)를 참조하세요.  
AWS는 공개적으로 신뢰할 수 있는 인증서의 고정을 지원하지 않으므로 애플리케이션에서 Amazon S3 TLS 인증서를 고정하지 않는 것이 좋습니다. S3는 인증서를 자동으로 갱신하므로 인증서 만료 전에는 언제든지 인증서를 갱신할 수 있습니다. 인증서를 갱신하면 새로운 퍼블릭-프라이빗 키 페어가 생성됩니다. 최근에 새 공개 키로 갱신된 S3 인증서를 고정하면 애플리케이션에서 새 인증서를 사용할 때까지 S3에 연결할 수 없습니다.
또한 [https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-ssl-requests-only.html](https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-ssl-requests-only.html) 관리형 AWS Config 규칙을 사용하여 지속적인 탐지 제어를 구현하는 것을 고려해 보세요.

**S3 객체 잠금 고려**  
S3 객체 잠금을 사용하면 Write Once Read Many(WORM) 모델을 사용하여 객체를 저장할 수 있습니다. S3 객체 잠금은 부적절하거나 실수로 인한 데이터 삭제를 예방하는 데 도움이 됩니다. 예를 들어 S3 객체 잠금을 사용하여 AWS CloudTrail 로그를 보호할 수 있습니다.  
자세한 내용은 [Object Lock으로 객체 잠금](object-lock.md) 섹션을 참조하세요.

**S3 버전 관리 활성화**  
S3 버전 관리는 동일 버킷 내에 여러 개의 객체 변형을 보유하는 것을 의미합니다. 버전 관리를 사용하여 버킷에 저장된 모든 버전의 객체를 모두 보존, 검색 및 복원할 수 있습니다. 또한 의도치 않은 사용자 작업 및 애플리케이션 장애로부터 쉽게 복구할 수 있습니다.  
또한 [https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-versioning-enabled.html](https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-versioning-enabled.html) 관리형 AWS Config 규칙을 사용하여 지속적인 탐지 제어를 구현하는 것을 고려해 보세요.  
자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하세요.

**S3 교차 리전 복제 사용 고려**  
Amazon S3는 기본적으로 여러 지역에 있는 다양한 가용 영역에 데이터를 저장하지만 규정 준수 요구 사항에 따라 훨씬 먼 거리에 데이터를 저장해야 할 수도 있습니다. 교차 리전 복제(CRR)를 사용하면 멀리 있는 AWS 리전 간에 데이터를 복제하여 이 요구 사항을 충족할 수 있습니다. CRR은 여러 AWS 리전에 있는 버킷 간에 객체를 비동기식으로 자동 복제할 수 있게 합니다. 자세한 내용은 [리전 내 및 리전 간 객체 복제](replication.md) 섹션을 참조하세요.  
CRR을 사용할 경우 원본 및 대상 S3 버킷 둘 다 버전 관리가 활성화되어 있어야 합니다.
또한 [https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-replication-enabled.html](https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-replication-enabled.html) 관리형 AWS Config 규칙을 사용하여 지속적인 탐지 제어를 구현하는 것을 고려해 보십시오.

**Amazon S3 액세스에 대해 VPC 엔드포인트 사용 고려**  
Amazon S3용 가상 프라이빗 클라우드(VPC) 엔드포인트는 VPC 내의 논리적 엔터티로서, Amazon S3에만 연결을 허용합니다. VPC 엔드포인트는 트래픽이 개방형 인터넷을 통과하는 것을 방지하는 데 도움이 될 수 있습니다.  
Amazon S3용 VPC 엔드포인트는 Amazon S3 데이터에 대한 액세스를 제어하는 다양한 방법을 제공합니다.  
+ S3 버킷 정책을 사용하여 특정 VPC 엔드포인트를 통해 허용되는 요청, 사용자 또는 그룹을 제어할 수 있습니다.
+ S3 버킷 정책을 사용하여 S3 버킷에 대한 액세스를 갖게 되는 VPC 또는 VPC 종단점을 제어할 수 있습니다.
+ 인터넷 게이트웨이가 없는 VPC를 사용하여 데이터 유출을 방지할 수 있습니다.
자세한 내용은 [버킷 정책을 사용하여 VPC 엔드포인트에서 액세스 제어](example-bucket-policies-vpc-endpoint.md) 섹션을 참조하세요.

** 관리형 AWS 보안 서비스를 사용하여 데이터 보안 모니터링**  
여러 관리형 AWS 보안 서비스를 통해 Amazon S3 데이터의 보안 및 규정 준수 위험을 식별, 평가 및 모니터링할 수 있습니다. 이러한 서비스는 이러한 위험으로부터 데이터를 보호하는 데도 도움이 될 수 있습니다. 이러한 서비스에는 단일 AWS 계정의 Amazon S3 리소스에서 수천 개의 계정에 걸친 조직을 위한 리소스로 확장하도록 설계된 자동화된 탐지, 모니터링 및 보호 기능이 포함됩니다.  
자세한 내용은 [관리형 AWS 보안 서비스를 사용하여 데이터 보안 모니터링](#monitoring-data-security) 섹션을 참조하세요.

## Amazon S3 모니터링 및 감사 모범 사례
<a name="security-best-practices-detect"></a>

다음과 같은 Amazon S3 모범 사례는 잠재적 보안 약점과 사고를 탐지하는 데 도움이 됩니다.

**모든 Amazon S3 버킷 식별 및 감사**  
IT 자산 식별은 거버넌스와 보안의 중요한 측면입니다. 모든 Amazon S3 리소스를 파악하여 보안 태세를 평가하고 약점이 될 수 있는 부분에 대해 조치를 취해야 합니다. 리소스를 감사하려면 다음을 수행하는 것이 좋습니다.  
+ Tag Editor를 사용하여 보안이나 감사에 민감한 리소스를 식별하고 태그를 지정한 후, 이 리소스를 검색해야 할 때 태그를 이용하십시오. 자세한 내용은 ** AWS 리소스 태그 지정 사용 설명서의 [태그를 지정할 리소스 검색](https://docs.aws.amazon.com/ARG/latest/userguide/tag-editor.html)을 참조하십시오.
+ S3 인벤토리를 사용하여 비즈니스, 규정 준수 및 규제 요건에 대한 객체의 복제 및 암호화 상태를 감사하고 보고합니다. 자세한 내용은 [S3 Inventory를 사용한 데이터 카탈로그화 및 분석](storage-inventory.md) 섹션을 참조하세요.
+ Amazon S3 리소스에 대한 Resource Groups을 생성합니다. Resource Groups에 대한 자세한 내용은 *AWS Resource Groups 사용 설명서*의 [Resource Groups란 무엇인가요?](https://docs.aws.amazon.com/ARG/latest/userguide/welcome.html)를 참조하십시오.

**AWS 모니터링 도구를 사용하여 모니터링 구현**  
모니터링은 Amazon S3 및 AWS 솔루션의 안정성, 보안, 가용성 및 성능을 유지하는 데 중요한 부분입니다. AWS에서는 Amazon S3 및 다른 AWS 서비스를 모니터링할 수 있는 여러 가지 도구와 서비스를 제공합니다. 예를 들어 Amazon S3에 대한 Amazon CloudWatch 지표(특히 `PutRequests`, `GetRequests`, `4xxErrors` 및 `DeleteRequests` 지표)를 모니터링할 수 있습니다. 자세한 내용은 [Amazon CloudWatch를 사용한 지표 모니터링](cloudwatch-monitoring.md) 및 [Amazon S3의 로깅 및 모니터링](monitoring-overview.md)(을)를 참조하세요.  
두 번째 예는 [예제: Amazon S3 버킷 작업](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html#cloudwatch-alarms-for-cloudtrail-s3-bucket-activity)을 참조하세요. 이 예에서는 버킷 정책, 버킷 수명 주기 또는 버킷 복제 구성을 `PUT` 또는 `DELETE`하거나 버킷 ACL을 `PUT`하기 위해 Amazon S3 API가 호출될 때 트리거되는 CloudWatch 경보를 생성하는 방법을 설명합니다.

**Amazon S3 서버 액세스 로깅 사용**  
서버 액세스 로깅은 버킷에 대해 이루어진 요청의 상세 레코드를 제공합니다. 서버 액세스 로그는 보안 및 액세스 감사에 도움이 되고, 고객 기반을 파악하고 Amazon S3 청구서를 이해하는 데 유용합니다. 서버 액세스 로깅 사용 설정에 대한 자세한 내용은 [서버 액세스 로깅을 사용한 요청 로깅](ServerLogs.md) 섹션을 참조하십시오.  
또한 [https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-logging-enabled.html](https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-logging-enabled.html) AWS Config 관리형 규칙을 사용하여 지속적인 탐지 제어를 구현하는 것을 고려해 보십시오.

**를 사용합니다.AWS CloudTrail**  
AWS CloudTrail은 Amazon S3에서 사용자, 역할 또는 AWS 서비스가 수행한 작업에 대한 레코드를 제공합니다. CloudTrail에서 수집한 정보를 사용하여 다음을 확인할 수 있습니다.  
+ Amazon S3에 대한 요청
+ 요청을 보낸 IP 주소
+ 요청한 사람
+ 요청을 한 시간
+ 요청에 대한 추가 세부 정보
  
예를 들어 데이터 액세스에 영향을 주는 `PUT` 작업(특히 `PutBucketAcl`, `PutObjectAcl`, `PutBucketPolicy` 및 `PutBucketWebsite`)의 CloudTrail 항목을 식별할 수 있습니다.  
AWS 계정을 설정하면 CloudTrail이 기본적으로 사용됩니다. CloudTrail 콘솔에서 최근 이벤트를 볼 수 있습니다. Amazon S3 버킷에 대한 활동 및 이벤트에 대한 지속적인 레코드를 생성하려면 CloudTrail 콘솔에서 추적을 생성하면 됩니다. 자세한 내용을 알아보려면 **AWS CloudTrail 사용 설명서의 [데이터 이벤트 로깅](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)을 참조하십시오.  
추적을 생성할 때 데이터 이벤트를 로그로 기록하도록 CloudTrail을 구성할 수 있습니다. 데이터 이벤트는 리소스에 대해 또는 리소스 내에서 수행되는 리소스 작업의 레코드입니다. Amazon S3에서 데이터 이벤트는 개별 버킷에 대한 객체 수준 API 활동을 기록합니다. CloudTrail은 `GetObject`, `DeleteObject` 및 `PutObject`와 같은 Amazon S3 객체 수준 API 작업의 하위 집합을 지원합니다. CloudTrail이 Amazon S3에서 작동하는 방식에 대한 자세한 내용은 [AWS CloudTrail을 사용하여 Amazon S3 API 호출 로깅](cloudtrail-logging.md) 섹션을 참조하세요. Amazon S3 콘솔에서 S3 버킷을 [S3 버킷 및 객체에 대한 CloudTrail 이벤트 로깅 사용 설정](enable-cloudtrail-logging-for-s3.md)에 구성할 수도 있습니다.  
AWS Config는 하나 이상의 CloudTrail 추적이 S3 버킷에 대한 데이터 이벤트를 로그로 기록하고 있는지 확인하는 데 사용할 수 있는 관리형 규칙(`cloudtrail-s3-dataevents-enabled`)을 제공합니다. 자세한 내용은 *AWS Config 개발자 안내서*의 [https://docs.aws.amazon.com//config/latest/developerguide/cloudtrail-s3-dataevents-enabled.html](https://docs.aws.amazon.com//config/latest/developerguide/cloudtrail-s3-dataevents-enabled.html) 섹션을 참조하십시오.

** 사용 설정AWS Config**  
이 주제에 나오는 여러 가지 모범 사례는 AWS Config 규칙 생성을 제안합니다. AWS Config를 사용하면 AWS 리소스의 구성을 평가, 감사 및 측정하는 데 도움이 됩니다. AWS Config는 리소스 구성을 모니터링하여 원하는 보안 구성을 기준으로 기록된 구성을 평가할 수 있게 해줍니다. AWS Config을 사용하여 다음 작업을 할 수 있습니다.  
+ 구성 변경 사항 및 AWS 리소스 간의 관계 검토
+ 자세한 리소스 구성 기록 조사
+ 내부 지침에 지정된 구성을 기준으로 전반적인 준수 여부를 확인합니다.
  
AWS Config를 사용하면 규정 준수 감사, 보안 분석, 변경 관리 및 운영 문제 해결 작업을 간소화할 수 있습니다. 자세한 내용은 *AWS Config 개발자 안내서*의 [콘솔을 통해 AWS Config 설정](https://docs.aws.amazon.com/config/latest/developerguide/gs-console.html)을 참조하십시오. 기록할 리소스 유형을 지정할 때 Amazon S3 리소스를 포함해야 합니다.  
AWS Config 관리형 규칙은 Amazon S3 리소스를 평가할 때 범용 버킷만 지원합니다. AWS Config는 디렉터리 버킷의 구성 변경을 기록하지 않습니다. 자세한 내용은 **AWS Config 개발자 안내서의 [AWS Config 관리형 규칙](https://docs.aws.amazon.com//config/latest/developerguide/evaluate-config_use-managed-rules.html) 및 [AWS Config 관리형 규칙 목록](https://docs.aws.amazon.com//config/latest/developerguide/managed-rules-by-aws-config.html)을 참조하세요.
AWS Config를 사용하는 방법의 예시를 보려면 **AWS 보안 블로그의 [AWS Config를 사용하여 퍼블릭 액세스를 허용하는 Amazon S3 버킷을 모니터링하고 이에 응답하는 방법](https://aws.amazon.com/blogs/security/how-to-use-aws-config-to-monitor-for-and-respond-to-amazon-s3-buckets-allowing-public-access/)을 참조하십시오.

**S3 스토리지 렌즈 사용**  
S3 스토리지 렌즈는 조직 전반에서 객체 스토리지 사용 및 활동에 대한 가시성을 확보하는 데 사용할 수 있는 클라우드 스토리지 분석 기능입니다. S3 스토리지 렌즈는 또한 지표를 분석해 스토리지 비용을 최적화하고 데이터 보호에 대한 모범 사례를 적용하는 데 사용할 수 있는 상황별 권장 사항을 제공합니다.  
S3 Storage Lens의 지표를 사용하여 조직 전반의 스토리지 용량 또는 가장 빠르게 증가하는 버킷과 접두사 등의 요약 인사이트를 생성할 수 있습니다. 또한 S3 스토리지 렌즈 지표를 사용하여 비용 최적화 기회를 식별하고, 데이터 보호 및 액세스 관리 모범 사례를 구현하고, 애플리케이션 워크로드의 성능을 개선할 수 있습니다.  
예를 들어 S3 수명 주기 규칙이 없는 버킷을 식별하여 7일이 넘게 경과한 미완료 멀티파트 업로드를 중단할 수 있습니다. 또한 S3 복제 또는 S3 버전 관리 사용과 같은 데이터 보호 모범 사례를 따르지 않는 버킷을 식별할 수 있습니다. 자세한 내용은 [Amazon S3 스토리지 렌즈 이해](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_basics_metrics_recommendations.html)를 참조하십시오.

**AWS 보안 공지 모니터링**  
AWS 계정의 Trusted Advisor에 게시되는 보안 권고 사항을 정기적으로 확인하는 것이 좋습니다. 특히 '공개 액세스 권한'이 있는 Amazon S3 버킷에 대한 경고를 찾아보십시오. 이 작업은 [https://docs.aws.amazon.com/cli/latest/reference/support/describe-trusted-advisor-checks.html](https://docs.aws.amazon.com/cli/latest/reference/support/describe-trusted-advisor-checks.html)를 사용하여 프로그래밍 방식으로 수행할 수 있습니다.  
뿐만 아니라, 각 AWS 계정에 등록된 기본 이메일 주소를 적극적으로 모니터링하십시오. 사용자에게 영향을 줄 수 있는 보안 문제가 생기면 AWS에서 이 이메일 주소를 사용하여 연락 드립니다.  
널리 영향을 미치는 AWS 운영 문제는 [AWS Health Dashboard - 서비스 상태](https://status.aws.amazon.com/)에 게시됩니다. AWS Health Dashboard를 통해 개별 계정에도 운영 문제가 게시됩니다. 자세한 내용은 [AWS Health 설명서](https://docs.aws.amazon.com/health/)를 참조하십시오.

## 관리형 AWS 보안 서비스를 사용하여 데이터 보안 모니터링
<a name="monitoring-data-security"></a>

여러 관리형 AWS 보안 서비스를 통해 Amazon S3 데이터의 보안 및 규정 준수 위험을 식별, 평가 및 모니터링할 수 있습니다. 이러한 서비스는 해당 위험으로부터 데이터를 보호하는 데도 도움이 될 수 있습니다. 이러한 서비스에는 단일 AWS 계정의 Amazon S3 리소스에서 수천 개의 AWS 계정에 걸친 조직을 위한 리소스로 확장하도록 설계된 자동화된 탐지, 모니터링 및 보호 기능이 포함됩니다.

AWS 탐지 및 대응 서비스를 사용하면 잠재적인 보안 구성 오류, 위협 또는 예상치 못한 동작을 식별하여 사용자 환경에서 잠재적인 무단 활동 또는 악의적인 활동에 신속하게 대응할 수 있습니다. AWS 데이터 보호 서비스를 사용하면 데이터, 계정 및 워크로드를 모니터링하고 무단 액세스로부터 보호할 수 있습니다. 또한 Amazon S3 데이터 자산에서 개인 식별 정보(PII)와 같은 민감한 데이터를 검색하는 데 도움이 될 수 있습니다.

관리형 AWS 보안 서비스는 데이터 보안 및 규정 준수 위험을 식별하고 평가하는 데 도움이 되도록 조사 결과를 생성하여 Amazon S3 데이터와 관련된 잠재적 보안 이벤트 또는 문제를 알려줍니다. 조사 결과는 인시던트 대응 워크플로 및 정책에 따라 이러한 위험을 조사 및 평가하고 조치를 취하는 데 사용할 수 있는 관련 세부 정보를 제공합니다. 각 서비스를 사용하여 조사 결과 데이터에 직접 액세스할 수 있습니다. 또한 보안 인시던트 및 이벤트 관리 시스템(SIEM)과 같은 다른 애플리케이션, 서비스 및 시스템으로 데이터를 보낼 수도 있습니다.

Amazon S3 데이터의 보안을 모니터링하려면 이러한 관리형 AWS 보안 서비스를 사용해 보십시오.

**Amazon GuardDuty**  
Amazon GuardDuty는 AWS 계정 및 워크로드에 악의적인 활동이 있는지 지속적으로 모니터링하고 가시성 및 해결을 위한 상세한 보안 조사 결과를 제공하는 위협 탐지 서비스입니다.  
GuardDuty의 S3 보호 기능을 사용하면 GuardDuty를 구성하여 Amazon S3 리소스에 대한 AWS CloudTrail 관리 및 데이터 이벤트를 분석할 수 있습니다. 그러면 GuardDuty는 해당 이벤트를 모니터링하여 악의적이고 의심스러운 활동이 있는지 확인합니다. GuardDuty는 분석 결과를 알리고 잠재적인 보안 위험을 식별하기 위해 위협 인텔리전스 피드와 기계 학습을 사용합니다.  
GuardDuty는 Amazon S3 리소스에 대한 다양한 종류의 활동을 모니터링할 수 있습니다. 예를 들어, Amazon S3용 CloudTrail 관리 이벤트에는 `ListBuckets`, `DeleteBucket` 및 `PutBucketReplication`과 같은 버킷 수준 작업이 포함됩니다. Amazon S3용 CloudTrail 데이터 이벤트에는 `GetObject`, `ListObjects` 및 `PutObject`와 같은 객체 수준 작업이 포함됩니다. GuardDuty가 비정상적이거나 잠재적으로 악의적인 활동을 탐지하면 조사 결과를 생성하여 사용자에게 알립니다.  
자세한 내용은 **Amazon GuardDuty 사용 설명서의 [Amazon GuardDuty에서 Amazon S3 보호](https://docs.aws.amazon.com/guardduty/latest/ug/s3-protection.html)를 참조하십시오.

**Amazon Detective**  
Amazon Detective는 조사 프로세스를 간소화하고 더 빠르고 효과적인 보안 조사를 수행할 수 있도록 도와줍니다. Detective는 가능한 보안 문제의 특성과 범위를 분석하고 평가하는 데 도움이 되는 사전 빌드된 데이터 집계, 요약 및 컨텍스트를 제공합니다.  
Detective는 AWS CloudTrail의 API 호출 및 AWS 리소스의 Amazon VPC 흐름 로그와 같은 시간 기반 이벤트를 자동으로 추출합니다. 또한 Amazon GuardDuty에서 생성한 결과를 수집합니다. 그런 다음 Detective는 기계 학습, 통계 분석 및 그래프 이론을 사용하여 효과적인 보안 조사를 보다 신속하게 수행하는 데 도움이 되는 시각화를 생성합니다.  
이러한 시각화는 리소스 동작과 시간 경과에 따른 리소스 동작 간의 상호 작용에 대한 통합된 대화형 보기를 제공합니다. 이 동작 그래프를 탐색하여 실패한 로그인 시도 또는 의심스러운 API 호출과 같은 잠재적으로 악의적인 작업을 검사할 수 있습니다. 또한 이러한 작업이 S3 버킷이나 객체와 같은 리소스에 미치는 영향을 확인할 수 있습니다.  
자세한 내용은 [Amazon Detective 관리 가이드](https://docs.aws.amazon.com/detective/latest/adminguide/what-is-detective.html)를 참조하십시오.

**IAM Access Analyzer**  
AWS Identity and Access Management Access Analyzer(IAM Access Analyzer)를 사용하면 외부 엔터티와 공유되는 조직의 리소스 및 계정을 식별할 수 있습니다. 또한 IAM Access Analyzer를 사용하여 정책 문법 및 모범 사례에 따라 IAM 정책을 검증하고 AWS CloudTrail 로그의 액세스 활동을 기반으로 IAM 정책을 생성할 수 있습니다.  
IAM Access Analyzer는 논리 기반 추론을 사용하여 사용자 AWS 환경의 리소스 정책(예: 버킷 정책)을 분석합니다. IAM Access Analyzer for S3를 사용하면 인터넷의 모든 사용자 또는 조직 외부의 계정을 포함한 다른 AWS 계정이 액세스할 수 있게 S3 버킷이 구성되면 알림을 받게 됩니다. 예를 들어 IAM Access Analyzer for S3는 버킷에 버킷 액세스 제어 목록(ACL), 버킷 정책, 다중 리전 액세스 포인트 정책 또는 액세스 포인트 정책을 통해 제공된 읽기 또는 쓰기 권한이 있음을 보고할 수 있습니다. 각 퍼블릭 버킷 또는 공유 버킷에 대해 퍼블릭 액세스 또는 공유 액세스의 수준과 소스를 알려주는 결과가 수신됩니다. 이러한 내용을 바탕으로 즉각적이고 정확한 시정 조치를 취하여 버킷 액세스를 원하는 대로 복원할 수 있습니다.  
자세한 내용은 [IAM Access Analyzer for S3를 사용하여 버킷 액세스 검토](access-analyzer.md) 섹션을 참조하세요.

**Amazon Macie**  
Amazon Macie는 기계 학습 및 패턴 일치를 사용하여 민감한 데이터를 검색하는 보안 서비스입니다. Macie는 데이터 보안 위험에 대한 가시성을 제공하고 이러한 위험에 대한 자동화된 보호를 지원합니다. Macie를 사용하면 Amazon S3 데이터 자산에서 민감한 데이터의 검색 및 보고를 자동화하여 조직이 S3에 저장하는 데이터를 더 잘 이해할 수 있습니다.  
Macie를 사용하여 민감한 데이터를 감지하려면 규모가 크고 점점 더 늘어나는 많은 국가 및 리전에 대한 민감한 데이터 유형 목록을 탐지하도록 설계된 기본 제공 기준 및 기법을 사용할 수 있습니다. 이러한 민감한 데이터 유형에는 여러 유형의 개인 식별 정보(PII), 재무 데이터 및 보안 인증 데이터가 포함됩니다. 직접 정의하는 사용자 지정 기준을 사용할 수도 있습니다. 즉, 일치시킬 텍스트 패턴을 정의하는 정규 표현식 및 원하는 경우 결과를 세분화하는 문자 시퀀시 및 근접성 규칙을 사용할 수 있습니다.  
Macie가 S3 객체에서 민감한 데이터를 탐지하면 Macie는 보안 조사 결과를 생성하여 사용자에게 알립니다. 이 조사 결과는 영향을 받는 객체에 대한 정보, Macie가 발견한 민감한 데이터의 유형 및 발생 횟수, 영향을 받는 S3 버킷 및 객체를 조사하는 데 도움이 되는 추가 세부 정보를 제공합니다. 자세한 내용은 [Amazon Macie 사용 설명서](https://docs.aws.amazon.com/macie/latest/user/what-is-macie.html)를 참조하십시오.

**AWS Security Hub CSPM**  
AWS Security Hub CSPM는 보안 모범 사례 검사를 수행하고, 여러 소스의 경고 및 조사 결과를 단일 형식으로 집계하고, 자동화된 문제 해결을 지원하는 보안 태세 관리 서비스입니다.  
Security Hub CSPM은 통합 AWS Partner Network 보안 솔루션과 Amazon Detective, Amazon GuardDuty, IAM Access Analyzer 및 Amazon Macie를 비롯한 AWS 서비스에서 보안 조사 결과 데이터를 수집하고 제공합니다. 또한 AWS 모범 사례 및 지원되는 업계 표준을 기반으로 자동화된 보안 검사를 지속적으로 실행하여 자체 결과를 생성합니다.  
그런 다음 Security Hub CSPM은 가장 중요한 조사 결과의 우선순위를 지정하고 처리할 수 있도록 공급자 간 결과를 상호 연관시키고 통합합니다. 또한 특정 조사 결과 클래스에 대한 응답 또는 수정 조치를 호출하는 데 사용할 수 있는 사용자 지정 작업에 대한 지원도 제공합니다.  
Security Hub CSPM을 사용하면 Amazon S3 리소스의 보안 및 규정 준수 상태를 평가할 수 있습니다. 이는 개별 AWS 리전 및 여러 리전에 걸친 조직의 보안 태세에 대한 광범위한 분석의 일환으로 수행할 수 있습니다. 여기에는 보안 추세를 분석하고 우선순위가 가장 높은 보안 문제를 식별하는 것이 포함됩니다. 또한 여러 AWS 리전의 조사 결과를 집계하고 집계된 결과 데이터를 단일 리전에서 모니터링 및 처리할 수 있습니다.  
자세한 내용은 **AWS Security Hub CSPM 사용 설명서의 [Amazon Simple Storage Service 제어](https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html)를 참조하십시오.

# Amazon S3의 데이터 보호
<a name="DataDurability"></a>

Amazon S3에서는 미션 크리티컬 및 기본 데이터 스토리지에 적합하게 설계된, 내구성이 뛰어난 스토리지 인프라를 제공합니다. S3 Standard, S3 Intelligent-Tiering, S3 Standard-IA, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval 및 S3 Glacier Deep Archive는 AWS 리전의 최소 3개 가용 영역에 걸쳐 여러 디바이스에 객체를 중복 저장합니다. 가용 영역은 AWS 리전에 중복 전원, 네트워킹 및 연결이 있는 하나 이상의 개별 데이터 센터입니다. 가용 영역은 모두 서로 100km 내에 있지만 다른 가용 영역과 의미 있는 거리(수 킬로미터)만큼 물리적으로 분리됩니다. S3 One Zone-IA 스토리지 클래스는 단일 가용 영역 내의 여러 디바이스에 걸쳐 데이터를 중복으로 저장합니다. 이러한 서비스는 손실된 중복성을 신속하게 탐지하고 복구하여 동시 장치 오류를 처리하도록 설계되었으며 또한 체크섬을 사용하여 데이터 무결성을 정기적으로 확인합니다.

Amazon S3 Standard 스토리지는 다음 기능을 제공합니다.
+ [Amazon S3 서비스 수준 계약](https://aws.amazon.com/s3/sla/)으로 신뢰성을 보장합니다.
+ 지정된 기간 동안 객체에 대해 99.999999999%의 내구성과 99.99%의 가용성을 제공할 수 있도록 설계되었습니다.
+ S3 Standard, S3 Intelligent-Tiering, S3 Standard-IA, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval 및 S3 Glacier Deep Archive는 모두 전체 Amazon S3 가용 영역이 손실된 경우 데이터를 유지하도록 설계되었습니다.

Amazon S3에서는 버전 관리를 사용하여 데이터에 대한 향상된 보호를 제공합니다. 버전 관리를 사용하면 Amazon S3 버킷에 저장된 모든 버전의 객체를 모두 보존, 검색 및 복원할 수 있습니다. 또한 의도치 않은 사용자 작업 및 애플리케이션 장애로부터 쉽게 복구할 수 있습니다. 기본적으로 요청을 통해 가장 최근에 작성된 버전을 검색합니다. 요청에서 객체의 버전을 지정하여 객체의 기존 버전을 가져올 수 있습니다.

S3 버전 관리 외에도 Amazon S3 객체 잠금 및 S3 복제를 사용하여 데이터를 보호할 수도 있습니다. 자세한 내용은 [Amazon S3의 데이터 보호](data-protection.md) 섹션을 참조하세요.

데이터 보호를 위해 AWS 계정 자격 증명을 보호하고 AWS Identity and Access Management에서 개별 사용자 계정을 설정하여 각 사용자에게 직무를 수행하는 데 필요한 권한만 부여하는 것이 좋습니다.

명령줄 인터페이스 또는 API를 통해 AWS에 액세스할 때 FIPS 140-2 검증된 암호화 모듈이 필요한 경우 FIPS 엔드포인트를 사용합니다. 사용 가능한 FIPS 엔드포인트에 대한 자세한 내용은 [Federal Information Processing Standard(FIPS) 140-2](https://aws.amazon.com/compliance/fips/)를 참조하십시오.

다음 보안 모범 사례에서도 Amazon S3의 데이터 보호를 다룹니다.
+ [Implement server-side encryption](security-best-practices.md#server-side)
+ [Enforce encryption of data in transit](security-best-practices.md#transit)
+ [Consider using Macie with Amazon S3](security-best-practices.md#macie)
+ [Identify and audit all your Amazon S3 buckets](security-best-practices.md#audit)
+ [Monitor Amazon Web Services security advisories](security-best-practices.md#advisories)

# 암호화로 데이터 보호
<a name="UsingEncryption"></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 데이터 센터의 디스크에 데이터가 저장된 동안) 데이터를 보호하는 것을 말합니다. 하이브리드 양자 내성 키 교환 또는 클라이언트 측 암호화를 포함한 Secure Socket Layer/Transport Layer Security(SSL/TLS)를 사용하여 전송 중 데이터를 보호할 수 있습니다. Amazon S3에서 저장 데이터를 보호하는 데는 다음과 같은 옵션이 있습니다.
+ **서버 측 암호화** – AWS 데이터 센터의 디스크에 저장하기 전에 Amazon S3가 객체를 암호화하고 객체를 다운로드할 때 해독합니다.

  모든 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/)를 참조하세요.

  서버 측 암호화의 각 옵션에 대한 자세한 정보는 [서버 측 암호화를 사용하여 데이터 보호](serv-side-encryption.md) 섹션을 참조하세요.

  서버 측 암호화를 구성하려면 다음을 참조하십시오.
  + [Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3) 지정](specifying-s3-encryption.md)
  + [AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정](specifying-kms-encryption.md)
  + [AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 지정](specifying-dsse-encryption.md)
  + [고객 제공 키를 사용한 서버 측 암호화 지정(SSE-C).](specifying-s3-c-encryption.md)

  
+ **클라이언트측 암호화** – 클라이언트 측에서 데이터를 암호화하여 암호화된 데이터를 Amazon S3에 업로드합니다. 이 경우 사용자가 암호화 프로세스, 암호화 키 및 관련 도구를 관리합니다.

  클라이언트 측 암호화를 구성하려면 [클라이언트측 암호화를 사용하여 데이터 보호](UsingClientSideEncryption.md) 단원을 참조하십시오 .

스토리지 바이트의 몇 퍼센트가 암호화되었는지 확인하려면 Amazon S3 스토리지 렌즈 지표를 사용하면 됩니다. S3 스토리지 렌즈는 조직 전반에서 객체 스토리지 사용 및 활동에 대한 가시성을 확보하는 데 사용할 수 있는 클라우드 스토리지 분석 기능입니다. 자세한 내용은 [S3 스토리지 렌즈를 사용한 스토리지 활동 및 사용량 평가](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens?icmpid=docs_s3_user_guide_UsingEncryption.html)를 참조하십시오. 지표의 전체 목록은 [S3 스토리지 렌즈 지표 용어집](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_UsingEncryption)을 참조하십시오.

서버 측 암호화, 클라이언트측 암호화 및 전송 중 암호화에 대한 자세한 내용은 다음 주제를 검토하세요.

**Topics**
+ [서버 측 암호화를 사용하여 데이터 보호](serv-side-encryption.md)
+ [클라이언트측 암호화를 사용하여 데이터 보호](UsingClientSideEncryption.md)
+ [암호화로 전송 중 데이터 보호](UsingEncryptionInTransit.md)

# 서버 측 암호화를 사용하여 데이터 보호
<a name="serv-side-encryption"></a>

**중요**  
2026년 4월부터 AWS는 모든 새 버킷에 대해 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 비활성화합니다. 또한 SSE-C 암호화 데이터가 없는 AWS 계정의 모든 기존 버킷에 대해 SSE-C 암호화가 비활성화됩니다. 이러한 변경으로 인해 SSE-C 암호화가 필요한 몇 가지 애플리케이션은 버킷을 생성한 후 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) API를 통해 SSE-C 사용을 의도적으로 활성화해야 합니다. 이러한 경우 자동화 스크립트,CloudFormation 템플릿 또는 기타 인프라 구성 도구를 업데이트하여 해당 설정을 구성해야 할 수 있습니다. 자세한 내용은 [AWS 스토리지 블로그 게시물](https://aws.amazon.com/blogs/storage/advanced-notice-amazon-s3-to-disable-the-use-of-sse-c-encryption-by-default-for-all-new-buckets-and-select-existing-buckets-in-april-2026/)을 참조하세요.

**중요**  
이제 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에서 AWS 데이터 센터의 디스크에 데이터를 쓰면서 객체 수준에서 데이터를 암호화하고 사용자가 해당 데이터에 액세스할 때 자동으로 암호를 해독합니다. 요청을 인증하기만 하면 액세스 권한을 갖게 되며, 객체의 암호화 여부와 관계없이 액세스 방식에는 차이가 없습니다. 예를 들어, 미리 서명된 URL을 사용하여 객체를 공유하는 경우, 해당 URL은 암호화된 객체와 암호화되지 않은 객체에 동일하게 작동합니다. 또한 버킷에 객체를 나열하는 경우 목록 API 작업은 암호화 여부와 관계없이 전체 객체의 목록을 반환합니다.

모든 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/)를 참조하세요.

**참고**  
동일한 객체에 서로 다른 서버 측 암호화 유형을 동시에 적용할 수는 없습니다.

기존 객체를 암호화해야 하는 경우 S3 배치 작업 및 S3 인벤토리를 사용하십시오. 자세한 내용은 [Amazon S3 배치 작업으로 객체 암호화](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations/) 및 [Batch Operations를 사용하여 대량으로 객체 작업 수행](batch-ops.md) 섹션을 참조하십시오.

Amazon S3에 데이터를 저장할 때는 선택한 암호화 키 관리 방법과 적용하려는 암호화 계층의 수에 따라 서버 측 암호화에 대해 네 가지 옵션을 독립적으로 사용할 수 있습니다.

**Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)**  
모든 Amazon S3 버킷에는 기본적으로 암호화가 구성되어 있습니다. 서버 측 암호화의 기본 옵션은 Amazon S3 관리형 키(SSE-S3)를 사용하는 것입니다. 각 객체가 고유한 키로 암호화됩니다. 또한 추가 보안 조치로 SSE-S3는 주기적으로 교체되는 루트 키를 사용하여 키 자체를 암호화합니다. SSE-S3는 가장 강력한 블록 암호 중 하나인 256비트 Advanced Encryption Standard(AES-256)를 사용하여 데이터를 암호화합니다. 자세한 내용은 [Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3) 사용](UsingServerSideEncryption.md) 섹션을 참조하세요.

**AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 사용한 서버 측 암호화**  
AWS KMS keys(SSE-KMS)를 사용한 서버 측 암호화는 Amazon S3와 AWS KMS 서비스를 통합하여 제공됩니다. AWS KMS를 사용하면 키에 대한 제어 기능이 더 많아집니다. 예를 들어, 개별 키를 보고, 제어 정책을 편집하고, AWS CloudTrail에서 키를 팔로우할 수 있습니다. 또한 고객 관리형 키를 생성하고 관리하거나 사용자, 서비스 및 리전에 고유한 AWS 관리형 키를 사용할 수 있습니다. 자세한 내용은 [AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용](UsingKMSEncryption.md) 섹션을 참조하세요.

**AWS Key Management Service(AWS KMS) 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)**  
AWS KMS keys를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)는 SSE-KMS와 유사하지만 DSSE-KMS는 하나의 계층 대신 AWS KMS 데이터 암호화 키를 먼저 사용한 다음 별도의 Amazon S3 관리형 암호화 키를 사용하는 두 개의 독립적인 AES-256 암호화 계층을 적용합니다. 두 암호화 계층 모두 서버 측 객체에 적용되므로 다양한 AWS 서비스 및 도구를 사용하여 S3의 데이터를 분석하는 동시에 다중 계층 암호화의 규정 준수 요구 사항을 충족하는 암호화 방법을 사용할 수 있습니다. 자세한 내용은 [AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 사용](UsingDSSEncryption.md) 섹션을 참조하세요.

**고객 제공 키를 사용한 서버 측 암호화(SSE-C)**  
고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 사용하면 사용자는 암호화 키를 관리하고 Amazon S3는 암호화(디스크에 쓸 때) 및 해독(객체에 액세스할 때)을 관리합니다. 자세한 내용은 [고객 제공 키(SSE-C)로 서버 측 암호화 사용](ServerSideEncryptionCustomerKeys.md) 섹션을 참조하세요.

**참고**  
S3 액세스 포인트를 사용하는 Amazon FSx 파일 시스템에 액세스 포인트를 사용하는 경우 서버 측 암호화를 위한 한 가지 옵션이 있습니다.  
모든 Amazon FSx 파일 시스템에는 기본적으로 암호화가 구성되어 있으며 AWS Key Management Service를 사용하여 관리형 키로 저장 시 암호화됩니다. 데이터는 파일 시스템에 데이터를 쓰고 읽을 때 파일 시스템에서 자동으로 암호화 및 복호화됩니다. 이러한 프로세스는 Amazon FSx에서 투명하게 처리됩니다.

# Amazon S3 버킷에 대한 기본 서버 측 암호화 동작 설정
<a name="bucket-encryption"></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)를 통한 서버 측 암호화를 사용하여 자동으로 암호화됩니다. 이 암호화 설정은 Amazon S3 버킷의 모든 객체에 적용됩니다.

키 교체 및 액세스 정책 권한 부여 관리와 같이 키를 더 세밀하게 제어해야 하는 경우 AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS) 또는 AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)를 사용하는 방법도 있습니다. KMS 키 편집에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서**의 [키 편집](https://docs.aws.amazon.com/kms/latest/developerguide/editing-keys.html)을 참조하세요.

**참고**  
새 객체 업로드를 자동으로 암호화하도록 버킷을 변경했습니다. 이전에 기본 암호화 없이 버킷을 생성한 경우 Amazon S3는 SSE-S3를 사용하여 버킷에 대해 기본적으로 암호화를 활성화합니다. 이미 SSE-S3 또는 SSE-KMS가 구성된 기존 버킷은 기본 암호화 구성이 변경되지 않습니다. SSE-KMS로 객체를 암호화하려면 버킷 설정에서 암호화 유형을 변경해야 합니다. 자세한 내용은 [AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용](UsingKMSEncryption.md) 섹션을 참조하세요.

SSE-KMS의 기본 암호화를 사용하도록 버킷을 구성할 때 S3 버킷 키를 사용하면 Amazon S3에서 AWS KMS로의 요청 트래픽을 줄이고 암호화 비용을 절감할 수 있습니다. 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 섹션을 참조하세요.

SSE-KMS가 기본 암호화로 사용 설정된 버킷을 식별하려면 Amazon S3 스토리지 렌즈 지표를 사용하면 됩니다. S3 스토리지 렌즈는 조직 전반에서 객체 스토리지 사용 및 활동에 대한 가시성을 확보하는 데 사용할 수 있는 클라우드 스토리지 분석 기능입니다. 자세한 내용은 [Using S3 Storage Lens to protect your data(S3 스토리지 렌즈를 사용한 데이터 보호)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-data-protection.html?icmpid=docs_s3_user_guide_bucket-encryption.html)를 참조하세요.

서버 측 암호화를 사용하는 경우 Amazon S3에서는 객체를 디스크에 저장하기 전에 암호화하고 객체를 다운로드할 때 이를 해독합니다. 서버 측 암호화를 사용한 데이터 보호 및 암호화 키 관리에 대한 자세한 내용은 [서버 측 암호화를 사용하여 데이터 보호](serv-side-encryption.md) 섹션을 참조하세요.

기본 암호화에 필요한 권한에 대한 자세한 내용은 **Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) 섹션을 참조하세요.

Amazon S3 콘솔, AWS SDK, Amazon S3 REST API 및 AWS Command Line Interface(AWS CLI CLI)를 사용하여 S3 버킷에 대한 Amazon S3 기본 암호화 동작을 구성할 수 있습니다.

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

`CopyObject` API 작업이나 `copy-object` AWS CLI 명령을 사용하여 기존 객체를 암호화할 수도 있습니다. 자세한 내용은 *AWS 스토리지 블로그* 게시물 [AWS CLI를 사용하여 기존 Amazon S3 객체 암호화](https://aws.amazon.com/blogs/storage/encrypting-existing-amazon-s3-objects-with-the-aws-cli/)를 참조하세요.

**참고**  
기본 버킷 암호화가 SSE-KMS로 설정된 Amazon S3 버킷은 [서버 액세스 로깅을 사용한 요청 로깅](ServerLogs.md)의 대상 버킷으로 사용할 수 없습니다. 서버 액세스 로그 대상 버킷에는 SSE-S3 기본 암호화만 지원됩니다.

## 크로스 계정 작업에 SSE-KMS 암호화 사용
<a name="bucket-encryption-update-bucket-policy"></a>

크로스 계정 작업에 암호화를 사용하는 경우 다음 사항에 유의하세요.
+ 요청 시 또는 버킷의 기본 암호화 구성을 통해 AWS KMS key Amazon 리소스 이름(ARN) 또는 별칭이 제공되지 않은 경우 AWS 관리형 키(`aws/s3`)가 사용됩니다.
+ KMS 키와 동일한 AWS 계정에 있는 AWS Identity and Access Management(IAM) 보안 주체를 사용하여 S3 객체를 업로드하거나 액세스하는 경우 AWS 관리형 키(`aws/s3`)를 사용할 수 있습니다.
+ 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/)를 참조하세요.

## 복제에 기본 암호화 사용
<a name="bucket-encryption-replication"></a>

복제 대상 버킷에 대한 기본 암호화를 사용 설정하면 다음 암호화 동작이 적용됩니다.
+ 소스 버킷의 객체가 암호화되지 않은 경우 대상 버킷의 복제본 객체는 대상 버킷의 기본 암호화 설정을 사용하여 암호화됩니다. 결과적으로 소스 객체의 엔터티 태그(ETag)는 복제본 객체의 ETag와 다릅니다. ETag를 사용하는 애플리케이션이 있는 경우 이 차이를 고려하도록 해당 애플리케이션을 업데이트해야 합니다.
+ 소스 버킷의 객체가 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3), AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS) 또는 AWS KMS 키를 사용한 이중 계층 서브 측 암호화(DSSE-KMS)를 사용하여 암호화되는 경우, 대상 버킷의 복제본 객체는 소스 객체와 동일한 유형의 암호화를 사용합니다. 대상 버킷의 기본 암호화 설정은 사용되지 않습니다.

SSE-KMS와 함께 기본 암호화를 사용하는 방법에 대한 자세한 내용은 [암호화된 객체 복제](replication-config-for-kms-objects.md) 섹션을 참조하세요.

## Amazon S3 버킷 키와 기본 암호화 사용
<a name="bucket-key-default-encryption"></a>

새 객체에서 기본 암호화 동작으로 SSE-KMS를 사용하도록 버킷을 구성할 때 S3 버킷 키도 구성할 수 있습니다. S3 버킷 키는 Amazon S3에서 AWS KMS로의 트랜잭션 수를 줄여 SSE-KMS의 비용을 줄입니다.

새 객체에서 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 버킷 키 사용](bucket-key.md) 단원을 참조하십시오.

# 기본 암호화 구성
<a name="default-bucket-encryption"></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)를 통한 서버 측 암호화를 사용하여 자동으로 암호화됩니다. 이 암호화는 Amazon S3 버킷의 모든 새 객체에 적용되며 무료로 제공됩니다.

키 교체 및 액세스 정책 권한 부여 관리와 같이 암호화 키를 더 세밀하게 제어해야 하는 경우 AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS) 또는 AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)를 사용하는 방법도 있습니다. SSE-KMS에 대한 자세한 내용은 [AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정](specifying-kms-encryption.md) 단원을 참조하십시오. DSSE-KMS에 대한 자세한 내용은 [AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 사용](UsingDSSEncryption.md) 섹션을 참조하세요.

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

기본 버킷 암호화를 SSE-KMS로 설정하는 경우 S3 버킷 키도 설정하여 AWS KMS 요청 비용을 절감할 수 있습니다. 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 섹션을 참조하세요.

**참고**  
[PutBucketEncryption](https://docs.aws.amazon.com//AmazonS3/latest/API/API_PutBucketEncryption.html)을 사용하여 기본 버킷 암호화를 SSE-KMS로 설정하려는 경우 KMS 키 ID가 올바른지 확인해야 합니다. Amazon S3는 PutBucketEncryption 요청에 제공된 KMS 키 ID를 검증하지 않습니다.

S3 버킷의 기본 암호화 사용에 대한 추가 비용은 없습니다. 기본 암호화 동작을 구성하도록 요청할 경우 표준 Amazon S3 요청 요금이 발생합니다. 요금에 대한 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/)을 참조하십시오. SSE-KMS 및 DSSE-KMS의 경우 AWS KMS 요금이 적용됩니다. 요금은 [AWS KMS 요금](https://aws.amazon.com/kms/pricing/)에 나와 있습니다.

고객 제공 암호화 키(SSE-C)를 통한 서버 측 암호화는 기본 암호화로 지원되지 않습니다.

Amazon S3 콘솔, AWS SDK, Amazon S3 REST API 및 AWS Command Line Interface(AWS CLI)를 사용하여 S3 버킷에 대한 Amazon S3 기본 암호화를 구성할 수 있습니다.

**기본 암호화를 사용 설정하기 전에 유의할 변경 사항**  
버킷에 대한 기본 암호화를 사용 설정한 후에는 다음 암호화 동작이 적용됩니다.
+ 기본 암호화가 사용 설정되기 전에 버킷에 있었던 객체의 암호화는 변경되지 않습니다.
+ 기본 암호화를 사용 설정한 후 객체를 업로드하는 경우:
  + `PUT` 요청 헤더에 암호화 정보가 포함되지 않는 경우 Amazon S3는 버킷의 기본 암호화 설정을 사용하여 객체를 암호화합니다.
  + `PUT` 요청 헤더에 암호화 정보가 포함되는 경우 Amazon S3는 객체를 Amazon S3에 저장하기 전에 `PUT` 요청의 암호화 정보를 사용하여 객체를 암호화합니다.
+ 기본 암호화 구성으로 SSE-KMS 또는 DSSE-KMS 옵션을 사용할 경우 AWS KMS의 초당 요청 수(RPS) 할당량이 적용됩니다. AWS KMS 할당량과 할당량 증대를 요청하는 방법에 대한 자세한 내용은 **AWS Key Management Service 개발자 안내서의 [할당량](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)을 참조하세요.

**참고**  
기본 암호화가 활성화되기 전에 업로드된 객체는 암호화되지 않습니다. 기존 객체 암호화에 대한 자세한 내용은 [Amazon S3 버킷에 대한 기본 서버 측 암호화 동작 설정](bucket-encryption.md) 섹션을 참조하세요.

## S3 콘솔 사용
<a name="bucket-encryption-how-to-set-up-console"></a>

**Amazon S3 버킷에 대해 기본 암호화를 구성하는 방법**

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

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

1. **버킷(Buckets)** 목록에서 원하는 버킷의 이름을 선택합니다.

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

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

1. 암호화를 구성하려면 **암호화 유형**에서 다음 중 하나를 선택합니다.
   + **Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)**
   + **AWS Key Management Service 키를 사용한 서버 측 암호화(SSE-KMS)**
   + **AWS Key Management Service 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)**
**중요**  
기본 암호화 구성으로 SSE-KMS 또는 DSSE-KMS 옵션을 사용할 경우 AWS KMS의 초당 요청 수(RPS) 할당량이 적용됩니다. AWS KMS 할당량과 할당량 증대를 요청하는 방법에 대한 자세한 내용은 **AWS Key Management Service 개발자 안내서의 [할당량](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)을 참조하십시오.

   버킷에 다른 유형의 기본 암호화를 지정하지 않으면 버킷과 새 객체는 기본적으로 SSE-S3로 암호화됩니다. 기본 암호화에 대한 자세한 내용은 [Amazon S3 버킷에 대한 기본 서버 측 암호화 동작 설정](bucket-encryption.md) 섹션을 참조하십시오.

   Amazon S3 서버 측 암호화를 사용하는 데이터 암호화에 대한 자세한 내용은 [Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3) 사용](UsingServerSideEncryption.md) 섹션을 참조하십시오.

1. **AWS Key Management Service키를 사용한 서버 측 암호화(SSE-KMS)** 또는 **AWS Key Management Service 키를 사용한 이중 계층 서버 측 암호화(DSSE-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 키만 사용할 수 있습니다. **KMS 키에서 선택(Choose from your KMS keys)**을 선택하면 S3 콘솔에는 KMS 키가 리전당 100개씩만 나열됩니다. 동일한 리전에 100개 이상의 KMS 키가 있는 경우, S3 콘솔에서 처음 100개의 KMS 키만 볼 수 있습니다. 콘솔에 나열되지 않은 KMS 키를 사용하려면 **AWS KMS key ARN 입력**을 선택하고 KMS 키 ARN을 입력합니다.  
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)를 참조하세요.

      Amazon S3에서 SSE-KMS를 사용하는 방법에 대한 자세한 내용은 [AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용](UsingKMSEncryption.md) 섹션을 참조하세요. DSSE-KMS 사용에 대한 자세한 내용은 [AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 사용](UsingDSSEncryption.md) 섹션을 참조하세요.

   1. SSE-KMS와 함께 기본 암호화를 사용하도록 버킷을 구성할 때 S3 버킷 키도 활성화할 수 있습니다. S3 버킷 키를 사용하면 Amazon S3에서 AWS KMS로의 요청 트래픽이 줄어 암호화 비용이 절감됩니다. 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 섹션을 참조하세요.

      S3 버킷 키를 사용하려면 [**버킷 키(Bucket Key)**]에서 [**사용(Enable)**]을 선택합니다.
**참고**  
S3 버킷 키는 DSSE-KMS에서 지원되지 않습니다.

1. **변경 사항 저장**을 선택합니다.

## AWS CLI 사용
<a name="default-bucket-encryption-cli"></a>

다음 예시에서는 SSE-S3를 사용하거나 S3 버킷 키와 함께 SSE-KMS를 사용하여 기본 암호화를 구성하는 방법을 보여줍니다.

기본 암호화에 대한 자세한 내용은 [Amazon S3 버킷에 대한 기본 서버 측 암호화 동작 설정](bucket-encryption.md) 섹션을 참조하세요. AWS CLI를 사용하여 기본 암호화를 구성하는 방법에 대한 자세한 내용은 [put-bucket-encryption](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-encryption.html)을 참조하세요.

**Example – SSE-S3를 사용한 기본 암호화**  
이 예시에서는 Amazon S3 관리형 키를 사용하여 기본 버킷 암호화를 구성합니다.  

```
aws s3api put-bucket-encryption --bucket amzn-s3-demo-bucket --server-side-encryption-configuration '{
    "Rules": [
        {
            "ApplyServerSideEncryptionByDefault": {
                "SSEAlgorithm": "AES256"
            }
        }
    ]
}'
```

**Example - S3 버킷 키와 SSE-KMS를 사용한 기본 암호화**  
이 예제에서는 S3 버킷 키와 SSE-KMS를 사용하여 기본 버킷 암호화를 구성합니다.  

```
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
            }
        ]
    }'
```

## REST API 사용
<a name="bucket-encryption-how-to-set-up-api"></a>

REST API `PutBucketEncryption` 작업을 사용하여 기본 암호화를 활성화하고 사용할 서버 측 암호화 유형(SSE-S3, SSE-KMS 또는 DSSE-KMS)을 설정합니다.

자세한 내용은 *Amazon Simple Storage Service API 참조*에서 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTencryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTencryption.html)를 참조하세요.

# AWS CloudTrail 및 Amazon EventBridge를 사용한 기본 암호화 모니터링
<a name="bucket-encryption-tracking"></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)를 참조하십시오.

AWS CloudTrail 이벤트를 사용하여 Amazon S3 버킷에 대한 기본 암호화 구성 요청을 추적할 수 있습니다. CloudTrail 로그에 사용되는 API 이벤트 이름은 다음과 같습니다.
+ `PutBucketEncryption`
+ `GetBucketEncryption`
+ `DeleteBucketEncryption`

또한 CloudTrail 이벤트를 이러한 API 호출에 매칭하는 EventBridge 규칙을 생성할 수 있습니다. CloudTrail 이벤트에 대한 자세한 내용은 [콘솔을 사용하여 버킷의 객체에 대한 로깅 사용 설정](enable-cloudtrail-logging-for-s3.md#enable-cloudtrail-events) 섹션을 참조하세요. EventBridge 이벤트에 자세한 내용은 [AWS 서비스의 이벤트](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-service-event.html)를 참조하세요.

객체 수준 Amazon S3 작업에 CloudTrail 로그를 사용하여 Amazon S3에 대한 `PUT` 및 `POST` 요청을 추적할 수 있습니다. 이러한 작업을 사용하면 들어오는 `PUT` 요청에 암호화 헤더가 없을 때 기본 암호화를 사용하여 개체가 암호화되는지 여부를 확인할 수 있습니다.

Amazon S3가 기본 암호화 설정을 사용하여 객체를 암호화하는 경우 로그에는 이름-값 페어로 `"SSEApplied":"Default_SSE_S3"`, `"SSEApplied":"Default_SSE_KMS"` 또는 `"SSEApplied":"Default_DSSE_KMS"` 필드 중 하나가 포함됩니다.

Amazon S3가 `PUT` 암호화 헤더를 사용하여 객체를 암호화하는 경우 로그에는 이름-값 페어로 `"SSEApplied":"SSE_S3"`, `"SSEApplied":"SSE_KMS"`, `"SSEApplied":"DSSE_KMS"` 또는 `"SSEApplied":"SSE_C"` 필드 중 하나가 포함됩니다.

멀티파트 업로드의 경우 이 정보가 `InitiateMultipartUpload` API 작업 요청에 포함됩니다. CloudTrail 및 CloudWatch 사용에 대한 자세한 내용은 [Amazon S3의 로깅 및 모니터링](monitoring-overview.md) 섹션을 참조하세요.

# 기본 암호화 관련 FAQ
<a name="default-encryption-faq"></a>

이제 Amazon S3가 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)를 Amazon S3 내 모든 버킷 암호화의 기본 수준으로 적용합니다. 2023년 1월 5일부터 Amazon S3로의 모든 새 객체 업로드는 추가 비용 없이 성능에 영향을 미치지 않고 자동으로 암호화됩니다. 256비트 고급 암호화 표준(AES-256)을 사용하는 SSE-S3는 모든 새 버킷과 기본 암호화가 구성되어 있지 않은 기존 S3 버킷에 자동으로 적용됩니다. S3 버킷 기본 암호화 구성에 및 신규 객체 업로드에 대한 자동 암호화 상태는 AWS CloudTrail 로그, S3 인벤토리, S3 스토리지 렌즈, Amazon S3 콘솔에서 사용할 수 있으며, AWS Command Line Interface(AWS CLI) 및 AWS SDK에서 추가 Amazon S3 API 응답 헤더로도 사용할 수 있습니다.

다음 섹션에서는 이 업데이트에 대한 질문과 답변을 제공합니다.

**이미 기본 암호화가 구성되어 있는 기존 버킷의 기본 암호화 설정도 Amazon S3가 변경하나요?**  
아니요. 이미 SSE-S3 또는 AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 사용한 서버 측 암호화가 구성된 기존 버킷은 기본 암호화 구성이 변경되지 않습니다. 버킷에 기본 암호화 동작을 설정하는 방법에 대한 자세한 내용은 [Amazon S3 버킷에 대한 기본 서버 측 암호화 동작 설정](bucket-encryption.md) 페이지를 참조하십시오. SSE-S3 및 SSE-KMS 암호화 설정에 대한 자세한 내용은 [서버 측 암호화를 사용하여 데이터 보호](serv-side-encryption.md) 페이지를 참조하십시오.

**기본 암호화가 구성되지 않은 기존 버킷에서 기본 암호화가 활성화되나요?**  
예. 암호화되지 않은 기존의 모든 버킷에 이제 Amazon S3가 기본 암호화를 구성하여, 이들 버킷에 새로 업로드되는 객체에 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)를 적용합니다. 기존의 암호화되지 않은 버킷에 이미 있는 객체는 자동으로 암호화되지 않습니다.

**새 객체 업로드의 기본 암호화 상태를 보려면 어떻게 해야 합니까?**  
현재, 신규 객체 업로드의 기본 암호화 상태는 AWS CloudTrail 로그, S3 인벤토리, S3 스토리지 렌즈, Amazon S3 콘솔에서 확인할 수 있으며, AWS Command Line Interface(AWS CLI) 및 AWS SDK에서 추가 Amazon S3 API 응답 헤더로도 확인할 수 있습니다.
+ CloudTrail 이벤트를 보려면 *AWS CloudTrail 사용 설명서*의 [CloudTrail 콘솔에서 CloudTrail 이벤트 보기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events-console.html)를 참조하십시오. CloudTrail 로그는 Amazon S3로의 `PUT` 및 `POST` 요청에 대한 API 추적을 제공합니다. 버킷 내 객체 암호화에 기본 암호화가 사용되면 `PUT` 및 `POST` API 요청에 대한 CloudTrail 로그에 `"SSEApplied":"Default_SSE_S3"` 필드가 이름-값 쌍으로 포함됩니다.
+ S3 인벤토리에서 새 객체 업로드의 자동 암호화 상태를 보려면 **Encryption**(암호화) 메타데이터 필드를 포함하도록 S3 인벤토리 보고서를 구성한 다음 보고서에서 각 새 객체의 암호화 상태를 확인하십시오. 자세한 내용은 [Amazon S3 인벤토리 설정](https://docs.aws.amazon.com/AmazonS3/latest/userguide/configure-inventory.html#storage-inventory-setting-up)을 참조하십시오.
+ S3 스토리지 렌즈에서 새 객체 업로드에 대한 자동 암호화 상태를 보려면 S3 스토리지 렌즈 대시보드를 구성하고 대시보드의 **Data protection**(데이터 보호) 범주에서 **Encrypted bytes**(암호화된 바이트) 및 **Encrypted object count**(암호화된 객체 수) 지표를 확인하십시오. 자세한 내용은 [S3 콘솔 사용](storage_lens_creating_dashboard.md#storage_lens_console_creating) 및 [대시보드에서 S3 스토리지 렌즈 지표 보기](storage_lens_view_metrics_dashboard.md)(을)를 참조하세요.
+ Amazon S3 콘솔에서 자동 버킷 수준 암호화 상태를 보려면 Amazon S3 콘솔에서 Amazon S3 버킷의 **기본 암호화**를 확인하십시오. 자세한 내용은 [기본 암호화 구성](default-bucket-encryption.md) 섹션을 참조하세요.
+ 자동 암호화 상태를 AWS Command Line Interface(AWS CLI) 및 AWS SDK에서 추가 Amazon S3 API 응답 헤더로 확인하려면 객체 작업 API(예: [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) 및 [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html))를 사용할 때 `x-amz-server-side-encryption` 응답 헤더를 확인하십시오.

**이 변경 사항을 활용하려면 어떻게 해야 합니까?**  
기존 애플리케이션을 변경할 필요는 없습니다. 모든 버킷에 기본 암호화가 활성화되어 있어, Amazon S3에 새로 업로드되는 모든 객체는 자동으로 암호화됩니다.

**버킷에 새로 기록되는 객체의 암호화를 비활성화할 수 있습니까?**  
아니요. SSE-S3 암호화는 버킷에 새로 업로드되는 모든 객체에 적용되는 새로운 기본 암호화 수준입니다. 새 객체 업로드에 대한 암호화는 더 이상 비활성화할 수 없습니다.

**요금이 영향을 받습니까?**  
아니요. SSE-S3 기본 암호화 기능은 추가 비용 없이 제공됩니다. 스토리지, 요청 등 S3 기능에 대한 요금이 기존과 똑같이 청구됩니다. 요금에 대해서는 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/)을 참조하십시오.

**암호화되지 않은 기존 객체도 Amazon S3가 암호화합니까?**  
아니요. Amazon S3는 2023년 1월 5일부터 새로 업로드되는 객체만 자동으로 암호화합니다. 기존 객체를 암호화하려면 S3 배치 작업을 사용하여 객체의 암호화된 사본을 생성하면 됩니다. 이렇게 암호화된 사본은 기존 객체 데이터 및 이름을 유지하고, 지정한 암호화 키를 사용하여 암호화됩니다. 자세한 내용은 *AWS Storage 블로그*의 [Encrypting objects with Amazon S3 Batch Operations](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations/)(Amazon S3 배치 작업에서 객체 암호화)를 참조하십시오.

**이번 릴리스 전에 내 버킷에 암호화를 활성화하지 않았습니다. 객체에 액세스하는 방법을 변경해야 합니까?**  
아니요. SSE-S3 기본 암호화 기능을 사용하면 Amazon S3에 기록되는 데이터가 자동으로 암호화되고, 해당 데이터에 액세스할 때 데이터가 자동으로 복호화됩니다. 자동으로 암호화된 객체에 액세스하는 방식에는 변화가 없습니다.

**클라이언트측 암호화된 내 객체에 액세스하는 방법을 변경해야 합니까?**  
아니요. Amazon S3에 업로드되기 전에 클라이언트측 암호화된 모든 객체는 암호화된 사이퍼텍스트 객체로 Amazon S3에 도착합니다. 이러한 객체에 이제 SSE-S3 암호화 계층이 추가로 놓입니다. 클라이언트측 암호화된 객체를 사용하는 워크로드는 클라이언트 서비스 또는 권한 부여 설정을 변경할 필요가 없습니다.

**참고**  
업데이트된 버전의 AWS Provider를 사용하지 않는 HashiCorp Terraform 사용자는 고객 정의 암호화 구성 없이 새 S3 버킷을 생성하면 예기치 않은 드리프트를 경험할 수 있습니다. 이러한 드리프트를 피하려면 Terraform AWS Provider 버전을 모든 4.x 릴리스, 3.76.1, 2.70.4 버전 중 하나로 업데이트해야 합니다.

# 기존 데이터에 대한 서버 측 암호화 업데이트
<a name="update-sse-encryption"></a>

모든 Amazon S3 버킷에는 기본적으로 암호화가 구성되어 있으며, 객체는 Amazon S3 관리형 키(SSE-S3)를 통한 서버 측 암호화를 사용하여 자동으로 암호화됩니다. 이 기본 암호화 설정은 Amazon S3 버킷의 모든 새 객체에 적용됩니다.

`UpdateObjectEncryption` API 작업을 사용하면 범용 버킷에 있는 기존 암호화된 객체의 서버 측 암호화 유형을 Amazon S3 관리형 암호화를 사용한 서버 측 암호화(SSE-S3)에서 AWS Key Management Service(AWS KMS) 암호화 키를 사용한 서버 측 암호화(SSE-KMS)로 원자적으로 업데이트할 수 있습니다. `UpdateObjectEncryption` API 작업은 [봉투 암호화](https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#enveloping)를 사용하여 새로 지정된 서버 측 암호화 유형으로 객체를 암호화 및 복호화하는 데 사용되는 데이터 키를 다시 암호화합니다.

Amazon S3는 데이터 이동 없이 이 암호화 유형 업데이트를 수행합니다. 즉, `UpdateObjectEncryption` 작업을 사용하면 데이터가 복사되지 않고, S3 Glacier Flexible Retrieval 또는 S3 Glacier Deep Archive의 아카이브된 객체가 복원되지 않으며, S3 Intelligent-Tiering 스토리지 클래스의 객체가 계층 간에 이동되지 않습니다. 또한 `UpdateObjectEncryption` 작업은 스토리지 클래스, 생성 날짜, 마지막 수정 날짜, ETag 및 체크섬 속성을 포함한 모든 객체 메타데이터 속성을 보존합니다.

`UpdateObjectEncryption` 작업은 범용 버킷이 지원하는 모든 S3 스토리지 클래스에서 지원됩니다. `UpdateObjectEncryption` 작업을 사용하여 다음을 수행할 수 있습니다.
+ 암호화된 객체를 Amazon S3 관리형 암호화를 사용한 서버 측 암호화(SSE-S3)에서 AWS Key Management Service(AWS KMS) 암호화 키를 사용한 서버 측 암호화(SSE-KMS)로 변경합니다.
+ Amazon S3에서 AWS KMS로의 AWS KMS 요청 트래픽을 줄이기 위해 S3 버킷 키를 사용하도록 객체 수준 SSE-KMS 암호화된 객체를 업데이트합니다. 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 섹션을 참조하세요.
+ 사용자 지정 키 교체 표준을 준수하도록 데이터를 암호화하는 데 사용되는 고객 관리형 KMS 키를 변경합니다.

**참고**  
암호화되지 않은 소스 객체나 AWS KMS keys를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 또는 고객 제공 암호화 키(SSE-C)로 암호화된 소스 객체는 이 작업에서 지원되지 않습니다.

`UpdateObjectEncryption` 작업은 일반적으로 객체 또는 스토리지 클래스(S3 Glacier Flexible Retrieval, S3 Glacier Deep Archive 등)의 크기에 관계없이 밀리초 단위로 완료됩니다. 이 작업은 S3 Intelligent-Tiering에 대한 액세스로 간주되지 않으므로 객체의 서버 측 암호화 유형을 변경하면 Infrequent Access 계층 또는 Archive Instant Access 계층의 객체가 자동으로 Frequent Access 계층으로 되돌아가지 않습니다.

`UpdateObjectEncryption`는 Amazon S3 서버 액세스 로그 및 AWS CloudTrail 데이터 이벤트에 로깅되는 객체 수준(데이터 플레인) API 작업입니다. 자세한 내용은 [Amazon S3에 대한 로깅 옵션](logging-with-S3.md) 섹션을 참조하세요.

 `UpdateObjectEncryption` 작업은 `PUT`, `COPY`, `POST` 및 `LIST` 요청(요청 1,000개당)과 요금이 동일하며 기본 객체의 스토리지 클래스와 관계없이 항상 S3 Standard 스토리지 클래스 요청으로 요금이 부과됩니다. 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/)을 참조하세요.

## 제한 및 고려 사항
<a name="update-sse-encryption-restrictions"></a>

`UpdateObjectEncryption` 작업을 사용하는 경우 다음과 같은 제한 및 고려 사항이 적용됩니다.
+ `UpdateObjectEncryption` 작업은 암호화되지 않은 객체 또는 AWS KMS keys를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 또는 고객 제공 암호화 키(SSE-C)로 암호화된 객체를 지원하지 않습니다. 또한 SSE-S3를 요청된 새 암호화 유형 `UpdateObjectEncryption` 요청으로 지정할 수 없습니다.
+ `UpdateObjectEncryption` 작업을 사용하여 S3 버전 관리가 활성화된 버킷의 객체를 업데이트할 수 있습니다. 특정 버전의 암호화 유형을 업데이트하려면 `UpdateObjectEncryption` 요청에 버전 ID를 지정해야 합니다. 버전 ID를 지정하지 않으면 `UpdateObjectEncryption` 요청이 객체의 현재 버전에 적용됩니다. S3 버전 관리에 대한 자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하십시오.
+ S3 Object Lock 보존 모드 또는 법적 보존이 적용된 객체에서는 `UpdateObjectEncryption` 작업이 실패합니다. 객체에 거버넌스 모드 보존 기간 또는 법적 보존이 있는 경우 `UpdateObjectEncryption` 요청을 실행하기 전에 먼저 객체의 Object Lock 상태를 해제해야 합니다. Object Lock 규정 준수 모드 보존 기간이 적용된 객체에는 `UpdateObjectEncryption` 작업을 사용할 수 없습니다. S3 객체 잠금에 대한 자세한 내용은 [Object Lock으로 객체 잠금](object-lock.md) 섹션을 참조하세요.
+ 라이브 복제가 활성화된 소스 버킷에 대한 `UpdateObjectEncryption` 요청은 대상 버킷에서 복제본 이벤트를 시작하지 않습니다. 소스 버킷과 대상 버킷 모두에서 객체의 암호화 유형을 변경하려면 소스 버킷과 대상 버킷의 객체에 대해 별도의 `UpdateObjectEncryption` 요청을 시작해야 합니다.
+ 기본적으로 고객 관리형 KMS 키를 지정하는 모든 `UpdateObjectEncryption` 요청은 버킷 소유자의 AWS 계정이 소유한 KMS 키로 제한됩니다. AWS Organizations를 사용하는 경우 AWS Support에 문의하여 조직 내 다른 멤버 계정이 소유한 AWS KMS keys를 사용할 수 있는 기능을 요청할 수 있습니다.
+ S3 배치 복제를 사용하여 리전 간 데이터세트를 복제하며 이전에 객체의 서버 측 암호화 유형이 SSE-S3에서 SSE-KMS로 업데이트된 경우 추가 권한이 필요할 수 있습니다. 소스 리전 버킷에는 `kms:decrypt` 권한이 있어야 합니다. 그런 다음 대상 리전의 버킷에 대한 `kms:decrypt` 및 `kms:encrypt` 권한이 필요합니다.
+ `UpdateObjectEncryption` 요청에 전체 KMS 키 ARN을 제공해야 합니다. 별칭 이름이나 별칭 ARN은 사용할 수 없습니다. AWS KMS 콘솔에서 또는 AWS KMS `DescribeKey` API를 사용하여 전체 KMS 키 ARN을 확인할 수 있습니다.

## 필수 권한
<a name="update-sse-encryption-permissions"></a>

`UpdateObjectEncryption` 작업을 수행하려면 다음 권한이 있어야 합니다.
+ `s3:PutObject`
+ `s3:UpdateObjectEncryption`
+ `kms:Encrypt`
+ `kms:Decrypt`
+ `kms:GenerateDataKey`
+ `kms:ReEncrypt*`

AWS Organizations를 사용하는 경우 조직 내 다른 AWS 계정의 고객 관리형 KMS 키를 통해 작업을 사용하려면 `organizations:DescribeAccount` 권한이 있어야 합니다. 또한 AWS Support에 문의하여 조직 내 다른 멤버 계정이 소유한 AWS KMS keys를 사용할 수 있는 기능을 요청해야 합니다.

`UpdateObjectEncryption` 작업을 수행하려면 IAM 역할에 다음 AWS Identity and Access Management(IAM) 정책을 추가합니다. 이 정책을 사용하려면 `amzn-s3-demo-bucket`을 범용 버킷의 이름으로 바꾸고 다른 `user input placeholders`를 자체 정보로 바꿉니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [{
            "Sid": "AllowUpdateObjectEncryption",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:UpdateObjectEncryption",
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:GenerateDataKey",
                "kms:ReEncrypt*",
                "organizations:DescribeAccount"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket",
                "arn:aws:s3:::amzn-s3-demo-bucket/*",
                "arn:aws:kms:us-east-1:111122223333:key/01234567-89ab-cdef-0123-456789abcdef"
            ]
        }
    ]
}
```

## 암호화 일괄 업데이트
<a name="update-sse-encryption-bulk"></a>

단일 요청으로 둘 이상의 Amazon S3 객체의 서버 측 암호화 유형을 업데이트하려면 S3 Batch Operations를 사용합니다. S3 Batch Operations에 작업할 객체 목록을 제공하거나, Batch Operations에 접두사, 스토리지 클래스, 생성 날짜, 암호화 유형, KMS 키 ARN 또는 S3 버킷 키 상태를 포함한 객체 메타데이터를 기반으로 객체 목록을 생성하도록 지시할 수 있습니다. S3 배치 작업은 지정된 작업을 수행하기 위해 각 API 작업을 호출합니다. 단일 Batch Operations 작업으로 페타바이트 규모의 데이터가 포함된 버킷 내 수십억 개의 객체에서 지정된 작업을 수행할 수 있습니다. 배치 작업에 대한 자세한 내용은 [Batch Operations를 사용하여 대량으로 객체 작업 수행](batch-ops.md) 섹션을 참조하세요.

S3 배치 작업 기능은 진행 상황을 추적하고 알림을 보내며 모든 작업에 대한 자세한 완료 보고서를 저장하여 감사 가능한 완전관리형 서버리스 환경을 제공합니다. Amazon S3 콘솔, AWS Command Line Interface(AWS CLI) AWS SDK 또는 Amazon S3 REST API를 통해 S3 Batch Operations를 사용할 수 있습니다. 자세한 내용은 [객체 암호화 업데이트](batch-ops-update-encryption.md) 섹션을 참조하세요.

## 객체에 대한 암호화 업데이트
<a name="update-sse-encryption-single-object"></a>

AWS Command Line Interface(AWS CLI) AWS SDK 또는 Amazon S3 REST API를 통해 객체의 서버 측 암호화 유형을 업데이트할 수 있습니다.

### 객체에 대한 암호화 업데이트
<a name="update-sse-encryption-single-object-procedure"></a>

#### AWS CLI 사용
<a name="update-sse-encryption-single-object-cli"></a>

다음 명령을 실행하려면 AWS CLI를 설치하고 구성해야 합니다. AWS CLI를 설치하지 않은 경우 *AWS Command Line Interface 사용 설명서*에서 [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html)를 참조하세요.

또는 AWS CloudShell을 사용하여 콘솔에서 AWS CLI 명령을 실행할 수 있습니다. AWS CloudShell은 브라우저 기반의 사전 인증된 쉘로, AWS Management Console에서 직접 시작할 수 있습니다. 자세한 내용은 *AWS CloudShell 사용 설명서*에서 [CloudShell이란 무엇인가요?](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html) 및 [AWS CloudShell 시작하기](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html)를 참조하세요.

**AWS CLI를 사용하여 객체에 대한 암호화를 업데이트하는 방법**

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

1. S3 버킷 키와 함께 SSE-KMS를 사용하려면 다음 명령으로 범용 버킷(예: `index.html`)의 단일 객체(`amzn-s3-demo-bucket`)에 대한 암호화를 업데이트합니다.

   ```
   aws s3api update-object-encryption \
   --bucket amzn-s3-demo-bucket \
   --key index.html \
   --object-encryption '{"SSEKMS": { "KMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/f12a345a-678e-9bbb-1025-62e317037583", "BucketKeyEnabled": true }}'
   ```
**참고**  
전체 AWS KMS key Amazon 리소스 이름(ARN)을 지정해야 합니다. KMS 키 ID 및 KMS 키 별칭은 지원되지 않습니다.

1. `head-object` 명령을 실행하여 객체의 업데이트된 암호화 유형을 확인합니다.

   ```
   aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html
   ```

#### REST API 사용
<a name="update-sse-encryption-single-object-rest-api"></a>

객체에 대한 암호화를 업데이트하기 위해 REST 요청을 보낼 수 있습니다. [자세한 내용은 UpdateObjectEncryption 단원을 참조하세요.](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateObjectEncryption.html)

#### AWS SDK 사용
<a name="update-sse-encryption-single-object-sdk"></a>

AWS SDK를 사용하여 객체에 대한 암호화를 업데이트할 수 있습니다. 자세한 내용은 [지원되는 SDK 목록](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateObjectEncryption.html#API_UpdateObjectEncryption_SeeAlso)을 참조하세요.

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

**Example**  
다음 AWS SDK for Java 2.x 예제에서는 범용 버킷의 객체에 대한 암호화 유형을 SSE-KMS로 업데이트합니다.  

```
    public void updateObjectEncryption(String bucketName,
                                       String objectKey,
                                       String versionId,
                                       String kmsKeyArn,
                                       boolean bucketKeyEnabled) {
        // Create the target object encryption type.
        ObjectEncryption objectEncryption = ObjectEncryption.builder()
                .ssekms(SSEKMSEncryption.builder()
                        .kmsKeyArn(kmsKeyArn)
                        .bucketKeyEnabled(bucketKeyEnabled)
                        .build())
                .build();

        // Create the UpdateObjectEncryption request.
        UpdateObjectEncryptionRequest request = UpdateObjectEncryptionRequest.builder()
                .bucket(bucketName)
                .key(objectKey)
                .versionId(versionId)
                .objectEncryption(objectEncryption)
                .build();

        // Update the object encryption.
        try {
            getS3Client().updateObjectEncryption(request);
            logger.info("Object encryption updated to SSE-KMS for {} in bucket {}", objectKey, bucketName);
        } catch (S3Exception e) {
            logger.error("Failed to update to object encryption: {} - Error code: {}", e.awsErrorDetails().errorMessage(),
                    e.awsErrorDetails().errorCode());
            throw e;
        }
    }
```

------
#### [ Python ]

**Example**  
다음 AWS SDK for Python (Boto3) 예제에서는 범용 버킷의 객체에 대해 암호화 유형을 SSE-KMS로 업데이트하는 방법을 보여줍니다.  

```
response = client.update_object_encryption(
    Bucket='string',
    Key='string',
    VersionId='string',
    ObjectEncryption={
        'SSEKMS': {
                'KMSKeyArn': 'string',
                'BucketKeyEnabled': True|False
        }
    }
)
```

------

# Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3) 사용
<a name="UsingServerSideEncryption"></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)를 통한 서버 측 암호화로 암호화됩니다.

서버 측 암호화를 사용하여 저장된 데이터를 보호합니다. Amazon S3는 각 객체를 고유한 키로 암호화합니다. 또한 추가 보안 조치로 주기적으로 바뀌는 키를 사용하여 키 자체를 암호화합니다. Amazon S3 서버 측 암호화는 256비트 고급 암호화 표준 갈루아/카운터 모드(AES-GCM)를 사용하여 업로드된 모든 객체를 암호화합니다.

Amazon S3 관리형 키(SSE-S3)를 통한 서버 측 암호화를 사용하는 경우 추가 요금이 부과되지 않습니다. 그러나 기본 암호화 기능을 구성하도록 요청할 경우 표준 Amazon S3 요청 요금이 발생합니다. 요금에 대한 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/)을 참조하십시오.

Amazon S3 관리형 키만 사용하여 데이터 업로드를 암호화하도록 요구하는 경우 다음 버킷 정책을 사용할 수 있습니다. 예를 들어 다음 버킷 정책은 요청에 서버 측 암호화를 요청하는 `x-amz-server-side-encryption` 헤더가 포함되지 않을 경우 객체 업로드 권한을 거부합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "PutObjectPolicy",
  "Statement": [
    {
      "Sid": "DenyObjectsThatAreNotSSES3",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption": "AES256"
        }
      }
    }
   ]
}
```

------

**참고**  
서버 측 암호화는 객체 메타데이터가 아닌 객체 데이터만 암호화합니다.

## 서버 측 암호화를 위한 API 지원
<a name="APISupportforServer-SideEncryption"></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/)를 참조하세요.

객체 생성 REST API를 사용하여 서버 측 암호화를 구성하려면 `x-amz-server-side-encryption` 요청 헤더를 제공해야 합니다. REST API에 대한 정보는 [REST API 사용](specifying-s3-encryption.md#SSEUsingRESTAPI) 섹션을 참조하세요.

다음 Amazon S3 API는 이러한 헤더를 지원합니다.
+ **PUT 작업** - `PUT` API를 사용하여 데이터를 업로드할 때 요청 헤더를 지정합니다. 자세한 내용은 [PUT Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) 섹션을 참조하세요.
+ **멀티파트 업로드 시작** – 멀티파트 업로드 API 작업을 사용하여 대용량 객체를 업로드할 때 시작 요청에 헤더를 지정합니다. 자세한 내용은 [멀티파트 업로드 시작](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html)을 참조하세요.
+ **COPY 작업** - 객체를 복사할 때 소스 객체 및 대상 객체가 둘 다 있습니다. 자세한 내용은 [PUT Object - Copy](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html)를 참조하세요.

**참고**  
`POST` 작업을 사용하여 객체를 업로드할 경우에는 요청 헤더를 제공하는 대신 양식 필드에 동일한 정보를 제공합니다. 자세한 내용은 [POST Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html) 섹션을 참조하세요.

AWS SDK 또한 서버 측 암호화를 요청하는 데 사용할 수 있는 래퍼 API를 제공하며, AWS Management Console을 사용하여 객체를 업로드하고 서버 측 암호화를 요청할 수도 있습니다.

더 일반적인 내용은 **AWS Key Management Service 개발자 안내서의 [AWS KMS 개념](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html)을 참조하십시오.

**Topics**
+ [서버 측 암호화를 위한 API 지원](#APISupportforServer-SideEncryption)
+ [Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3) 지정](specifying-s3-encryption.md)

# Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3) 지정
<a name="specifying-s3-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/)를 참조하세요.

S3 콘솔, REST API, AWS SDK 및 AWS Command Line Interface(AWS CLI)를 사용하여 SSE-S3를 지정할 수 있습니다. 자세한 내용은 [Amazon S3 버킷에 대한 기본 서버 측 암호화 동작 설정](bucket-encryption.md) 섹션을 참조하세요.

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

이 주제에서는 AWS Management Console을 사용하여 객체 암호화의 유형을 설정하거나 변경하는 방법을 설명합니다. 콘솔을 사용하여 객체를 복사할 경우 Amazon S3는 원본 그대로 객체를 복사합니다. 즉, 소스 객체가 암호화된 상태이면 대상 객체도 암호화됩니다. 콘솔을 사용하여 객체에 대한 암호화를 추가하거나 변경할 수 있습니다.

**참고**  
객체의 용량이 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/)에서 S3 콘솔을 엽니다.

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

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

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

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

1. **암호화 설정**에서 **버킷 기본 암호화 설정 사용** 또는 **기본 암호화에 버킷 설정 재정의**를 선택합니다.

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

   1. **암호화 유형**에서 **Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)**를 선택합니다. SSE-S3는 가장 강력한 블록 암호 중 하나인 256비트 Advanced Encryption Standard(AES-256)을 사용하여 각 객체를 암호화합니다. 자세한 내용은 [Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3) 사용](UsingServerSideEncryption.md) 섹션을 참조하세요.

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

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

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

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

새 객체를 업로드하거나 기존 객체를 복사하여 객체가 생성될 경우 요청에 `x-amz-server-side-encryption` 헤더를 추가하여 Amazon S3에서 Amazon S3 관리형 키(SSE-S3)를 사용하여 데이터를 암호화하도록 할지 지정할 수 있습니다. Amazon S3에서 지원하는 암호화 알고리즘인 `AES256`으로 헤더의 값을 설정합니다. Amazon S3는 `x-amz-server-side-encryption` 응답 헤더를 반환하여 객체가 SSE-S3를 사용하여 저장됨을 확인해 줍니다.

다음 REST 업로드 API 작업은 `x-amz-server-side-encryption` 요청 헤더를 수락합니다.
+ [PUT Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html)
+ [PUT Object - Copy](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html)
+ [POST Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)
+ [멀티파트 업로드 시작](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html)

멀티파트 업로드 API 작업을 사용하여 대형 객체를 업로드할 경우 Initiate Multipart Upload 요청에 `x-amz-server-side-encryption` 헤더를 추가하여 서버 측 암호화를 지정할 수 있습니다. 기존 객체를 복사할 때 소스 객체의 암호화 여부에 관계없이 명시적으로 서버 측 암호화를 요청하지 않는 한 대상 객체는 암호화되지 않습니다.

객체가 SSE-S3를 사용하여 저장될 경우 다음 REST API 작업의 응답 헤더는 `x-amz-server-side-encryption` 헤더를 반환합니다.
+ [PUT Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html)
+ [PUT Object - Copy](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html)
+ [POST Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)
+ [멀티파트 업로드 시작](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html)
+ [파트 업로드](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html)
+ [Upload Part - Copy](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html)
+ [멀티파트 업로드 완료](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html)
+ [Get Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html)
+ [Head Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectHEAD.html)

**참고**  
객체가 SSE-S3를 사용할 경우 `GET` 요청 및 `HEAD` 요청에 대해 암호화 요청 헤더를 전송하지 마십시오. 전송할 경우 HTTP 상태 코드 400(잘못된 요청) 오류가 발생합니다.

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

AWS SDK를 사용할 때 Amazon S3가 Amazon S3 관리형 암호화 키(SSE-S3)를 통한 서버 측 암호화를 사용하도록 요청할 수 있습니다. 이 섹션에서는 여러 언어로 AWS SDK를 사용한 예제를 제공합니다. 다른 SDK에 대한 자세한 내용은 [샘플 코드 및 라이브러리](https://aws.amazon.com/code) 섹션을 참조하세요.

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

AWS SDK for Java를 사용하여 객체를 업로드할 때 SSE-S3를 사용하여 객체를 암호화할 수 있습니다. 서버 측 암호화를 요청하려면 `ObjectMetadata`의 `PutObjectRequest` 속성을 사용하여 `x-amz-server-side-encryption` 요청 헤더를 설정합니다. `putObject()`의 `AmazonS3Client` 메서드를 호출할 때 Amazon S3에서는 데이터를 암호화해 저장합니다.

멀티파트 업로드 API 작업을 사용하여 객체를 업로드할 때도 SSE-S3 암호화를 요청할 수 있습니다.
+ 상위 수준 멀티파트 업로드 API 작업을 사용하는 경우 `TransferManager` 메서드를 사용하여 객체를 업로드할 때 객체에 서버 측 암호화를 적용합니다. `ObjectMetadata`를 파라미터로 사용하는 모든 업로드 메서드를 사용할 수 있습니다. 자세한 내용은 [멀티파트 업로드를 사용한 객체 업로드](mpu-upload-object.md) 섹션을 참조하세요.
+ 하위 수준 멀티파트 업로드 API 작업을 사용하는 경우 멀티파트 업로드를 시작할 때 서버 측 암호화를 지정합니다. `ObjectMetadata` 메서드를 호출하여 `InitiateMultipartUploadRequest.setObjectMetadata()` 속성을 추가합니다. 자세한 내용은 [AWS SDK 사용(하위 수준 API)](mpu-upload-object.md#mpu-upload-low-level) 섹션을 참조하세요.

객체의 암호화 상태는 직접 변경할 수 없습니다(암호화되지 않은 객체 암호화 또는 암호화된 객체 암호 해독). 객체의 암호화 상태를 변경하려면 객체를 복사한 다음 사본에 대해 원하는 암호화 상태를 지정한 후 원본 객체를 삭제합니다. Amazon S3에서는 서버 측 암호화를 명시적으로 요청한 경우에만 객체의 사본을 암호화합니다. Java API를 통해 객체 사본 암호화를 요청하려면 `ObjectMetadata` 속성을 사용하여 `CopyObjectRequest`에서 서버 측 암호화를 지정합니다.

**Example 예제**  
다음 예시에서는 AWS SDK for Java를 사용하여 서버 측 암호화를 설정하는 방법을 보여줍니다. 이 예제에서는 다음 작업을 수행하는 방법을 설명합니다.  
+ SSE-S3를 사용하여 새 객체를 업로드합니다.
+ 객체의 사본을 만들어 객체의 암호화 상태를 변경합니다(이 예제에서는 이전에 암호화되지 않은 객체를 암호화함).
+ 객체의 암호화 상태를 확인합니다.
서버 측 암호화에 대한 자세한 정보는 [REST API 사용](#SSEUsingRESTAPI) 섹션을 참조하십시오. 실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 AWS SDK for Java 개발자 안내서의 [시작하기](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html) 섹션을 참조하세요.  

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.internal.SSEResultBase;
import com.amazonaws.services.s3.model.*;

import java.io.ByteArrayInputStream;

public class SpecifyServerSideEncryption {

    public static void main(String[] args) {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";
        String keyNameToEncrypt = "*** Key name for an object to upload and encrypt ***";
        String keyNameToCopyAndEncrypt = "*** Key name for an unencrypted object to be encrypted by copying ***";
        String copiedObjectKeyName = "*** Key name for the encrypted copy of the unencrypted object ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .withCredentials(new ProfileCredentialsProvider())
                    .build();

            // Upload an object and encrypt it with SSE.
            uploadObjectWithSSEEncryption(s3Client, bucketName, keyNameToEncrypt);

            // Upload a new unencrypted object, then change its encryption state
            // to encrypted by making a copy.
            changeSSEEncryptionStatusByCopying(s3Client,
                    bucketName,
                    keyNameToCopyAndEncrypt,
                    copiedObjectKeyName);
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }

    private static void uploadObjectWithSSEEncryption(AmazonS3 s3Client, String bucketName, String keyName) {
        String objectContent = "Test object encrypted with SSE";
        byte[] objectBytes = objectContent.getBytes();

        // Specify server-side encryption.
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentLength(objectBytes.length);
        objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
        PutObjectRequest putRequest = new PutObjectRequest(bucketName,
                keyName,
                new ByteArrayInputStream(objectBytes),
                objectMetadata);

        // Upload the object and check its encryption status.
        PutObjectResult putResult = s3Client.putObject(putRequest);
        System.out.println("Object \"" + keyName + "\" uploaded with SSE.");
        printEncryptionStatus(putResult);
    }

    private static void changeSSEEncryptionStatusByCopying(AmazonS3 s3Client,
            String bucketName,
            String sourceKey,
            String destKey) {
        // Upload a new, unencrypted object.
        PutObjectResult putResult = s3Client.putObject(bucketName, sourceKey, "Object example to encrypt by copying");
        System.out.println("Unencrypted object \"" + sourceKey + "\" uploaded.");
        printEncryptionStatus(putResult);

        // Make a copy of the object and use server-side encryption when storing the
        // copy.
        CopyObjectRequest request = new CopyObjectRequest(bucketName,
                sourceKey,
                bucketName,
                destKey);
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
        request.setNewObjectMetadata(objectMetadata);

        // Perform the copy operation and display the copy's encryption status.
        CopyObjectResult response = s3Client.copyObject(request);
        System.out.println("Object \"" + destKey + "\" uploaded with SSE.");
        printEncryptionStatus(response);

        // Delete the original, unencrypted object, leaving only the encrypted copy in
        // Amazon S3.
        s3Client.deleteObject(bucketName, sourceKey);
        System.out.println("Unencrypted object \"" + sourceKey + "\" deleted.");
    }

    private static void printEncryptionStatus(SSEResultBase response) {
        String encryptionStatus = response.getSSEAlgorithm();
        if (encryptionStatus == null) {
            encryptionStatus = "Not encrypted with SSE";
        }
        System.out.println("Object encryption status is: " + encryptionStatus);
    }
}
```

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

객체를 업로드할 때 Amazon S3에 객체를 암호화하도록 지시할 수 있습니다. 기존 객체의 암호화 상태를 변경하기 위해서는 객체를 복사한 다음 원본 객체를 삭제합니다. 기본적으로 복사 작업은 대상 객체의 서버 측 암호화를 명시적으로 요청하는 경우에만 대상을 암호화합니다. `CopyObjectRequest`에서 SSE-S3를 지정하려면 다음을 추가합니다.

```
 ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256
```

객체를 복사하는 방법에 대한 실제 예제는 [AWS SDK 사용](copy-object.md#CopyingObjectsUsingSDKs)를 참조하세요.

다음은 객체를 업로드하는 예제입니다. 요청 시 이 예제는 Amazon S3에 객체를 암호화하도록 지시합니다. 그런 다음 객체 메타데이터를 검색해 사용된 암호화 방법을 확인합니다. 코드 예제 설정 및 실행에 대한 자세한 내용은 *AWS SDK for .NET 개발자 안내서*의 [AWS SDK for .NET 시작하기](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)를 참조하세요.

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class SpecifyServerSideEncryptionTest
    {
        private const string bucketName = "*** bucket name ***";
        private const string keyName = "*** key name for object created ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 client;

        public static void Main()
        {
            client = new AmazonS3Client(bucketRegion);
            WritingAnObjectAsync().Wait();
        }

        static async Task WritingAnObjectAsync()
        {
            try
            {
                var putRequest = new PutObjectRequest
                {
                    BucketName = bucketName,
                    Key = keyName,
                    ContentBody = "sample text",
                    ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256
                };

                var putResponse = await client.PutObjectAsync(putRequest);

                // Determine the encryption state of an object.
                GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest
                {
                    BucketName = bucketName,
                    Key = keyName
                };
                GetObjectMetadataResponse response = await client.GetObjectMetadataAsync(metadataRequest);
                ServerSideEncryptionMethod objectEncryption = response.ServerSideEncryptionMethod;

                Console.WriteLine("Encryption method used: {0}", objectEncryption.ToString());
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

------
#### [ PHP ]

이 주제에서는 Amazon S3에 업로드하는 객체에 SSE-S3를 추가하기 위해 AWS SDK for PHP 버전 3의 클래스를 사용하는 방법을 보여줍니다. AWS SDK for Ruby API에 대한 자세한 내용은 [AWS SDK for Ruby – 버전 2](https://docs.aws.amazon.com/sdkforruby/api/index.html)를 참조하세요.

Amazon S3에 객체를 업로드하려면 [Aws\$1S3\$1S3Client::putObject()](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject) 메서드를 사용합니다. 업로드 요청에 `x-amz-server-side-encryption` 요청 헤더를 추가하려면 다음 코드 예제에 나와 있듯이 `ServerSideEncryption` 파라미터를 `AES256` 값으로 지정합니다. 서버 측 암호화 요청에 대한 자세한 정보는 [REST API 사용](#SSEUsingRESTAPI) 섹션을 참조하세요.

```
 require 'vendor/autoload.php';

use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';

// $filepath should be an absolute path to a file on disk.
$filepath = '*** Your File Path ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

// Upload a file with server-side encryption.
$result = $s3->putObject([
    'Bucket'               => $bucket,
    'Key'                  => $keyname,
    'SourceFile'           => $filepath,
    'ServerSideEncryption' => 'AES256',
]);
```

이에 응답하여 Amazon S3가 객체 데이터 암호화에 사용된 암호화 알고리즘의 값과 함께 `x-amz-server-side-encryption` 헤더를 반환합니다.

멀티파트 업로드 API 작업을 사용하여 대용량 객체를 업로드할 때 업로드할 객체에 대해 다음과 같이 SSE-S3를 지정할 수 있습니다.
+ 하위 수준 멀티파트 업로드 API 작업을 사용하는 경우 [ Aws\$1S3\$1S3Client::createMultipartUpload()](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#createmultipartupload) 메서드를 호출할 때 서버 측 암호화를 지정합니다. 요청에 `x-amz-server-side-encryption` 요청 헤더를 추가하려면 `array` 파라미터의 `ServerSideEncryption` 키를 값 `AES256`과 함께 지정합니다. 하위 수준 멀티파트 업로드 API 작업에 대한 자세한 내용은 [AWS SDK 사용(하위 수준 API)](mpu-upload-object.md#mpu-upload-low-level) 섹션을 참조하십시오.
+ 상위 수준 멀티파트 업로드 API 작업을 사용하는 경우 [CreateMultipartUpload](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#createmultipartupload) API 작업의 `ServerSideEncryption` 파라미터를 사용하여 서버 측 암호화를 지정합니다. 상위 수준 멀티파트 업로드 API 작업과 함께 `setOption()` 메서드를 사용하는 예제는 [멀티파트 업로드를 사용한 객체 업로드](mpu-upload-object.md) 섹션을 참조하십시오.

기존 객체의 암호화 상태를 확인하려면 다음 PHP 코드 예제에 나와 있듯이 [Aws\$1S3\$1S3Client::headObject()](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#headobject) 메서드를 호출하여 객체 메타데이터를 검색하세요.

```
 require 'vendor/autoload.php';

use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

// Check which server-side encryption algorithm is used.
$result = $s3->headObject([
    'Bucket' => $bucket,
    'Key'    => $keyname,
]);
echo $result['ServerSideEncryption'];
```

기존 객체의 암호화 상태를 변경하려면 [Aws\$1S3\$1S3Client::copyObject()](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#copyobject) 메서드를 사용하여 객체를 복사하고 소스 객체를 삭제하십시오. `ServerSideEncryption` 파라미터를 `AES256` 값으로 사용하여 대상 객체의 서버 측 암호화를 명시적으로 요청하지 않는 한 기본적으로 `copyObject()`는 대상을 암호화하지 않습니다. 다음 PHP 코드 예제에서는 객체를 복사하고 복사된 객체에 서버 측 암호화를 추가합니다.

```
 require 'vendor/autoload.php';

use Aws\S3\S3Client;

$sourceBucket = '*** Your Source Bucket Name ***';
$sourceKeyname = '*** Your Source Object Key ***';

$targetBucket = '*** Your Target Bucket Name ***';
$targetKeyname = '*** Your Target Object Key ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

// Copy an object and add server-side encryption.
$s3->copyObject([
    'Bucket'               => $targetBucket,
    'Key'                  => $targetKeyname,
    'CopySource'           => "$sourceBucket/$sourceKeyname",
    'ServerSideEncryption' => 'AES256',
]);
```

자세한 내용은 다음 항목을 참조하세요.
+ [AWS SDK for PHPAmazon S3 Aws\$1S3\$1S3Client Class용](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html) 
+ [AWS SDK for PHP 설명서](https://aws.amazon.com/documentation/sdk-for-php/)

------
#### [ Ruby ]

AWS SDK for Ruby를 사용하여 객체를 업로드하는 경우, 객체가 SSE-S3를 통해 암호화된 상태로 저장되도록 지정할 수 있습니다. 다시 객체를 읽으면 객체가 자동으로 복호화됩니다.

다음 AWS SDK for Ruby 버전 3 예시는 파일을 Amazon S3에 업로드한 후 암호화하여 저장하는 방법을 보여줍니다.

```
require 'aws-sdk-s3'

# Wraps Amazon S3 object actions.
class ObjectPutSseWrapper
  attr_reader :object

  # @param object [Aws::S3::Object] An existing Amazon S3 object.
  def initialize(object)
    @object = object
  end

  def put_object_encrypted(object_content, encryption)
    @object.put(body: object_content, server_side_encryption: encryption)
    true
  rescue Aws::Errors::ServiceError => e
    puts "Couldn't put your content to #{object.key}. Here's why: #{e.message}"
    false
  end
end

# Example usage:
def run_demo
  bucket_name = "amzn-s3-demo-bucket"
  object_key = "my-encrypted-content"
  object_content = "This is my super-secret content."
  encryption = "AES256"

  wrapper = ObjectPutSseWrapper.new(Aws::S3::Object.new(bucket_name, object_content))
  return unless wrapper.put_object_encrypted(object_content, encryption)

  puts "Put your content into #{bucket_name}:#{object_key} and encrypted it with #{encryption}."
end

run_demo if $PROGRAM_NAME == __FILE__
```

다음 코드 예제는 기존 객체의 암호화 상태를 확인하는 방법을 보여줍니다.

```
require 'aws-sdk-s3'

# Wraps Amazon S3 object actions.
class ObjectGetEncryptionWrapper
  attr_reader :object

  # @param object [Aws::S3::Object] An existing Amazon S3 object.
  def initialize(object)
    @object = object
  end

  # Gets the object into memory.
  #
  # @return [Aws::S3::Types::GetObjectOutput, nil] The retrieved object data if successful; otherwise nil.
  def object
    @object.get
  rescue Aws::Errors::ServiceError => e
    puts "Couldn't get object #{@object.key}. Here's why: #{e.message}"
  end
end

# Example usage:
def run_demo
  bucket_name = "amzn-s3-demo-bucket"
  object_key = "my-object.txt"

  wrapper = ObjectGetEncryptionWrapper.new(Aws::S3::Object.new(bucket_name, object_key))
  obj_data = wrapper.get_object
  return unless obj_data

  encryption = obj_data.server_side_encryption.nil? ? 'no' : obj_data.server_side_encryption
  puts "Object #{object_key} uses #{encryption} encryption."
end

run_demo if $PROGRAM_NAME == __FILE__
```

Amazon S3에 저장된 객체에 서버 측 암호화가 사용되지 않은 경우 메서드는 `null`을 반환합니다.

기존 객체의 암호화 상태를 변경하려면 객체를 복사한 다음 원본 객체를 삭제합니다. 기본적으로 명시적으로 서버 측 암호화를 요청하지 않는 한, 복사 메서드는 대상을 암호화하지 않습니다. 다음 Ruby 코드 예시와 같이 옵션 해시 인수에 `server_side_encryption` 값을 지정하여 대상 객체 암호화를 요청할 수 있습니다. 이 코드 예시는 객체를 복사하고 복사본을 SSE-S3로 암호화하는 방법을 보여줍니다.

```
require 'aws-sdk-s3'

# Wraps Amazon S3 object actions.
class ObjectCopyEncryptWrapper
  attr_reader :source_object

  # @param source_object [Aws::S3::Object] An existing Amazon S3 object. This is used as the source object for
  #                                        copy actions.
  def initialize(source_object)
    @source_object = source_object
  end

  # Copy the source object to the specified target bucket, rename it with the target key, and encrypt it.
  #
  # @param target_bucket [Aws::S3::Bucket] An existing Amazon S3 bucket where the object is copied.
  # @param target_object_key [String] The key to give the copy of the object.
  # @return [Aws::S3::Object, nil] The copied object when successful; otherwise, nil.
  def copy_object(target_bucket, target_object_key, encryption)
    @source_object.copy_to(bucket: target_bucket.name, key: target_object_key, server_side_encryption: encryption)
    target_bucket.object(target_object_key)
  rescue Aws::Errors::ServiceError => e
    puts "Couldn't copy #{@source_object.key} to #{target_object_key}. Here's why: #{e.message}"
  end
end

# Example usage:
def run_demo
  source_bucket_name = "amzn-s3-demo-bucket1"
  source_key = "my-source-file.txt"
  target_bucket_name = "amzn-s3-demo-bucket2"
  target_key = "my-target-file.txt"
  target_encryption = "AES256"

  source_bucket = Aws::S3::Bucket.new(source_bucket_name)
  wrapper = ObjectCopyEncryptWrapper.new(source_bucket.object(source_key))
  target_bucket = Aws::S3::Bucket.new(target_bucket_name)
  target_object = wrapper.copy_object(target_bucket, target_key, target_encryption)
  return unless target_object

  puts "Copied #{source_key} from #{source_bucket_name} to #{target_object.bucket_name}:#{target_object.key} and "\
       "encrypted the target with #{target_object.server_side_encryption} encryption."
end

run_demo if $PROGRAM_NAME == __FILE__
```

------

## AWS CLI 사용
<a name="sse-s3-aws-cli"></a>

AWS CLI를 사용하여 객체를 업로드할 때 SSE-S3를 지정하려면 다음 예시를 사용합니다.

```
aws s3api put-object --bucket amzn-s3-demo-bucket1 --key object-key-name --server-side-encryption AES256  --body file path
```

자세한 내용은 *AWS CLI 참조*에서 [put-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html)를 참조하십시오. AWS CLI를 사용하여 객체를 복사할 때 SSE-S3를 지정하려면 [copy-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html)를 참조하십시오.

## 사용CloudFormation
<a name="ss3-s3-cfn"></a>

CloudFormation을 사용하여 암호화를 설정하는 방법의 예제는 **AWS CloudFormation 사용 설명서의 `AWS::S3::Bucket ServerSideEncryptionRule`에 있는 [기본 암호화로 버킷 생성](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html#aws-properties-s3-bucket-serversideencryptionrule--examples--Create_a_bucket_with_default_encryption) 및 [S3 버킷 키로 AWS KMS 서버 측 암호화를 사용하여 버킷 생성](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html#aws-properties-s3-bucket-serversideencryptionrule--examples--Create_a_bucket_using_AWS_KMS_server-side_encryption_with_an_S3_Bucket_Key)을 참조하십시오.

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

# AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 사용
<a name="UsingDSSEncryption"></a>

AWS Key Management Service(AWS KMS) 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)를 사용하면 Amazon S3에 객체를 업로드할 때 객체에 두 계층의 암호화가 적용됩니다. DSSE-KMS를 사용하면 데이터에 다중 계층 암호화를 적용하고 암호화 키를 완전하게 제어할 것을 요구하는 규정 준수 표준을 보다 쉽게 충족할 수 있습니다.

DSSE-KMS의 '이중'은 다음과 같이 데이터에 적용되는 AES-256 암호화의 독립 계층 2개를 나타냅니다.
+ *첫 번째 계층:* AWS KMS에서 생성된 고유 데이터 암호화 키(DEK)를 사용하여 데이터가 암호화됨
+ *두 번째 계층:* 이미 암호화된 데이터는 Amazon S3에서 관리하는 별도의 AES-256 암호화 키를 사용하여 다시 암호화됨

이는 단일 암호화 계층만 적용하는 표준 SSE-KMS와 다릅니다. 이중 계층 접근 방식은 한 암호화 계층이 손상되더라도 데이터가 두 번째 계층으로 보호되도록 하여 보안을 강화합니다. 이 추가 보안으로 인해 처리 오버헤드 및 AWS KMS API 직접 호출이 증가하며, 표준 SSE-KMS보다 비용이 높아지게 됩니다. 자세한 내용은 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) 섹션을 참조하세요.

Amazon S3 버킷에 DSSE-KMS를 사용할 때 AWS KMS 키는 버킷과 동일한 리전에 있어야 합니다. 또한, 객체에 DSSE-KMS를 요청하면 객체 메타데이터의 일부인 S3 체크섬이 암호화된 형식으로 저장됩니다. 체크섬에 대한 자세한 내용은 [Amazon S3에서 객체 무결성 확인](checking-object-integrity.md) 섹션을 참조하십시오.

**참고**  
S3 버킷 키는 DSSE-KMS에서 지원되지 않습니다.

DSSE-KMS와 표준 SSE-KMS의 주요 차이점은 다음과 같습니다.
+ **암호화 계층:** DSSE-KMS는 AES-256 암호화의 독립 계층 2개를 적용하는 반면, 표준 SSE-KMS는 계층 1개를 적용
+ **보안:** DSSE-KMS는 잠재적 암호화 취약성에 대한 향상된 보호를 제공
+ **규정 준수:** DSSE-KMS는 다중 계층 암호화를 요구하는 규제 요구 사항을 충족하는 데 도움이 됨
+ **성능:** 추가 암호화 처리로 인해 DSSE-KMS의 지연 시간이 약간 더 김
+ **비용:** DSSE-KMS는 컴퓨팅 오버헤드 증가 및 추가 AWS KMS 작업으로 인해 더 많은 요금이 발생

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

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

****  

```
{
             "Version":"2012-10-17",		 	 	 
             "Id": "PutObjectPolicy",
             "Statement": [{
                   "Sid": "DenyUnEncryptedObjectUploads",
                   "Effect": "Deny",
                   "Principal": {
                       "AWS": "arn:aws:iam::111122223333:root"
                   },
                   "Action": "s3:PutObject",
                   "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
                   "Condition": {
                      "StringNotEquals": {
                         "s3:x-amz-server-side-encryption": "aws:kms:dsse"
                      }
                   }
                }
             ]
          }
```

------

**Topics**
+ [AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 지정](specifying-dsse-encryption.md)

# AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 지정
<a name="specifying-dsse-encryption"></a>

새 객체를 업로드하거나 기존 객체를 복사할 때 암호화를 적용할 수 있습니다.

Amazon S3 콘솔, Amazon S3 REST API, AWS Command Line Interface(AWS CLI)를 사용하여 DSSE-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-dsse"></a>

이 섹션에서는 Amazon S3 콘솔을 사용하여 AWS Key Management Service(AWS KMS) 키를 통한 이중 계층 서버 측 암호화(DSSE-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. **암호화 설정**에서 **버킷 기본 암호화 설정 사용** 또는 **기본 암호화에 버킷 설정 재정의**를 선택합니다.

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

   1. **암호화 유형**에서 **AWS Key Management Service  키를 사용한 이중 계층 서버 측 암호화(DSSE-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. **버킷 키**에서 **비활성화**를 선택합니다. S3 버킷 키는 DSSE-KMS에서 지원되지 않습니다.

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

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

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

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

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

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

**Topics**
+ [DSSE-KMS를 지원하는 Amazon S3 REST API 작업](#dsse-request-headers-kms)
+ [암호화 컨텍스트(`x-amz-server-side-encryption-context`)](#s3-dsse-encryption-context)
+ [AWS KMS 키 ID(`x-amz-server-side-encryption-aws-kms-key-id`)](#s3-dsse-key-id-api)

### DSSE-KMS를 지원하는 Amazon S3 REST API 작업
<a name="dsse-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` 작업을 사용하여 DSSE-KMS 헤더를 전달할 경우 헤더가 대상 객체에만 적용됩니다. 기존 객체를 복사할 때 소스 객체의 암호화 여부에 관계없이 명시적으로 서버 측 암호화를 요청하지 않는 한 대상 객체는 암호화되지 않습니다.
+ [POST 객체](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) - 멀티파트 업로드를 사용하여 대형 객체를 업로드할 때 `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)
+ [POST 객체](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` 요청이 실패합니다.
객체가 DSSE-KMS를 사용하는 경우 `GET` 요청 및 `HEAD` 요청에 대해 암호화 요청 헤더를 전송하지 마십시오. 전송하면 HTTP 400 (Bad Request) 오류가 발생합니다.

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

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

Amazon S3는 자동으로 객체의 Amazon 리소스 이름(ARN)을 암호화 컨텍스트 쌍으로 사용합니다(예: `arn:aws:s3:::object_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-dsse-key-id-api"></a>

`x-amz-server-side-encryption-aws-kms-key-id` 헤더를 사용하여 데이터를 보호하는 데 사용되는 고객 관리형 키의 ID를 지정할 수 있습니다. `x-amz-server-side-encryption:aws:kms:dsse` 헤더를 지정하지만 `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)를 참조하십시오.

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

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

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

객체를 제자리에 복사하여 암호화되지 않은 객체가 DSSE-KMS를 사용하도록 암호화할 수 있습니다.

```
aws s3api copy-object --bucket amzn-s3-demo-bucket --key example-object-key --copy-source amzn-s3-demo-bucket/example-object-key --server-side-encryption aws:kms:dsse --ssekms-key-id example-key-id
```

# 고객 제공 키(SSE-C)로 서버 측 암호화 사용
<a name="ServerSideEncryptionCustomerKeys"></a>

서버 측 암호화는 저장된 데이터를 보호하기 위한 것입니다. 서버 측 암호화는 객체 메타데이터가 아닌 객체 데이터만 암호화합니다. 범용 버킷에서 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 사용하여 자체 암호화 키로 데이터를 암호화할 수 있습니다. 요청의 일부로 제공한 암호화 키를 사용하여 Amazon S3는 디스크에 쓸 때 데이터 암호화를 관리하고 객체에 액세스할 때 데이터 암호 해독을 관리합니다. 따라서 데이터 암호화 및 암호 해독을 수행하기 위해 어떠한 코드도 사용할 필요가 없으며, 사용자는 자신이 제공한 암호화 키를 관리하기만 하면 됩니다.

Amazon S3의 최신 사용 사례에서는 더 이상 SSE-C를 사용하지 않습니다. SSE-C는 Amazon S3 관리형 키(SSE-S3) 또는 AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS)에 비해 유연성이 부족하기 때문입니다. SSE-C는 SSE-C 암호화 데이터와 상호 작용할 때마다 암호화 키를 제공해야 하므로 SSE-C 키를 S3 버킷에서 데이터를 읽는 다른 사용자, 역할 또는 AWS 서비스와 공유하여 데이터를 운영할 수 없습니다. AWS에서 SSE-KMS에 대한 광범위한 지원으로 인해 대부분의 최신 워크로드는 SSE-KMS의 유연성이 부족하기 때문에 SSE-C 암호화를 사용하지 않습니다. SSE-KMS에 대한 자세한 내용은 [AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용](UsingKMSEncryption.md) 섹션을 참조하세요.

버킷에 기록되는 객체에 SSE-C 암호화가 사용되지 않도록 하려면 버킷의 기본 암호화 구성을 변경할 때 SSE-C 암호화를 차단합니다. 범용 버킷에 대해 SSE-C가 차단되면 SSE-C 암호화를 지정하는 모든 `PutObject`, `CopyObject`, `PostObject`, 멀티파트 업로드 또는 복제 요청이 `HTTP 403 AccessDenied` 오류와 함께 거부됩니다. SSE-C 차단에 대한 자세한 내용은 [범용 버킷에 대한 SSE-C 차단 또는 차단 해제](blocking-unblocking-s3-c-encryption-gpb.md) 섹션을 참조하세요.

SSE-C 사용에 따르는 추가 비용은 없습니다. 그러나 SSE-C 구성 및 사용 요청에는 표준 Amazon S3 요청 요금이 발생합니다. 요금에 대한 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/)을 참조하십시오.

**중요**  
2026년 4월부터 AWS는 모든 새 버킷에 대해 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 비활성화합니다. 또한 SSE-C 암호화 데이터가 없는 AWS 계정의 모든 기존 버킷에 대해 SSE-C 암호화가 비활성화됩니다. 이러한 변경으로 인해 SSE-C 암호화가 필요한 몇 가지 애플리케이션은 버킷을 생성한 후 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) API를 통해 SSE-C 사용을 의도적으로 활성화해야 합니다. 이러한 경우 자동화 스크립트,CloudFormation 템플릿 또는 기타 인프라 구성 도구를 업데이트하여 해당 설정을 구성해야 할 수 있습니다. 자세한 내용은 [AWS 스토리지 블로그 게시물](https://aws.amazon.com/blogs/storage/advanced-notice-amazon-s3-to-disable-the-use-of-sse-c-encryption-by-default-for-all-new-buckets-and-select-existing-buckets-in-april-2026/)을 참조하세요.

## SSE-C 사용 전 고려 사항
<a name="considerations-before-using-sse-c"></a>
+ SSE-C를 사용할 때 S3는 암호화 키를 저장하지 않습니다. 누구나 S3에서 SSE-C 암호화 데이터를 다운로드하도록 하려면 암호화 키를 제공해야 합니다.
  + 암호화 키가 사용되는 매핑을 관리하여 객체를 암호화합니다. 객체에 대해 제공한 암호화 키는 직접 추적해야 합니다. 즉, 암호화 키를 분실하면 객체도 분실합니다.
  + 암호화 키는 클라이언트 측에서 관리하기 때문에 클라이언트 측에서 키 교체와 같은 추가적인 보안 조치를 관리합니다.
  + 이 설계로 인해 데이터에서 작업할 다른 사용자, 역할 또는 AWS 서비스와 SSE-C 키를 공유하기 어려울 수 있습니다. AWS에서 SSE-KMS에 대한 광범위한 지원으로 인해 대부분의 최신 워크로드는 SSE-KMS의 유연성이 부족하기 때문에 SSE-C를 사용하지 않습니다. SSE-KMS에 대한 자세한 내용은 [AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)을 참조하세요.
  + 즉, SSE-C로 암호화된 객체는 AWS 관리형 서비스에서 기본적으로 해독할 수 없습니다.
+ 요청에 SSE-C 헤더를 지정할 때는 HTTPS를 사용해야 합니다.
  + Amazon S3는 SSE-C를 사용할 때 HTTP를 통해 전송된 모든 요청을 거부합니다. 보안상의 이유로 인해, 보안에 취약할 수 있는 HTTP를 통해 키를 보내면 오류가 발생할 수 있음을 유의하십시오. 키를 취소하고 적절하게 교체합니다.
+ 버전 관리가 활성화된 버킷의 경우 업로드하는 각 객체 버전에는 자체 암호화 키가 있습니다. 어떤 객체 버전에 어떤 암호화 키가 사용되었는지는 직접 추적해야 합니다.
+ SSE-C는 Amazon S3 콘솔에서 지원되지 않습니다. Amazon S3 콘솔을 사용하여 객체를 업로드하거나 SSE-C 암호화를 지정할 수 없습니다. 또한 SSE-C를 사용하여 저장된 기존 객체를 업데이트할 수 도 없습니다(예: 스토리지 클래스 변경 또는 메타데이터 추가).

**Topics**
+ [SSE-C 사용 전 고려 사항](#considerations-before-using-sse-c)
+ [고객 제공 키를 사용한 서버 측 암호화 지정(SSE-C).](specifying-s3-c-encryption.md)
+ [범용 버킷에 대한 SSE-C 차단 또는 차단 해제](blocking-unblocking-s3-c-encryption-gpb.md)
+ [새 버킷의 기본 SSE-C 설정 FAQ](default-s3-c-encryption-setting-faq.md)

# 고객 제공 키를 사용한 서버 측 암호화 지정(SSE-C).
<a name="specifying-s3-c-encryption"></a>

고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 사용하려면 먼저 Amazon S3 범용 버킷의 기본 암호화 구성에서 SSE-C가 차단된 암호화 유형이 아닌지 확인합니다. 차단된 경우 버킷의 기본 암호화 구성을 업데이트하여 이 암호화 유형을 활성화할 수 있습니다. 그런 다음 필수 헤더를 전달하여 업로드 요청에 SSE-C를 사용할 수 있습니다. [SSE-C로 데이터 쓰기를 지원하는 Amazon S3 작업](#amazon-s3-actions-that-support-writing-data-with-sse-c)를 참조하고 [SSE-C 객체 암호화 및 복호화 요청에 필요한 S3 API 헤더](#s3-api-headers-required-for-sse-c-object-encryption-and-decryption-requests)를 포함해야 합니다.

SSE-C를 지정하는 객체를 업로드하면 Amazon S3는 제공된 암호화 키를 사용하여 AES-256 암호화를 데이터에 적용합니다. 그런 다음 Amazon S3는 메모리에서 암호화 키를 제거합니다. 객체를 검색할 경우 요청에 포함된 것과 동일한 암호화 키를 제공해야 합니다. Amazon S3는 제공된 암호화 키가 일치하는지 확인한 후 객체 데이터를 반환하기 전에 객체의 암호화를 해독합니다.

SSE-C를 사용하기 전에 [SSE-C 사용 전 고려 사항](ServerSideEncryptionCustomerKeys.md#considerations-before-using-sse-c)을 검토했는지 확인합니다.

**참고**  
Amazon S3는 제공된 암호화 키를 저장하지 않습니다. 대신에 임의로 암호화 키의 솔트 해시 기반 메시지 인증 코드(HMAC) 값을 저장하여 향후 요청을 검증합니다. 솔트 HMAC 값은 암호화 키의 값을 파생하거나 암호화된 객체의 콘텐츠를 해독하기 위해 사용할 수 없습니다. 즉, 암호화 키가 없어지면 객체도 없어집니다.

**Topics**
+ [SSE-C 작업 및 필수 헤더](#sse-c-actions-and-required-headers)
+ [SSE-C 암호화를 적용하는 버킷 정책 예제](#example-bucket-policy-to-enforce-sse-c-encryption)
+ [미리 서명된 URL 및 SSE-C](#ssec-and-presignedurl)
+ [SSE-C를 사용하여 요청 생성](#making-requests-with-sse-c)
+ [REST API 사용](#using-rest-api-sse-c)
+ [AWS SDK를 사용하여 PUT, GET, Head 및 Copy 작업에 SSE-C 지정](#sse-c-using-sdks)
+ [AWS SDK를 사용하여 멀티파트 업로드를 위한 SSE-C 지정](#sse-c-using-sdks-multipart-uploads)

## SSE-C 작업 및 필수 헤더
<a name="sse-c-actions-and-required-headers"></a>

지원되는 S3 API에서 SSE-C를 지정하려면 특정 요청 파라미터를 전달해야 합니다.

**참고**  
Amazon S3의 `PutBucketEncryption` API는 버킷에 대한 기본 서버 측 암호화를 구성하는 데 사용됩니다. 그러나 `PutBucketEncryption`은 SSE-C를 활성화하는 기능을 버킷의 기본 암호화 방법으로 지원하지 않습니다. SSE-C는 각 객체 업로드 또는 다운로드 요청과 함께 Amazon S3에 암호화 키를 제공하는 객체 수준 암호화 방법입니다. Amazon S3는이 키를 사용하여 요청 중에 객체를 암호화 또는 복호화한 다음 키를 폐기합니다. 즉, SSE-C는 기본 버킷 설정이 아닌 객체별로 활성화됩니다.

### SSE-C로 데이터 쓰기를 지원하는 Amazon S3 작업
<a name="amazon-s3-actions-that-support-writing-data-with-sse-c"></a>

다음 API 작업 또는 작업을 사용하여 범용 버킷에 객체를 쓸 때 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 요청할 수 있습니다.
+ [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/API_CreateMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.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/RESTObjectPOST.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)
+ [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_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)

**참고**  
S3 복제는 SSE-C로 암호화된 객체를 지원합니다. 암호화된 객체 복제에 대한 자세한 내용은 [암호화(SSE-S3, SSE-KMS, DSSE-KMS, SSE-C)된 객체 복제](replication-config-for-kms-objects.md) 섹션을 참조하십시오.

### SSE-C 객체 암호화 및 복호화 요청에 필요한 S3 API 헤더
<a name="s3-api-headers-required-for-sse-c-object-encryption-and-decryption-requests"></a>

SSE-C로 객체를 암호화하거나 복호화하려면 다음 세 가지 API 헤더를 제공해야 합니다.
+ `x-amz-server-side-encryption-customer-algorithm` 이 헤더를 사용하여 암호화 알고리즘을 지정합니다. 헤더 값은 AES256이어야 합니다.
+ `x-amz-server-side-encryption-customer-key` 이 헤더를 사용하여 256비트의 base64 인코딩 암호화 키를 Amazon S3에 제공하여 데이터를 암호화하거나 복호화합니다.
+ `x-amz-server-side-encryption-customer-key-MD5` 이 헤더를 사용하여 RFC 1321에 따라 암호화 키의 128비트 base64 인코딩 MD5 다이제스트를 제공합니다. Amazon S3는 메시지 무결성 검사에 이 헤더를 사용하여 암호화 키가 오류 없이 전송되었음을 확인합니다.

### SSE-C로 암호화된 소스 객체를 복사하기 위한 요청에 필요한 S3 API 헤더
<a name="s3-api-headers-required-for-requests-to-copy-source-objects-encrypted-with-sse-c"></a>

SSE-C로 암호화된 소스 객체를 복사하려면 다음 세 가지 API 헤더를 제공해야 합니다.
+ `x-amz-copy-source-server-side-encryption-customer-algorithm` 이 헤더를 포함하여 Amazon S3가 원본 객체 복호화에 사용해야 하는 알고리즘을 지정합니다. 이 값은 AES256이어야 합니다.
+ `x-amz-copy-source-server-side-encryption-customer-key` 이 헤더를 포함하여 Amazon S3가 원본 객체의 암호화를 복호화하는 데 사용할 base64 인코딩 암호화 키를 제공합니다. 이 암호화 키는 원본 객체를 만들 때 Amazon S3에 제공한 것이어야 하며, 그렇지 않으면 Amazon S3가 객체의 암호를 해독할 수 없습니다.
+ `x-amz-copy-source-server-side-encryption-customer-key-MD5` 이 헤더를 포함하여 RFC 1321에 따라 암호화 키의 128비트 base64 인코딩 MD5 다이제스트를 제공합니다.

## SSE-C 암호화를 적용하는 버킷 정책 예제
<a name="example-bucket-policy-to-enforce-sse-c-encryption"></a>

Amazon S3 버킷에 작성된 모든 객체에 대해 SSE-C를 요구하려면 버킷 정책을 사용하면 됩니다. 예를 들어 다음 버킷 정책은 SSE-C를 요청하는 `x-amz-server-side-encryption-customer-algorithm` 헤더가 포함되지 않은 모든 요청에 대해 객체 업로드(`s3:PutObject`) 권한을 거부합니다.

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

**중요**  
버킷 정책을 사용하여 `s3:PutObject`에서 SSE-C를 요구하는 경우, 모든 멀티파트 업로드 요청(CreateMultipartUpload, UploadPart, CompleteMultipartUpload)에 `x-amz-server-side-encryption-customer-algorithm` 헤더를 포함시켜야 합니다.

## 미리 서명된 URL 및 SSE-C
<a name="ssec-and-presignedurl"></a>

새로운 객체 업로드, 기존 객체 또는 객체 메타데이터 검색과 같은 작업에 사용되는 미리 서명된 URL을 생성할 수 있습니다. 미리 서명된 URL은 다음과 같이 SSE-C를 지원합니다.
+ 미리 서명된 URL을 만들 때 서명 계산에 `x-amz-server-side-encryption-customer-algorithm` 헤더를 사용하여 알고리즘을 지정해야 합니다.
+ 새로운 객체 업로드, 기존 객체 또는 객체 메타데이터 전용 검색에 미리 서명된 URL을 사용하는 경우, 클라이언트 애플리케이션의 요청에서 모든 암호화 헤더를 제공해야 합니다.
**참고**  
비 SSE-C 객체의 경우, 데이터에 액세스하기 위해 미리 서명된 URL을 생성하여 브라우저에 직접 붙여 넣을 수 있습니다.  
하지만 SSE-C 객체에는 이렇게 할 수 없습니다. 미리 서명된 URL 이외에 SSE-C 객체에 고유한 HTTP 헤더도 포함해야 하기 때문입니다. 따라서 프로그래밍 방식으로만 SSE-C 객체에 미리 서명된 URL을 생성할 수 있습니다.

미리 서명된 URL에 대한 자세한 내용은 섹선을 참조하세요[미리 서명된 URL을 통해 객체 다운로드 및 업로드](using-presigned-url.md)

## SSE-C를 사용하여 요청 생성
<a name="making-requests-with-sse-c"></a>

 REST API를 사용하여 객체를 생성할 때 고객 제공 키(SSE-C)를 사용하여 서버 측 암호화를 지정할 수 있습니다. SSE-C를 사용하는 경우 [SSE-C로 암호화된 소스 객체를 복사하기 위한 요청에 필요한 S3 API 헤더](#s3-api-headers-required-for-requests-to-copy-source-objects-encrypted-with-sse-c)를 사용하여 암호화 키 정보를 제공해야 합니다. AWS SDK 래퍼 라이브러리를 사용하여 이러한 헤더를 요청에 추가할 수 있습니다. 필요한 경우 애플리케이션에서 직접 Amazon S3 REST API를 호출할 수 있습니다.

**중요**  
고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 지정하기 전에, 범용 버킷에 대해 SSE-C 암호화가 차단되지 않았는지 확인합니다. 자세한 내용은 [범용 버킷에 대한 SSE-C 차단 또는 차단 해제](blocking-unblocking-s3-c-encryption-gpb.md) 섹션을 참조하세요.

**참고**  
Amazon S3 콘솔을 사용하여 객체를 업로드하고 SSE-C를 요청할 수 없습니다. 또한, SSE-C를 사용하여 저장된 기존 객체를 업데이트할 수도 없습니다(예: 스토리지 클래스 변경 또는 메타데이터 추가). [SSE-C 객체 암호화 및 복호화 요청에 필요한 S3 API 헤더](#s3-api-headers-required-for-sse-c-object-encryption-and-decryption-requests) 섹션을 참조하세요.

## REST API 사용
<a name="using-rest-api-sse-c"></a>

### SSE-C를 지원하는 Amazon S3 REST API
<a name="sse-c-supported-apis"></a>

다음 Amazon S3 API는 고객 제공 암호화 키(SSE-C)로 서버 측 암호화를 지원합니다.
+ **GET 작업** - GET API([GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html) 참조)를 사용하여 객체를 검색할 때 요청 헤더를 지정할 수 있습니다.
+ **HEAD 작업** - HEAD API([HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectHEAD.html) 참조)를 사용하여 객체 메타데이터를 검색하려면 이러한 요청 헤더를 지정하면 됩니다.
+ **PUT 작업** - PUT Object API([PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) 참조)를 사용하여 데이터를 업로드할 때 이러한 요청 헤더를 지정할 수 있습니다.
+ **멀티파트 업로드 ** - 멀티파트 업로드 API를 사용하여 대형 객체를 업로드할 때 이 헤더를 지정할 수 있습니다. 시작 요청에서 이 헤더를 지정하고([멀티파트 업로드 시작에 관한 문서](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html) 참조) 각각의 후속 부분은 요청을 업로드합니다([Upload Part](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html) 또는 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html) 참조). 각 파트 업로드 요청에서 암호화 정보는 시작 멀티파트 업로드 요청의 시작에서 제공한 내용과 동일해야 합니다.
+ **POST 작업** - POST 작업([객체 POST에 관한 문서](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html) 참조)을 사용하여 객체를 업로드할 경우에는 요청 헤더 대신 양식 필드에 동일한 정보를 제공합니다.
+ **복사 작업** - 객체를 복사([CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 참조)하려면 원본 객체 및 대상 객체가 있어야 합니다.
  + 대상 객체의 암호화 유형을 지정하려면 `x-amz-server-side-encryption ` 요청 헤더를 제공해야 합니다.
  + SSE-C를 사용하여 대상 객체를 암호화하려는 경우, S3 API [SSE-C 객체 암호화 및 복호화 요청에 필요한 S3 API 헤더](#s3-api-headers-required-for-sse-c-object-encryption-and-decryption-requests)를 사용하여 암호화 정보를 제공해야 합니다.
  + SSE-C를 사용하여 소스 객체를 암호화했다면 S3 API 헤더 [SSE-C로 암호화된 소스 객체를 복사하기 위한 요청에 필요한 S3 API 헤더](#s3-api-headers-required-for-requests-to-copy-source-objects-encrypted-with-sse-c)를 사용하여 암호화 키 정보를 제공해야 합니다.

## AWS SDK를 사용하여 PUT, GET, Head 및 Copy 작업에 SSE-C 지정
<a name="sse-c-using-sdks"></a>

다음 예제에서는 객체에 대해 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 요청하는 방법을 보여줍니다. 이 예제에서는 다음 작업을 수행합니다. 각 작업에서는 요청에 SSE-C 관련 헤더를 지정하는 방법을 보여 줍니다.
+ **객체 넣기** - 객체를 업로드하고 고객 제공 암호화 키를 사용하여 서버 측 암호화를 요청합니다.
+ **객체 가져오기** - 앞 단계에서 업로드한 객체를 다운로드합니다. 요청 시 객체가 업로드되었을 때 제공한 것과 동일한 암호화 정보를 제공합니다. Amazon S3는 객체의 암호를 해독하여 사용자에게 반환하기 위해 이 정보가 필요합니다.
+ **객체 메타데이터 가져오기** - 객체의 메타데이터를 검색합니다. 객체 생성 시 사용한 것과 동일한 암호화 정보를 제공합니다.
+ **객체 복사** - 이전에 업로드한 객체의 복사본을 만듭니다. 원본 객체가 SSE-C를 사용하여 저장되기 때문에 복사 요청에 암호화 정보를 제공해야 합니다. 기본적으로 Amazon S3는 사용자가 명시적으로 요청하는 경우에만 객체의 사본을 암호화합니다. 이 예제에서는 Amazon S3에 객체의 암호화된 사본을 저장하도록 지시합니다.

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

**참고**  
이 예제에서는 단일 작업으로 객체를 업로드하는 방법을 보여 줍니다. 멀티파트 업로드 API를 사용하여 대용량 객체를 업로드할 때는 다음 예제에서 보여주는 방식과 동일한 방식으로 암호화 정보를 제공합니다. AWS SDK for Java를 사용하는 멀티파트 업로드에 대한 예제는 [멀티파트 업로드를 사용한 객체 업로드](mpu-upload-object.md) 섹션을 참조하십시오.

필요한 암호화 정보를 추가하려면 요청에 `SSECustomerKey`를 포함합니다. `SSECustomerKey` 클래스에 대한 자세한 내용은 REST API 섹션을 참조하십시오.

실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 AWS SDK for Java 개발자 안내서의 [시작하기](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html) 섹션을 참조하세요.

**Example**  

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import javax.crypto.KeyGenerator;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

public class ServerSideEncryptionUsingClientSideEncryptionKey {
    private static SSECustomerKey SSE_KEY;
    private static AmazonS3 S3_CLIENT;
    private static KeyGenerator KEY_GENERATOR;

    public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";
        String keyName = "*** Key name ***";
        String uploadFileName = "*** File path ***";
        String targetKeyName = "*** Target key name ***";

        // Create an encryption key.
        KEY_GENERATOR = KeyGenerator.getInstance("AES");
        KEY_GENERATOR.init(256, new SecureRandom());
        SSE_KEY = new SSECustomerKey(KEY_GENERATOR.generateKey());

        try {
            S3_CLIENT = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Upload an object.
            uploadObject(bucketName, keyName, new File(uploadFileName));

            // Download the object.
            downloadObject(bucketName, keyName);

            // Verify that the object is properly encrypted by attempting to retrieve it
            // using the encryption key.
            retrieveObjectMetadata(bucketName, keyName);

            // Copy the object into a new object that also uses SSE-C.
            copyObject(bucketName, keyName, targetKeyName);
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }

    private static void uploadObject(String bucketName, String keyName, File file) {
        PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName, file).withSSECustomerKey(SSE_KEY);
        S3_CLIENT.putObject(putRequest);
        System.out.println("Object uploaded");
    }

    private static void downloadObject(String bucketName, String keyName) throws IOException {
        GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, keyName).withSSECustomerKey(SSE_KEY);
        S3Object object = S3_CLIENT.getObject(getObjectRequest);

        System.out.println("Object content: ");
        displayTextInputStream(object.getObjectContent());
    }

    private static void retrieveObjectMetadata(String bucketName, String keyName) {
        GetObjectMetadataRequest getMetadataRequest = new GetObjectMetadataRequest(bucketName, keyName)
                .withSSECustomerKey(SSE_KEY);
        ObjectMetadata objectMetadata = S3_CLIENT.getObjectMetadata(getMetadataRequest);
        System.out.println("Metadata retrieved. Object size: " + objectMetadata.getContentLength());
    }

    private static void copyObject(String bucketName, String keyName, String targetKeyName)
            throws NoSuchAlgorithmException {
        // Create a new encryption key for target so that the target is saved using
        // SSE-C.
        SSECustomerKey newSSEKey = new SSECustomerKey(KEY_GENERATOR.generateKey());

        CopyObjectRequest copyRequest = new CopyObjectRequest(bucketName, keyName, bucketName, targetKeyName)
                .withSourceSSECustomerKey(SSE_KEY)
                .withDestinationSSECustomerKey(newSSEKey);

        S3_CLIENT.copyObject(copyRequest);
        System.out.println("Object copied");
    }

    private static void displayTextInputStream(S3ObjectInputStream input) throws IOException {
        // Read one line at a time from the input stream and display each line.
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        System.out.println();
    }
}
```

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

**참고**  
멀티파트 업로드 API를 사용하여 대형 객체를 업로드하는 예제는 [멀티파트 업로드를 사용한 객체 업로드](mpu-upload-object.md) 및 [AWS SDK 사용(하위 수준 API)](mpu-upload-object.md#mpu-upload-low-level) 섹션을 참조하세요.

코드 예제 설정 및 실행에 대한 자세한 내용은 *AWS SDK for .NET 개발자 안내서*의 [AWS SDK for .NET 시작하기](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)를 참조하세요.

**Example**  

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class SSEClientEncryptionKeyObjectOperationsTest
    {
        private const string bucketName = "*** bucket name ***"; 
        private const string keyName = "*** key name for new object created ***"; 
        private const string copyTargetKeyName = "*** key name for object copy ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 client;

        public static void Main()
        {
            client = new AmazonS3Client(bucketRegion);
            ObjectOpsUsingClientEncryptionKeyAsync().Wait();
        }
        private static async Task ObjectOpsUsingClientEncryptionKeyAsync()
        {
            try
            {
                // Create an encryption key.
                Aes aesEncryption = Aes.Create();
                aesEncryption.KeySize = 256;
                aesEncryption.GenerateKey();
                string base64Key = Convert.ToBase64String(aesEncryption.Key);

                // 1. Upload the object.
                PutObjectRequest putObjectRequest = await UploadObjectAsync(base64Key);
                // 2. Download the object and verify that its contents matches what you uploaded.
                await DownloadObjectAsync(base64Key, putObjectRequest);
                // 3. Get object metadata and verify that the object uses AES-256 encryption.
                await GetObjectMetadataAsync(base64Key);
                // 4. Copy both the source and target objects using server-side encryption with 
                //    a customer-provided encryption key.
                await CopyObjectAsync(aesEncryption, base64Key);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }

        private static async Task<PutObjectRequest> UploadObjectAsync(string base64Key)
        {
            PutObjectRequest putObjectRequest = new PutObjectRequest
            {
                BucketName = bucketName,
                Key = keyName,
                ContentBody = "sample text",
                ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
                ServerSideEncryptionCustomerProvidedKey = base64Key
            };
            PutObjectResponse putObjectResponse = await client.PutObjectAsync(putObjectRequest);
            return putObjectRequest;
        }
        private static async Task DownloadObjectAsync(string base64Key, PutObjectRequest putObjectRequest)
        {
            GetObjectRequest getObjectRequest = new GetObjectRequest
            {
                BucketName = bucketName,
                Key = keyName,
                // Provide encryption information for the object stored in Amazon S3.
                ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
                ServerSideEncryptionCustomerProvidedKey = base64Key
            };

            using (GetObjectResponse getResponse = await client.GetObjectAsync(getObjectRequest))
            using (StreamReader reader = new StreamReader(getResponse.ResponseStream))
            {
                string content = reader.ReadToEnd();
                if (String.Compare(putObjectRequest.ContentBody, content) == 0)
                    Console.WriteLine("Object content is same as we uploaded");
                else
                    Console.WriteLine("Error...Object content is not same.");

                if (getResponse.ServerSideEncryptionCustomerMethod == ServerSideEncryptionCustomerMethod.AES256)
                    Console.WriteLine("Object encryption method is AES256, same as we set");
                else
                    Console.WriteLine("Error...Object encryption method is not the same as AES256 we set");

                // Assert.AreEqual(putObjectRequest.ContentBody, content);
                // Assert.AreEqual(ServerSideEncryptionCustomerMethod.AES256, getResponse.ServerSideEncryptionCustomerMethod);
            }
        }
        private static async Task GetObjectMetadataAsync(string base64Key)
        {
            GetObjectMetadataRequest getObjectMetadataRequest = new GetObjectMetadataRequest
            {
                BucketName = bucketName,
                Key = keyName,

                // The object stored in Amazon S3 is encrypted, so provide the necessary encryption information.
                ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
                ServerSideEncryptionCustomerProvidedKey = base64Key
            };

            GetObjectMetadataResponse getObjectMetadataResponse = await client.GetObjectMetadataAsync(getObjectMetadataRequest);
            Console.WriteLine("The object metadata show encryption method used is: {0}", getObjectMetadataResponse.ServerSideEncryptionCustomerMethod);
            // Assert.AreEqual(ServerSideEncryptionCustomerMethod.AES256, getObjectMetadataResponse.ServerSideEncryptionCustomerMethod);
        }
        private static async Task CopyObjectAsync(Aes aesEncryption, string base64Key)
        {
            aesEncryption.GenerateKey();
            string copyBase64Key = Convert.ToBase64String(aesEncryption.Key);

            CopyObjectRequest copyRequest = new CopyObjectRequest
            {
                SourceBucket = bucketName,
                SourceKey = keyName,
                DestinationBucket = bucketName,
                DestinationKey = copyTargetKeyName,
                // Information about the source object's encryption.
                CopySourceServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
                CopySourceServerSideEncryptionCustomerProvidedKey = base64Key,
                // Information about the target object's encryption.
                ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
                ServerSideEncryptionCustomerProvidedKey = copyBase64Key
            };
            await client.CopyObjectAsync(copyRequest);
        }
    }
}
```

------

## AWS SDK를 사용하여 멀티파트 업로드를 위한 SSE-C 지정
<a name="sse-c-using-sdks-multipart-uploads"></a>

앞 섹션의 예제에서는 PUT, GET, Head 및 Copy 작업에서 고객 제공 키(SSE-C)를 사용하는 서버 측 암호화를 요청하는 방법을 알아보았으며, 이 섹션에서는 SSE-C를 지원하는 기타 Amazon S3 API에 대해 소개합니다.

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

멀티파트 업로드 API를 사용하여 대형 객체를 업로드할 수 있습니다. 자세한 내용은 [Amazon S3에서 멀티파트 업로드를 사용한 객체 업로드 및 복사](mpuoverview.md) 섹션을 참조하세요. 상위 수준 또는 하위 수준의 API를 사용하여 대형 객체를 업로드할 수 있습니다. 이들 API는 요청의 암호화 관련 헤더를 지원합니다.
+ 고급 `TransferManager` API를 사용할 때는 `PutObjectRequest`에 암호화 관련 헤더를 제공합니다. 자세한 내용은 [멀티파트 업로드를 사용한 객체 업로드](mpu-upload-object.md) 섹션을 참조하세요.
+ 하위 수준 API를 사용할 경우 `InitiateMultipartUploadRequest`에 암호화 관련 정보를 제공하고 각 `UploadPartRequest`에 동일한 암호화 정보를 제공합니다. `CompleteMultipartUploadRequest`에서는 암호화 관련 헤더를 제공할 필요가 없습니다. 예제는 [AWS SDK 사용(하위 수준 API)](mpu-upload-object.md#mpu-upload-low-level)을 참조하세요.

다음 예제에서는 `TransferManager`를 사용하여 객체를 만들고 SSE-C 관련 정보를 제공하는 방법을 보여 줍니다. 이 예제는 다음을 수행합니다.
+ `TransferManager.upload()` 메서드를 사용하여 객체를 생성합니다. `PutObjectRequest` 인스턴스에서 요청의 암호화 키 정보를 제공합니다. Amazon S3에서는 고객이 제공하는 키를 사용하여 객체를 암호화합니다.
+ `TransferManager.copy()` 메서드를 호출하여 객체의 복사본을 생성합니다. 이 예제에서는 Amazon S3에 새 `SSECustomerKey`를 사용하여 객체 복사본을 암호화하도록 지시합니다. 원본 객체가 SSE-C를 사용하여 암호화되기 때문에 Amazon S3가 복사 전에 객체의 암호를 해독할 수 있도록 `CopyObjectRequest` 실행 시 원본 객체의 암호화 키도 제공됩니다.

**Example**  

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CopyObjectRequest;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.SSECustomerKey;
import com.amazonaws.services.s3.transfer.Copy;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
import com.amazonaws.services.s3.transfer.Upload;

import javax.crypto.KeyGenerator;
import java.io.File;
import java.security.SecureRandom;

public class ServerSideEncryptionCopyObjectUsingHLwithSSEC {

    public static void main(String[] args) throws Exception {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";
        String fileToUpload = "*** File path ***";
        String keyName = "*** New object key name ***";
        String targetKeyName = "*** Key name for object copy ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .withCredentials(new ProfileCredentialsProvider())
                    .build();
            TransferManager tm = TransferManagerBuilder.standard()
                    .withS3Client(s3Client)
                    .build();

            // Create an object from a file.
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, keyName, new File(fileToUpload));

            // Create an encryption key.
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(256, new SecureRandom());
            SSECustomerKey sseCustomerEncryptionKey = new SSECustomerKey(keyGenerator.generateKey());

            // Upload the object. TransferManager uploads asynchronously, so this call
            // returns immediately.
            putObjectRequest.setSSECustomerKey(sseCustomerEncryptionKey);
            Upload upload = tm.upload(putObjectRequest);

            // Optionally, wait for the upload to finish before continuing.
            upload.waitForCompletion();
            System.out.println("Object created.");

            // Copy the object and store the copy using SSE-C with a new key.
            CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucketName, keyName, bucketName, targetKeyName);
            SSECustomerKey sseTargetObjectEncryptionKey = new SSECustomerKey(keyGenerator.generateKey());
            copyObjectRequest.setSourceSSECustomerKey(sseCustomerEncryptionKey);
            copyObjectRequest.setDestinationSSECustomerKey(sseTargetObjectEncryptionKey);

            // Copy the object. TransferManager copies asynchronously, so this call returns
            // immediately.
            Copy copy = tm.copy(copyObjectRequest);

            // Optionally, wait for the upload to finish before continuing.
            copy.waitForCompletion();
            System.out.println("Copy complete.");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

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

멀티파트 업로드 API를 사용하여 대형 객체를 업로드할 수 있습니다([Amazon S3에서 멀티파트 업로드를 사용한 객체 업로드 및 복사](mpuoverview.md) 참조). AWS SDK for .NET에서는 대형 객체를 업로드하는 상위 수준 또는 하위 수준의 API를 제공합니다. 이들 API는 요청의 암호화 관련 헤더를 지원합니다.
+ 상위 수준의 `Transfer-Utility `API를 사용할 때는 아래와 같이 `TransferUtilityUploadRequest`에 암호화 관련 헤더를 제공합니다. 코드 예제는 [멀티파트 업로드를 사용한 객체 업로드](mpu-upload-object.md) 단원을 참조하십시오.

  ```
  TransferUtilityUploadRequest request = new TransferUtilityUploadRequest()
  {
      FilePath = filePath,
      BucketName = existingBucketName,
      Key = keyName,
      // Provide encryption information.
      ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
      ServerSideEncryptionCustomerProvidedKey = base64Key,
  };
  ```
+ 하위 수준의 API를 사용할 경우 멀티파트 업로드 요청을 시작할 때 암호화 관련 정보를 제공하고, 이후 부분 업로드 요청 시에도 동일한 암호화 정보를 제공합니다. 멀티파트 업로드 완료 요청에서는 암호화 관련 헤더를 제공할 필요가 없습니다. 예를 보려면 [AWS SDK 사용(하위 수준 API)](mpu-upload-object.md#mpu-upload-low-level) 섹션을 참조하십시오.

  다음은 기존 대형 객체의 복사본을 만드는 하위 수준의 멀티파트 업로드 예제입니다. 이 예제에서 객체는 SSE-C를 사용하여 Amazon S3에 저장되고, 대상 객체 또한 SSE-C를 사용하여 저장됩니다. 예제에서는 다음을 수행합니다.
  + 암호화 키와 관련 정보를 제공하여 멀티파트 업로드 요청을 시작합니다.
  + `CopyPartRequest`에 원본 및 대상 객체 암호화 키와 관련 정보를 제공합니다.
  + 객체 메타데이터를 검색하여 복사할 원본 객체의 크기를 확인합니다.
  + 5MB 단위로 객체를 업로드합니다.  
**Example**  

  ```
  using Amazon;
  using Amazon.S3;
  using Amazon.S3.Model;
  using System;
  using System.Collections.Generic;
  using System.IO;
  using System.Security.Cryptography;
  using System.Threading.Tasks;
  
  namespace Amazon.DocSamples.S3
  {
      class SSECLowLevelMPUcopyObjectTest
      {
          private const string existingBucketName = "*** bucket name ***";
          private const string sourceKeyName      = "*** source object key name ***"; 
          private const string targetKeyName      = "*** key name for the target object ***";
          private const string filePath           = @"*** file path ***";
          // Specify your bucket region (an example region is shown).
          private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
          private static IAmazonS3 s3Client;
          static void Main()
          {
              s3Client = new AmazonS3Client(bucketRegion);
              CopyObjClientEncryptionKeyAsync().Wait();
          }
  
          private static async Task CopyObjClientEncryptionKeyAsync()
          {
              Aes aesEncryption = Aes.Create();
              aesEncryption.KeySize = 256;
              aesEncryption.GenerateKey();
              string base64Key = Convert.ToBase64String(aesEncryption.Key);
  
              await CreateSampleObjUsingClientEncryptionKeyAsync(base64Key, s3Client);
  
              await CopyObjectAsync(s3Client, base64Key);
          }
          private static async Task CopyObjectAsync(IAmazonS3 s3Client, string base64Key)
          {
              List<CopyPartResponse> uploadResponses = new List<CopyPartResponse>();
  
              // 1. Initialize.
              InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest
              {
                  BucketName = existingBucketName,
                  Key = targetKeyName,
                  ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
                  ServerSideEncryptionCustomerProvidedKey = base64Key,
              };
  
              InitiateMultipartUploadResponse initResponse =
                  await s3Client.InitiateMultipartUploadAsync(initiateRequest);
  
              // 2. Upload Parts.
              long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB
              long firstByte = 0;
              long lastByte = partSize;
  
              try
              {
                  // First find source object size. Because object is stored encrypted with
                  // customer provided key you need to provide encryption information in your request.
                  GetObjectMetadataRequest getObjectMetadataRequest = new GetObjectMetadataRequest()
                  {
                      BucketName = existingBucketName,
                      Key = sourceKeyName,
                      ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
                      ServerSideEncryptionCustomerProvidedKey = base64Key // " * **source object encryption key ***"
                  };
  
                  GetObjectMetadataResponse getObjectMetadataResponse = await s3Client.GetObjectMetadataAsync(getObjectMetadataRequest);
  
                  long filePosition = 0;
                  for (int i = 1; filePosition < getObjectMetadataResponse.ContentLength; i++)
                  {
                      CopyPartRequest copyPartRequest = new CopyPartRequest
                      {
                          UploadId = initResponse.UploadId,
                          // Source.
                          SourceBucket = existingBucketName,
                          SourceKey = sourceKeyName,
                          // Source object is stored using SSE-C. Provide encryption information.
                          CopySourceServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
                          CopySourceServerSideEncryptionCustomerProvidedKey = base64Key, //"***source object encryption key ***",
                          FirstByte = firstByte,
                          // If the last part is smaller then our normal part size then use the remaining size.
                          LastByte = lastByte > getObjectMetadataResponse.ContentLength ?
                              getObjectMetadataResponse.ContentLength - 1 : lastByte,
  
                          // Target.
                          DestinationBucket = existingBucketName,
                          DestinationKey = targetKeyName,
                          PartNumber = i,
                          // Encryption information for the target object.
                          ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
                          ServerSideEncryptionCustomerProvidedKey = base64Key
                      };
                      uploadResponses.Add(await s3Client.CopyPartAsync(copyPartRequest));
                      filePosition += partSize;
                      firstByte += partSize;
                      lastByte += partSize;
                  }
  
                  // Step 3: complete.
                  CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest
                  {
                      BucketName = existingBucketName,
                      Key = targetKeyName,
                      UploadId = initResponse.UploadId,
                  };
                  completeRequest.AddPartETags(uploadResponses);
  
                  CompleteMultipartUploadResponse completeUploadResponse =
                      await s3Client.CompleteMultipartUploadAsync(completeRequest);
              }
              catch (Exception exception)
              {
                  Console.WriteLine("Exception occurred: {0}", exception.Message);
                  AbortMultipartUploadRequest abortMPURequest = new AbortMultipartUploadRequest
                  {
                      BucketName = existingBucketName,
                      Key = targetKeyName,
                      UploadId = initResponse.UploadId
                  };
                  s3Client.AbortMultipartUpload(abortMPURequest);
              }
          }
          private static async Task CreateSampleObjUsingClientEncryptionKeyAsync(string base64Key, IAmazonS3 s3Client)
          {
              // List to store upload part responses.
              List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>();
  
              // 1. Initialize.
              InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest
              {
                  BucketName = existingBucketName,
                  Key = sourceKeyName,
                  ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
                  ServerSideEncryptionCustomerProvidedKey = base64Key
              };
  
              InitiateMultipartUploadResponse initResponse =
                 await s3Client.InitiateMultipartUploadAsync(initiateRequest);
  
              // 2. Upload Parts.
              long contentLength = new FileInfo(filePath).Length;
              long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB
  
              try
              {
                  long filePosition = 0;
                  for (int i = 1; filePosition < contentLength; i++)
                  {
                      UploadPartRequest uploadRequest = new UploadPartRequest
                      {
                          BucketName = existingBucketName,
                          Key = sourceKeyName,
                          UploadId = initResponse.UploadId,
                          PartNumber = i,
                          PartSize = partSize,
                          FilePosition = filePosition,
                          FilePath = filePath,
                          ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
                          ServerSideEncryptionCustomerProvidedKey = base64Key
                      };
  
                      // Upload part and add response to our list.
                      uploadResponses.Add(await s3Client.UploadPartAsync(uploadRequest));
  
                      filePosition += partSize;
                  }
  
                  // Step 3: complete.
                  CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest
                  {
                      BucketName = existingBucketName,
                      Key = sourceKeyName,
                      UploadId = initResponse.UploadId,
                      //PartETags = new List<PartETag>(uploadResponses)
  
                  };
                  completeRequest.AddPartETags(uploadResponses);
  
                  CompleteMultipartUploadResponse completeUploadResponse =
                      await s3Client.CompleteMultipartUploadAsync(completeRequest);
  
              }
              catch (Exception exception)
              {
                  Console.WriteLine("Exception occurred: {0}", exception.Message);
                  AbortMultipartUploadRequest abortMPURequest = new AbortMultipartUploadRequest
                  {
                      BucketName = existingBucketName,
                      Key = sourceKeyName,
                      UploadId = initResponse.UploadId
                  };
                  await s3Client.AbortMultipartUploadAsync(abortMPURequest);
              }
          }
      }
  }
  ```

------

# 범용 버킷에 대한 SSE-C 차단 또는 차단 해제
<a name="blocking-unblocking-s3-c-encryption-gpb"></a>

Amazon S3 관리형 키(SSE-S3) 또는 AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS)의 유연성이 부족하기 때문에 Amazon S3의 최신 사용 사례에서는 더 이상 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 사용하지 않습니다. SSE-C는 SSE-C 암호화 데이터와 상호 작용할 때마다 암호화 키를 제공해야 하므로 SSE-C 키를 S3 버킷에서 데이터를 읽는 다른 사용자, 역할 또는 AWS 서비스와 공유하여 데이터를 운영할 수 없습니다.

범용 버킷에서 사용할 수 있는 서버 측 암호화 유형을 제한하려면 버킷의 기본 암호화 구성을 업데이트하여 SSE-C 쓰기 요청을 차단하도록 선택할 수 있습니다. 이 버킷 수준 구성은 SSE-C를 지정하는 객체 업로드 요청을 차단합니다. 버킷에 대해 SSE-C가 차단되면 SSE-C 암호화를 지정하는 모든 `PutObject`, `CopyObject`, `PostObject` 또는 멀티파트 업로드 또는 복제 요청이 HTTP 403 `AccessDenied` 오류와 함께 거부됩니다.

이 설정은 `PutBucketEncryption` API의 파라미터이며 `s3:PutEncryptionConfiguration` 권한이 있는 경우 S3 콘솔, AWS CLI 및 AWS SDK를 사용하여 업데이트할 수도 있습니다.

유효한 값은 범용 버킷에 대한 SSE-C 암호화를 차단하는 `SSE-C`와 버킷에 대한 쓰기에 SSE-C를 사용하도록 허용하는 `NONE`입니다.

**중요**  
2026년 4월부터 AWS는 모든 새 버킷에 대해 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 비활성화합니다. 또한 SSE-C 암호화 데이터가 없는 AWS 계정의 모든 기존 버킷에 대해 SSE-C 암호화가 비활성화됩니다. 이러한 변경으로 인해 SSE-C 암호화가 필요한 몇 가지 애플리케이션은 버킷을 생성한 후 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) API를 통해 SSE-C 사용을 의도적으로 활성화해야 합니다. 이러한 경우 자동화 스크립트,CloudFormation 템플릿 또는 기타 인프라 구성 도구를 업데이트하여 해당 설정을 구성해야 할 수 있습니다. 자세한 내용은 [AWS 스토리지 블로그 게시물](https://aws.amazon.com/blogs/storage/advanced-notice-amazon-s3-to-disable-the-use-of-sse-c-encryption-by-default-for-all-new-buckets-and-select-existing-buckets-in-april-2026/)을 참조하세요.

## 권한
<a name="bucket-encryption-permissions"></a>

`PutBucketEncryption` API 또는 S3 콘솔, AWS SDK 또는 AWS CLI를 사용하여 범용 버킷의 암호화 유형을 차단하거나 차단 해제합니다. 이 경우 다음 권한이 있어야 합니다.
+ `s3:PutEncryptionConfiguration`

`GetBucketEncryption` API 또는 S3 콘솔, AWS SDK 또는 AWS CLI를 사용하여 범용 버킷에 대해 차단된 암호화 유형을 봅니다. 이 경우 다음 권한이 있어야 합니다.
+ `s3:GetEncryptionConfiguration`

## SSE-C 암호화 차단 전 고려 사항
<a name="considerations-before-blocking-sse-c"></a>

버킷에 대해 SSE-C를 차단하면 다음 암호화 동작이 적용됩니다.
+ 차단된 SSE-C 암호화 전에 버킷에 있었던 객체의 암호화는 변경되지 않습니다.
+ SSE-C 암호화를 차단한 후에는 요청에 필요한 SSE-C 헤더를 제공하는 한 SSE-C로 암호화된 기존 객체에 대해 GetObject 및 HeadObject 요청을 계속 수행할 수 있습니다.
+ 버킷에 대해 SSE-C가 차단되면 SSE-C 암호화를 지정하는 모든 `PutObject`, `CopyObject`, `PostObject` 또는 멀티파트 업로드 요청이 HTTP 403 `AccessDenied` 오류와 함께 거부됩니다.
+ 복제 대상 버킷에 SSE-C가 차단되어 있고 복제되는 소스 객체가 SSE-C로 암호화된 경우 HTTP 403 `AccessDenied` 오류와 함께 복제가 실패합니다.

이 암호화 유형을 차단하기 전에 버킷에서 SSE-C 암호화를 사용하는지 검토하려면 [AWS CloudTrail](https://aws.amazon.com/cloudtrail/)과 같은 도구를 사용하여 데이터에 대한 액세스를 모니터링할 수 있습니다. 이 [블로그 게시물](https://aws.amazon.com/blogs/storage/auditing-amazon-s3-server-side-encryption-methods-for-object-uploads/)은 객체 업로드에 대한 암호화 방법을 실시간으로 감사하는 방법을 보여줍니다. 또한 이 [re:Post 문서를](https://repost.aws/articles/ARhGC12rOiTBCKHcAe9GZXCA/how-to-detect-existing-use-of-sse-c-in-your-amazon-s3-buckets) 참조하여 S3 인벤토리 보고서 쿼리를 통해 SSE-C 암호화 객체가 있는지 확인할 수 있습니다.

### 단계
<a name="block-sse-c-gpb-steps"></a>

Amazon S3 콘솔, AWS Command Line Interface(AWS CLI), Amazon S3 REST API 및 AWS SDK를 사용하여 범용 버킷에 대해 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 차단하거나 차단 해제할 수 있습니다.

### S3 콘솔 사용
<a name="block-sse-c-gpb-console"></a>

Amazon S3 콘솔을 사용하여 버킷에 대한 SSE-C 암호화를 차단하거나 차단 해제하려면 다음을 수행합니다.

1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/s3/ 페이지에서 Amazon S3 콘솔을 엽니다.

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

1. SSE-C 암호화를 차단하려는 버킷을 선택합니다.

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

1. 버킷의 **기본 암호화** 속성 패널로 이동하여 **편집**을 선택합니다.

1. **차단된 암호화 유형** 섹션에서 **고객 제공 키를 사용한 서버 측 암호화(SSE-C)** 옆의 확인란을 선택하여 SSE-C 암호화를 차단하거나 이 확인란을 선택 취소하여 SSE-C를 허용합니다.

1. **변경 사항 저장**을 선택합니다.

### AWS CLI 사용
<a name="block-sse-c-gpb-cli"></a>

AWS CLI를 설치하려면 *AWS Command Line Interface 사용 설명서*에서 [AWS 설치](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.

다음 CLI 예제에서는 AWS CLI를 사용하여 범용 버킷에 대한 SSE-C 암호화를 차단하거나 차단 해제하는 방법을 보여줍니다. 명령을 사용하려면 *사용자 입력 자리 표시자*를 사용자의 정보로 대체합니다.

**범용 버킷에 대한 SSE-C 암호화 차단 요청:**

```
aws s3api put-bucket-encryption \
  --bucket amzn-s3-demo-bucket \
  --server-side-encryption-configuration '{
    "Rules": [{
      "BlockEncryptionTypes": {
        "EncryptionType": "SSE-C"
      }
    }]
  }'
```

**범용 버킷에서 SSE-C 암호화 사용 활성화 요청:**

```
aws s3api put-bucket-encryption \
  --bucket amzn-s3-demo-bucket \
  --server-side-encryption-configuration '{
    "Rules": [{
      "BlockEncryptionTypes": {
        "EncryptionType": "NONE"
      }
    }]
  }'
```

## AWS SDK 사용
<a name="block-sse-c-gpb-sdks"></a>

------
#### [ SDK for Java 2.x ]

다음 CLI 예제에서는 AWS SDK를 사용하여 범용 버킷에 대한 SSE-C 암호화 쓰기를 차단하거나 차단 해제하는 방법을 보여줍니다.

**예 - 기본 암호화 구성을 SSE-S3로 설정하고 SSE-C를 차단하는 PutBucketEncryption 요청**

```
S3Client s3Client = ...;
ServerSideEncryptionByDefault defaultSse = ServerSideEncryptionByDefault
        .builder()
        .sseAlgorithm(ServerSideEncryption.AES256)
        .build();
BlockedEncryptionTypes blockedEncryptionTypes = BlockedEncryptionTypes
        .builder()
        .encryptionType(EncryptionType.SSE_C)
        .build();
ServerSideEncryptionRule rule = ServerSideEncryptionRule.builder()
        .applyServerSideEncryptionByDefault(defaultSse)
        .blockedEncryptionTypes(blockedEncryptionTypes)
        .build();
s3Client.putBucketEncryption(be -> be
        .bucket(bucketName)
        .serverSideEncryptionConfiguration(c -> c.rules(rule)));
```

**예 - 기본 암호화 구성을 SSE-S3로 설정하고 SSE-C를 차단 해제하는 PutBucketEncryption 요청**

```
S3Client s3Client = ...;
ServerSideEncryptionByDefault defaultSse = ServerSideEncryptionByDefault
        .builder()
        .sseAlgorithm(ServerSideEncryption.AES256)
        .build();
BlockedEncryptionTypes blockedEncryptionTypes = BlockedEncryptionTypes
        .builder()
        .encryptionType(EncryptionType.NONE)
        .build();
ServerSideEncryptionRule rule = ServerSideEncryptionRule.builder()
        .applyServerSideEncryptionByDefault(defaultSse)
        .blockedEncryptionTypes(blockedEncryptionTypes)
        .build();
s3Client.putBucketEncryption(be -> be
        .bucket(bucketName)
        .serverSideEncryptionConfiguration(c -> c.rules(rule)));
```

------
#### [ SDK for Python Boto3 ]

**예 - 기본 암호화 구성을 SSE-S3로 설정하고 SSE-C를 차단하는 PutBucketEncryption 요청**

```
s3 = boto3.client("s3")
s3.put_bucket_encryption(
    Bucket="amzn-s3-demo-bucket",
    ServerSideEncryptionConfiguration={
        "Rules":[{
            "ApplyServerSideEncryptionByDefault": {
                "SSEAlgorithm": "AES256"
            },
            "BlockedEncryptionTypes": {
                "EncryptionType": ["SSE-C"]
            }
        }]
    }
)
```

**예 - 기본 암호화 구성을 SSE-S3로 설정하고 SSE-C를 차단 해제하는 PutBucketEncryption 요청**

```
s3 = boto3.client("s3")
s3.put_bucket_encryption(
    Bucket="amzn-s3-demo-bucket",
    ServerSideEncryptionConfiguration={
        "Rules":[{
            "ApplyServerSideEncryptionByDefault": {
                "SSEAlgorithm": "AES256"
            },
            "BlockedEncryptionTypes": {
                "EncryptionType": ["NONE"]
            }
        }]
    }
)
```

------

## REST API 사용
<a name="bucket-tag-add-api"></a>

범용 버킷에 대한 SSE-C 암호화를 차단 또는 차단 해제하기 위한 Amazon S3 REST API 지원에 대한 자세한 내용은 *Amazon Simple Storage Service API 참조*의 다음 섹션을 참조하세요.
+ [PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) 및 [GetBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html) API 작업의 [ServerSideEncryptionRule](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ServerSideEncryptionRule.html) 데이터 형식에 사용되는 [BlockedEncryptionTypes](https://docs.aws.amazon.com/AmazonS3/latest/API/API_BlockedEncryptionTypes.html) 데이터 형식입니다.

# 새 버킷의 기본 SSE-C 설정 FAQ
<a name="default-s3-c-encryption-setting-faq"></a>

**중요**  
2026년 4월부터 AWS는 모든 새 버킷에 대해 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 비활성화합니다. 또한 SSE-C 암호화 데이터가 없는 AWS 계정의 모든 기존 버킷에 대해 SSE-C 암호화가 비활성화됩니다. 이러한 변경으로 인해 SSE-C 암호화가 필요한 몇 가지 애플리케이션은 버킷을 생성한 후 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) API를 통해 SSE-C 사용을 의도적으로 활성화해야 합니다. 이러한 경우 자동화 스크립트,CloudFormation 템플릿 또는 기타 인프라 구성 도구를 업데이트하여 해당 설정을 구성해야 할 수 있습니다. 자세한 내용은 [AWS 스토리지 블로그 게시물](https://aws.amazon.com/blogs/storage/advanced-notice-amazon-s3-to-disable-the-use-of-sse-c-encryption-by-default-for-all-new-buckets-and-select-existing-buckets-in-april-2026/)을 참조하세요.

다음 섹션에서는 이 업데이트에 대한 질문과 답변을 제공합니다.

**1. 2026년 4월에 새 SSE-C 설정이 새로 생성된 모든 버킷에 적용되나요?**

예. 2026년 4월 중에 새로운 기본 설정은 모든 AWS 리전에 점진적으로 적용될 예정입니다.

**2. 이 업데이트가 모든 AWS 리전에 출시되려면 얼마나 걸리나요?**

이 업데이트는 출시되는 데 몇 주가 걸릴 것입니다. 이 업데이트를 배포하기 시작하면 '새로운 소식' 게시물을 게시할 예정입니다.

**3. 업데이트가 완료되었는지 어떻게 알 수 있나요?**

새 버킷을 생성하고 [GetBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html) API 작업을 직접 호출해 SSE-C 암호화가 비활성화되었는지 확인하여 AWS 리전에서 변경이 완료되었는지 쉽게 확인할 수 있습니다. 업데이트가 완료되면 모든 새 범용 버킷에는 기본적으로 SSE-C 암호화가 비활성화됩니다. [PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) API 작업을 직접 호출하여 S3 버킷을 생성한 후 이러한 설정을 조정할 수 있습니다.

**4. Amazon S3에서 기존 버킷 구성을 업데이트하나요?**

AWS 계정에 SSE-C 암호화 객체가 없는 경우 AWS는 모든 기존 버킷에서 SSE-C 암호화를 비활성화합니다. AWS 계정의 버킷에 SSE-C 암호화 객체가 있는 경우 AWS는 해당 계정의 버킷에 대한 버킷 구성을 변경하지 않습니다. AWS 리전에 대한 `CreateBucket` 변경이 완료되면 새 기본 설정이 모든 새 범용 버킷에 적용됩니다.

 **5. 업데이트가 완료되기 전에 버킷에 대한 SSE-C 암호화를 비활성화할 수 있나요?**

예. [PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) API 작업을 직접 호출하고 새 `BlockedEncryptionTypes` 헤더를 지정하여 모든 버킷에 대한 SSE-C 암호화를 비활성화할 수 있습니다.

**6. SSE-C를 사용하여 새 버킷의 데이터를 암호화할 수 있나요?**

예. Amazon S3 관리형 키(SSE-S3) 또는 AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS)의 유연성이 부족하기 때문에 Amazon S3의 최신 사용 사례에서는 더 이상 SSE-C를 사용하지 않습니다. 새 버킷에서 SSE-C 암호화를 사용해야 하는 경우 새 버킷을 생성한 다음 별도의 `PutBucketEncryption` 요청에서 SSE-C 암호화 사용을 활성화할 수 있습니다.

 **예제**

```
aws s3api create-bucket \  
bucket amzn-s3-demo-bucket \ 
region us-east-1 \ 
  
aws s3api put-bucket-encryption \  
-- bucket amzn-s3-demo-bucket \
-- server-side-encryption-configuration \
'{ \Rules\: [{   
   {   
   \ApplyServerSideEncryptionByDefault\: {   
     \SSEAlgorithm\: \AES256\,  
    },   
   \BlockedEncryptionTypes\: [  
     \EncryptionType\:\NONE\]   
   }   
   }]   
}'
```

**참고**  
`PutBucketEncryption` API를 직접 호출할 `s3:PutEncryptionConfiguration` 권한이 있어야 합니다.

**7. SSE-C를 차단하면 버킷에 대한 요청에 어떤 영향을 미치나요?**

버킷에 대해 SSE-C가 차단되면 SSE-C 암호화를 지정하는 모든 `PutObject`, `CopyObject`, `PostObject` 또는 멀티파트 업로드 또는 복제 요청이 HTTP 403 `AccessDenied` 오류와 함께 거부됩니다.

# 클라이언트측 암호화를 사용하여 데이터 보호
<a name="UsingClientSideEncryption"></a>

*클라이언트측 암호화는* 전송 및 저장 시 보안을 보장하기 위해 로컬에서 데이터를 암호화하는 작업입니다. Amazon S3에 전송하기 전에 객체를 암호화하려면 Amazon S3 암호화 클라이언트를 사용하십시오. 이 방식으로 객체를 암호화하면 AWS를 포함한 제3자에게 객체가 노출되지 않습니다. Amazon S3는 이미 암호화된 객체를 수신하며, Amazon S3는 객체를 암호화하거나 해독하는 역할을 하지 않습니다. Amazon S3 암호화 클라이언트와 [서버 측 암호화를](serv-side-encryption.md) 모두 사용하여 데이터를 암호화할 수 있습니다. 암호화된 객체를 Amazon S3에 전송할 때 Amazon S3는 해당 객체를 암호화된 것으로 인식하지 않고 일반적인 객체만 탐지합니다.

Amazon S3 암호화 클라이언트는 사용자와 Amazon S3 사이의 중개자 역할을 합니다. Amazon S3 암호화 클라이언트를 인스턴스화하고 나면 Amazon S3 `PutObject` 및 `GetObject` 요청의 일부로 객체가 자동으로 암호화되고 해독됩니다. 객체는 모두 고유한 데이터 키로 암호화됩니다. Amazon S3 암호화 클라이언트는 KMS 키를 래핑 키로 지정하더라도 버킷 키를 사용하거나 버킷 키와 상호 작용하지 않습니다.

*Amazon S3 암호화 클라이언트 개발자 안내서*는 Amazon S3 암호화 클라이언트 버전 3.0 이상을 중점적으로 다루고 있습니다. 자세한 내용은 **Amazon S3 암호화 클라이언트 개발자 안내서에서 [Amazon S3 암호화 클라이언트란 무엇인가요?](https://docs.aws.amazon.com//amazon-s3-encryption-client/latest/developerguide/what-is-s3-encryption-client.html)를 참조하십시오.

Amazon S3 Encryption 클라이언트의 이전 버전에 대한 자세한 내용은 해당 프로그래밍 언어의 AWS SDK 개발자 안내서를 참조하십시오.
+ [AWS SDK for Java](https://docs.aws.amazon.com//sdk-for-java/v1/developer-guide/examples-crypto.html)
+ [AWS SDK for .NET](https://docs.aws.amazon.com//sdk-for-net/v3/developer-guide/kms-keys-s3-encryption.html)
+ [AWS SDK for Go](https://docs.aws.amazon.com//sdk-for-go/v1/developer-guide/welcome.html)
+ [AWS SDK for PHP](https://docs.aws.amazon.com//sdk-for-php/v3/developer-guide/s3-encryption-client.html)
+ [AWS SDK for Ruby](https://docs.aws.amazon.com//sdk-for-ruby/v3/api/Aws/S3/Encryption.html)
+ [AWS SDK for C\$1\$1](https://docs.aws.amazon.com//sdk-for-cpp/v1/developer-guide/welcome.html)

# 암호화로 전송 중 데이터 보호
<a name="UsingEncryptionInTransit"></a>

Amazon S3는 데이터 전송에 HTTP 및 HTTPS 프로토콜을 모두 지원합니다. HTTP는 일반 텍스트로 데이터를 전송하는 반면, HTTPS는 Transport Layer Security(TLS)를 사용해 데이터를 암호화하여 보안 계층을 추가합니다. TLS는 도청, 데이터 변조 및 중간자 공격으로부터 보호합니다. HTTP 트래픽은 허용되지만 대부분의 구현에서는 HTTPS 및 TLS를 사용한 전송 중 암호화를 사용하여 클라이언트와 Amazon S3 간에 이동하는 데이터를 보호합니다.

## TLS 1.2 및 TLS 1.3 지원
<a name="UsingEncryptionInTransit.TLS-support"></a>

Amazon S3는 모든 AWS 리전의 모든 API 엔드포인트에서 HTTPS 연결에 TLS 1.2 및 TLS 1.3을 지원합니다. S3는 클라이언트 소프트웨어에서 지원하는 가장 강력한 TLS 보호와 액세스 중인 S3 엔드포인트를 자동으로 협상합니다. AWS SDK 및 AWS CLI를 포함한 현재 AWS 도구(2014 이상)는 자동으로 TLS 1.3으로 기본 설정되며 별도의 조치가 필요하지 않습니다. TLS 1.2와의 이전 버전 호환성이 필요한 경우 클라이언트 구성 설정을 통해 이 자동 협상을 재정의하여 특정 TLS 버전을 지정할 수 있습니다. TLS 1.3을 사용하는 경우 선택적으로 Amazon S3에 양자 방지 요청을 하도록 하이브리드 양자 내성 키 교환(ML-KEM)을 구성할 수 있습니다. 자세한 내용은 [클라이언트에 대한 하이브리드 양자 내성 TLS 구성](pqtls-how-to.md) 섹션을 참조하세요.

**참고**  
TLS 1.3은 AWS PrivateLink for Amazon S3 및 다중 리전 액세스 포인트를 제외한 모든 S3 엔드포인트에서 지원됩니다.

## TLS 사용 모니터링
<a name="UsingEncryptionInTransit.monitoring"></a>

Amazon S3 서버 액세스 로그 또는 AWS CloudTrail을 사용하여 Amazon S3 버킷에 대한 요청을 모니터링할 수 있습니다. 두 로깅 옵션 모두 각 요청에 사용된 TLS 버전과 암호 제품군을 기록합니다.
+ **Amazon S3 서버 액세스 로그** – 서버 액세스 로깅은 버킷에 수행된 요청에 대한 상세 레코드를 제공합니다. 예를 들어 액세스 로그 정보는 보안 및 액세스 감사에 유용할 수 있습니다. 자세한 내용은 [Amazon S3 서버 액세스 로그 형식](LogFormat.md) 섹션을 참조하세요.
+ **AWS CloudTrail** – [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)은 사용자, 역할 또는 AWS 서비스가 수행한 작업 기록을 제공하는 서비스입니다. CloudTrail은 Amazon S3에 대한 모든 API 직접 호출을 이벤트로 캡처합니다. 자세한 내용은 [Amazon S3 CloudTrail 이벤트](cloudtrail-logging-s3-info.md) 섹션을 참조하세요.

## 전송 중 암호화 적용
<a name="UsingEncryptionInTransit.enforcement"></a>

Amazon S3로 전송 중인 데이터의 암호화를 적용하는 것이 보안 모범 사례입니다. 다양한 정책 메커니즘을 통해 HTTPS 전용 통신 또는 특정 TLS 버전 사용을 적용할 수 있습니다. 여기에는 S3 버킷에 대한 IAM 리소스 기반 정책([버킷 정책](bucket-policies.md)), [서비스 제어 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)(SCP), [리소스 제어 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)(RCP) 및 [VPC 엔드포인트 정책](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)이 포함됩니다.

### 전송 중 암호화를 적용하기 위한 버킷 정책 예제
<a name="UsingEncryptionInTransit.bucket-policy-example"></a>

[S3 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html#amazons3-policy-keys) `s3:TlsVersion`을 사용하여 클라이언트에서 사용하는 TLS 버전에 따라 Amazon S3 버킷에 대한 액세스를 제한할 수 있습니다. 자세한 내용은 [예시 6: 최소 TLS 버전 요구](amazon-s3-policy-keys.md#example-object-tls-version) 섹션을 참조하세요.

**Example `S3:TlsVersion` 조건 키를 사용하여 TLS 1.3을 적용하는 버킷 정책**  

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyInsecureConnections",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket1",
        "arn:aws:s3:::amzn-s3-demo-bucket1/*"
      ],
      "Condition": {
        "NumericLessThan": {
          "s3:TlsVersion": "1.3"
        }
      }
    }
  ]
}
```

S3 버킷 정책의 `aws:SecureTransport` [전역 조건 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 사용하여 요청이 HTTPS(TLS)를 통해 전송되었는지 확인할 수 있습니다. 이전 예제와 달리 이 조건은 특정 TLS 버전을 확인하지 않습니다. 자세한 내용은 [HTTPS 요청으로만 액세스 제한](example-bucket-policies.md#example-bucket-policies-use-case-HTTP-HTTPS-1) 섹션을 참조하세요.

**Example `aws:SecureTransport` 전역 조건 키를 사용하여 HTTPS를 적용하는 버킷 정책**  

```
{
    "Version":"2012-10-17",		 	 	 		 	 	 
    "Statement": [
     {
        "Sid": "RestrictToTLSRequestsOnly",		 	 	 
        "Action": "s3:*",
        "Effect": "Deny",
        "Resource": [
            "arn:aws:s3:::amzn-s3-demo-bucket1",
            "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        ],
        "Condition": {
            "Bool": {
                "aws:SecureTransport": "false"
            }
        },
        "Principal": "*"
    }
  ]
}
```

**키와 추가 예제를 모두 기반으로 하는 예제 정책**  
하나의 정책에서 이전 예제의 두 가지 유형의 조건 키를 모두 사용할 수 있습니다. 자세한 내용과 추가 적용 방법은 AWS 스토리지 블로그 문서 [Amazon S3에서 TLS 1.2 이상을 사용하여 전송 중 암호화 적용](https://aws.amazon.com/blogs/storage/enforcing-encryption-in-transit-with-tls1-2-or-higher-with-amazon-s3/)을 참조하세요.

# Amazon S3와 함께 하이브리드 양자 내성 TLS 사용
<a name="UsingEncryptionInTransit.PQ-TLS"></a>

Amazon S3는 TLS 네트워크 암호화 프로토콜에 대한 하이브리드 양자 내성 키 교환 옵션을 지원합니다. TLS 1.3을 사용하여 Amazon S3 엔드포인트에 요청할 때 이 TLS 옵션을 사용할 수 있습니다. S3가 TLS 세션에 대해 지원하는 클래식 암호 제품군으로 인해 현재 기술로는 키 교환 메커니즘에 대한 무차별 암호 대입 공격이 불가능합니다. 그러나 앞으로 암호화 방식의 관련 양자 컴퓨팅이 실용화된다면 TLS 키 교환 메커니즘에 사용되는 클래식 암호 제품군은 이러한 공격에 취약해질 것입니다. 현재 업계에서는 기존 암호화 방식과 양자 컴퓨팅 요소를 결합한 하이브리드 양자 컴퓨팅 키 교환 방식을 채택하여 TLS 연결의 보안 강도를 기존 암호화 방식만큼 또는 그 이상으로 강화하고 있습니다. Amazon S3는 현재 업계 표준 IANA 사양을 준수하여 하이브리드 PQ-TLS를 지원합니다.

TLS 연결을 통해 전달되는 데이터의 장기 기밀성에 의존하는 애플리케이션을 개발 중인 경우 대규모 양자 컴퓨터가 실용화되기 전에 양자 내성 암호화로 마이그레이션할 계획을 고려해야 합니다. 공동 책임 모델의 일환으로 S3는 서비스 엔드포인트에서 양자 내성 암호화를 활성화합니다. 브라우저와 애플리케이션이 동시에 PQ-TLS를 활성화하면 S3는 전송 중 데이터를 보호하기 위해 가능한 가장 강력한 구성을 선택합니다.

**지원되는 엔드포인트 유형 및 AWS 리전**

Amazon S3용 양자 내성 TLS는 모든 AWS 리전에서 사용할 수 있습니다. 각 AWS 리전의 S3 엔드포인트 목록은 *Amazon Web Services 일반 참조*의 [Amazon Simple Storage Service 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/s3.html)을 참조하세요.

**참고**  
하이브리드 양자 내성 TLS는 Amazon S3용 AWS PrivateLink 및 다중 리전 액세스 포인트, S3 Vectors를 제외한 모든 S3 엔드포인트에서 지원됩니다.

## Amazon S3와 함께 하이브리드 양자 내성 TLS 사용
<a name="pqtls-details"></a>

Amazon S3에 요청하는 클라이언트를 구성할 때 하이브리드 양자 내성 TLS를 지원하도록 해야 합니다. HTTP 클라이언트 테스트 환경 또는 프로덕션 환경을 설정할 때는 다음 정보에 유의합니다.

**전송 중 데이터 암호화**

하이브리드 양자 내성 TLS는 전송 중 암호화에만 사용됩니다. 이렇게 하면 클라이언트에서 S3 엔드포인트로 이동하는 데이터가 보호됩니다. 이 새로운 지원은 기본적으로 AES-256 알고리즘을 활용하는 Amazon S3의 서버 측 암호화와 결합되어 고객에게 전송 중 및 저장 중 양자 내성 암호화를 제공합니다. Amazon S3의 서버 측 암호화에 대한 자세한 내용은 [서버 측 암호화를 사용하여 데이터 보호](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)를 참조하세요.

**지원되는 클라이언트**

하이브리드 양자 내성 TLS를 사용하려면 이 기능을 지원하는 클라이언트를 사용해야 합니다. AWS SDK와 도구에는 언어와 런타임에 따라 다른 암호화 기능과 구성이 있습니다. 특정 도구의 양자 내성 암호화에 대한 자세한 내용은 [하이브리드 양자 내성 TLS 활성화](https://docs.aws.amazon.com/payment-cryptography/latest/userguide/pqtls-details.html)를 참조하세요.

**참고**  
Amazon S3에 대한 요청과 관련된 PQ-TLS 키 교환 세부 정보는 AWS CloudTrail 이벤트 또는 S3 서버 액세스 로그에서 사용할 수 없습니다.

## 양자 내성 TLS에 대해 자세히 알아보기
<a name="pqtls-see-also"></a>

하이브리드 양자 내성 TLS 사용에 대한 자세한 내용은 다음 리소스를 참조하세요.
+ AWS에서 블로그 게시물 및 연구 논문에 대한 링크와 양자 내성 암호화에 대해 알아보려면 [AWS의 양자 내성 암호화](https://aws.amazon.com/security/post-quantum-cryptography/)를 참조하세요.
+ s2n-tls에 대한 자세한 내용은 [새 오픈 소스 TLS 구현, 즉 s2n-tls 소개](https://aws.amazon.com/blogs/security/introducing-s2n-a-new-open-source-tls-implementation/) 및 [s2n-tls 사용](https://github.com/aws/s2n-tls/tree/main/docs/usage-guide)을 참조하세요.
+ AWS 공용 런타임 HTTP 클라이언트에 대한 자세한 내용을 확인하려면 **AWS SDK for Java 2.x 개발자 안내서의 [AWS CRT 기반 HTTP 클라이언트 구성](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/http-configuration-crt.html) 섹션을 참조하세요.
+ 국립 표준 기술 연구소(NIST)의 포스트 양자 암호화 프로젝트에 대한 자세한 내용은 [포스트 양자 암호화](https://csrc.nist.gov/Projects/Post-Quantum-Cryptography)를 참조하세요.
+ NIST 양자 내성 암호화 표준화에 대한 자세한 내용을 확인하려면 [NIST의 양자 내성 암호화 표준화](https://csrc.nist.gov/Projects/post-quantum-cryptography/post-quantum-cryptography-standardization)를 참조하세요.

# 클라이언트에 대한 하이브리드 양자 내성 TLS 구성
<a name="pqtls-how-to"></a>

Amazon S3에서 PQ-TLS를 사용하려면 양자 내성 키 교환 알고리즘을 지원하도록 클라이언트를 구성해야 합니다. 또한 클라이언트가 기존의 타원 곡선 암호와 ML-KEM(Module-Lattice-Based Key Encapsulation Mechanism) 같은 양자 내성 알고리즘을 결합하는 하이브리드 접근 방식을 지원하는지 확인합니다.

특정 구성은 클라이언트 라이브러리 및 프로그래밍 언어에 따라 다릅니다. 자세한 내용은 [하이브리드 양자 내성 TLS 활성화](https://docs.aws.amazon.com/payment-cryptography/latest/userguide/pqtls-details.html)를 참조하세요.

## 클라이언트 구성 예제: AWS SDK for Java 2
<a name="UsingEncryptionInTransit.PQ-TLS.configuration.java2-sdk"></a>

이 절차에서는 AWS 공통 런타임 HTTP 클라이언트에 대한 Maven 종속성을 추가합니다. 다음으로 포스트 양자 TLS를 선호하는 HTTP 클라이언트를 구성하세요. 그런 다음 HTTP 클라이언트를 사용하는 Amazon S3 클라이언트를 생성합니다.

**참고**  
평가판으로 제공되었던 AWS 공통 런타임 HTTP 클라이언트는 2023년 2월에 정식 버전으로 제공되었습니다. 해당 릴리스에서는 `tlsCipherPreference` 클래스와`tlsCipherPreference()` 메서드 파라미터가 `postQuantumTlsEnabled()` 메서드 파라미터로 대체되었습니다. 평가판 사용 중에 이 예제를 사용했다면 코드를 업데이트해야 합니다.

1. Maven 종속성에 AWS 공통 런타임 클라이언트를 추가합니다. 사용 가능한 최신 버전을 사용하는 것이 좋습니다.

   예를 들어 이 문은 AWS 공통 런타임 클라이언트의 `2.30.22` 버전을 Maven 종속성에 추가합니다.

   ```
   <dependency>
       <groupId>software.amazon.awssdk</groupId>
       <artifactId>aws-crt-client</artifactId>
       <version>2.30.22</version>
   </dependency>
   ```

1. 하이브리드 포스트 양자 암호 제품군을 활성화하려면 AWS SDK for Java 2.x를 프로젝트에 추가한 후 초기화하세요. 이어서 다음 예제와 같이 HTTP 클라이언트에서 하이브리드 포스트 양자 암호 제품군을 활성화합니다.

   이 코드는 `postQuantumTlsEnabled()` 메서드 파라미터를 사용하여 권장되는 하이브리드 양자 내성 암호 제품군인 ML-KEM이 포함된 ECDH를 선호하는 [AWS 공용 런타임 HTTP 클라이언트](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/http-configuration-crt.html)를 구성합니다. 그런 다음 구성된 HTTP 클라이언트를 사용하여 Amazon S3 비동기 클라이언트인 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html)의 인스턴스를 구축합니다. 이 코드가 완료된 후에 `S3AsyncClient` 인스턴스의 모든 [Amazon S3 API](https://docs.aws.amazon.com/AmazonS3/latest/API/) 요청은 하이브리드 양자 내성 TLS를 사용합니다.
**중요**  
v2.35.11부터 호출자는 클라이언트에 하이브리드 양자 내성 TLS를 활성화하도록 `.postQuantumTlsEnabled(true)`를 더 이상 설정할 필요가 없습니다. v2.35.11 이상의 모든 버전은 기본적으로 양자 내성 TLS를 활성화합니다.

   ```
   // Configure HTTP client
   SdkAsyncHttpClient awsCrtHttpClient = AwsCrtAsyncHttpClient.builder()
             .postQuantumTlsEnabled(true)
             .build();
   
   // Create the Amazon S3 async client
   S3AsyncClient s3Async = S3AsyncClient.builder()
            .httpClient(awsCrtHttpClient)
            .build();
   ```

1. 하이브리드 양자 내성 TLS를 사용하여 Amazon S3 직접 호출을 테스트합니다.

   구성된 Amazon S3 클라이언트에서 Amazon S3 API 작업을 호출하면 호출은 하이브리드 양자 내성 TLS를 사용하여 Amazon S3 엔드포인트로 전송됩니다. 구성을 테스트하려면 Amazon S3 API(예: `[ListBuckets](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html)`)을 직접 호출합니다.

   ```
   ListBucketsResponse reponse = s3Async.listBuckets();
   ```

### 하이브리드 포스트 퀀텀 TLS 구성 테스트
<a name="pqtls-testing"></a>

Amazon S3를 직접 호출하는 애플리케이션에서 하이브리드 암호 제품군을 사용하여 다음 테스트를 실행하는 것을 고려하세요.
+ 로드 테스트 및 벤치마크를 실행합니다. 하이브리드 암호 제품군은 기존 키 교환 알고리즘과 다르게 작동합니다. 핸드셰이크 시간이 길어지도록 연결 제한 시간을 조정해야 할 수도 있습니다. AWS Lambda 함수 내에서 실행 중인 경우 실행 제한 시간 설정 값을 늘리세요.
+ 다른 위치에서 연결해 보세요. 요청이 지나는 네트워크 경로에 따라 DPI(심층 패킷 검사)가 있는 중간 호스트, 프록시 또는 방화벽으로 인해 요청이 차단됨을 알 수 있습니다. TLS 핸드셰이크의 [ClientHello](https://tools.ietf.org/html/rfc5246#section-7.4.1.2) 부분에서 새 암호 제품군을 사용하는 것 또는 키 교환 메시지가 더 큰 것이 원인일 수 있습니다. 이러한 문제를 해결하는 데 문제가 있는 경우 보안 팀 또는 IT 관리자와 협력하여 관련 구성을 업데이트하고 새 TLS 암호 제품군을 차단 해제하세요.

# 인터네트워크 트래픽 개인 정보
<a name="inter-network-traffic-privacy"></a>

이 주제에서는 Amazon S3가 해당 서비스에서 다른 위치로 향하는 연결을 보호하는 방법을 설명합니다.

## 서비스와 온프레미스 클라이언트 및 애플리케이션 간의 트래픽
<a name="inter-network-traffic-privacy-on-prem"></a>

다음 연결을 AWS PrivateLink와 결합하여 프라이빗 네트워크와 AWS 간의 연결을 제공할 수 있습니다.
+ AWS Site-to-Site VPN 연결. 자세한 내용은 [AWS Site-to-Site VPN이란 무엇입니까?](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)를 참조하십시오.
+ Direct Connect 연결. 자세한 내용은 [Direct Connect란 무엇입니까?](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)를 참조하십시오.

네트워크를 통한 Amazon S3 액세스는 AWS에서 게시한 API를 통해 이루어집니다. 클라이언트가 전송 계층 보안(TLS) 1.2를 지원해야 합니다. 하이브리드 양자 내성 키 교환과 함께 TLS 1.3을 사용하는 것이 좋습니다. 클라이언트는 DHE(Ephemeral Diffie-Hellman) 또는 ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)와 같은 PFS(전달 완전 보안)가 포함된 암호 제품군도 지원해야 합니다. Java 7 이상의 최신 시스템은 대부분 이러한 모드를 지원합니다. 또한, 액세스 키 ID와 IAM 보안 주체와 관련된 비밀 액세스 키를 사용하여 요청에 서명하거나 [AWS Security Token Service(STS)](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html)를 사용하여 요청에 서명할 수 있는 임시 보안 자격 증명을 생성할 수 있습니다.

## 같은 리전에 있는 AWS 리소스 사이의 트래픽
<a name="inter-network-traffic-privacy-within-region"></a>

Amazon S3용 가상 프라이빗 클라우드(VPC) 엔드포인트는 VPC 내의 논리적 엔터티로서, Amazon S3에만 연결을 허용합니다. VPC는 Amazon S3로 요청을 라우팅하고, 응답을 다시 VPC로 라우팅합니다. 자세한 내용은 *Amazon VPC 사용 설명서*의 [VPC 종단점](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html)을 참조하세요. VPC 종단점에서 S3 버킷 액세스를 제어하는 데 사용할 수 있는 예제 버킷 정책은 [버킷 정책을 사용하여 VPC 엔드포인트에서 액세스 제어](example-bucket-policies-vpc-endpoint.md) 섹션을 참조하세요.

# AWS PrivateLinkAmazon S3용
<a name="privatelink-interface-endpoints"></a>

Amazon S3용 AWS PrivateLink를 사용하면 가상 프라이빗 클라우드(VPC)에서 *인터페이스 VPC 엔드포인트*(인터페이스 엔드포인트)를 프로비저닝할 수 있습니다. 이러한 엔드포인트는 VPN 및 Direct Connect를 통해 온프레미스에 있거나 VPC 피어링을 통해 다른 AWS 리전에 있는 애플리케이션에서 직접 액세스할 수 있습니다.

인터페이스 엔드포인트는 VPC의 서브넷에서 프라이빗 IP 주소가 할당된 하나 이상의 탄력적 네트워크 인터페이스(ENI)로 표시됩니다. 인터페이스 엔드포인트를 통한 Amazon S3에 대한 요청은 Amazon 네트워크에 유지됩니다. 또한, AWS Direct Connect 또는 AWS Virtual Private Network(Site-to-Site VPN)을 통해 온프레미스 애플리케이션에서 VPC의 인터페이스 엔드포인트에 액세스할 수 있습니다. VPC를 온프레미스 네트워크에 연결하는 방법에 대한 자세한 내용은 [Direct Connect 사용 설명서](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 및 [AWS Site-to-Site VPN 사용 설명서](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)를 참조하십시오.

인터페이스 엔드포인트에 대한 일반적인 정보는 *AWS PrivateLink 가이드*의 [인터페이스 VPC 엔드포인트(AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html)를 참조하십시오.

**Topics**
+ [Amazon S3용 VPC 엔드포인트 유형](#types-of-vpc-endpoints-for-s3)
+ [Amazon S3용 AWS PrivateLink에 대한 규제 및 제한](#privatelink-limitations)
+ [VPC 엔드포인트 생성](#s3-creating-vpc)
+ [Amazon S3 인터페이스 엔드포인트 액세스](#accessing-s3-interface-endpoints)
+ [VPC 엔드포인트의 IP 주소 유형](#privatelink-ip-address-types)
+ [VPC 엔드포인트의 DNS 레코드 IP 유형](#privatelink-dns-record-types)
+ [프라이빗 DNS](#private-dns)
+ [S3 인터페이스 엔드포인트에서 버킷, 액세스 포인트, Amazon S3 제어 API 작업에 액세스](#accessing-bucket-and-aps-from-interface-endpoints)
+ [온프레미스 DNS 구성 업데이트](#updating-on-premises-dns-config)
+ [Amazon S3에 대한 VPC 엔드포인트 정책 생성](#creating-vpc-endpoint-policy)

## Amazon S3용 VPC 엔드포인트 유형
<a name="types-of-vpc-endpoints-for-s3"></a>

두 가지 유형의 VPC 엔드포인트, 즉 *게이트웨이 엔드포인트*와 *인터페이스 엔드포인트*(AWS PrivateLink 사용)를 사용하여 Amazon S3에 액세스할 수 있습니다. *게이트웨이 엔드포인트*는 AWS 네트워크를 통해 VPC에서 Amazon S3에 액세스하기 위해 라우팅 테이블에 지정하는 게이트웨이입니다. *인터페이스 엔드포인트*는 프라이빗 IP 주소를 통해 온프레미스의 VPC 내에서 또는 VPC 피어링이나 AWS Transit Gateway를 사용하여 다른 AWS 리전의 VPC에서 Amazon S3로 요청을 라우팅함으로써 게이트웨이 엔드포인트의 기능을 확장합니다. 자세한 내용은 [VPC 피어링이란?](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html) 및 [Transit Gateway 및 VPC 피어링](https://docs.aws.amazon.com/whitepapers/latest/building-scalable-secure-multi-vpc-network-infrastructure/transit-gateway-vs-vpc-peering.html)을 참조하십시오.

인터페이스 엔드포인트는 게이트웨이 엔드포인트와 호환됩니다. VPC에 기존 게이트웨이 엔드포인트가 있는 경우, 동일한 VPC에서 두 가지 유형의 엔드포인트를 모두 사용할 수 있습니다.


|  Amazon S3용 게이트웨이 엔드포인트  |  Amazon S3용 인터페이스 엔드포인트  | 
| --- | --- | 
|  두 경우 모두, 네트워크 트래픽은 AWS 네트워크에 남아 있습니다.  | 
|  Amazon S3 퍼블릭 IP 주소 사용  |  VPC의 프라이빗 IP 주소를 사용하여 Amazon S3에 액세스  | 
|  동일한 Amazon S3 DNS 이름 사용  |  [엔드포인트별 Amazon S3 DNS 이름 필요](https://docs.aws.amazon.com/AmazonS3/latest/userguide/privatelink-interface-endpoints.html#accessing-s3-interface-endpoints)  | 
|  온프레미스에서의 액세스를 허용하지 않음  |  온프레미스에서의 액세스 허용  | 
|  다른 AWS 리전에서의 액세스를 허용하지 않음  |  VPC 피어링 또는 AWS Transit Gateway를 사용하여 다른 AWS 리전의 VPC에서 액세스 허용  | 
|  미청구  |  청구  | 

자세한 내용은 *AWS PrivateLink 가이드*의 [게이트웨이 엔드포인트](https://docs.aws.amazon.com/vpc/latest/privatelink/gateway-endpoints.html) 및 [인터페이스 VPC 엔드포인트](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)를 참조하세요.

## Amazon S3용 AWS PrivateLink에 대한 규제 및 제한
<a name="privatelink-limitations"></a>

Amazon S3용 AWS PrivateLink에는 VPC 제한이 적용됩니다. 자세한 내용은 **AWS PrivateLink 가이드의 [인터페이스 엔드포인트 고려 사항](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-interface-limitations) 및 [AWS PrivateLink 할당량](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-limits-endpoints.html)을 참조하십시오. 또한 다음과 같은 제한 사항이 적용됩니다.

Amazon S3용 인터페이스 엔드포인트는 다음을 지원하지 않습니다.
+ [Federal Information Processing Standard(FIPS) 엔드포인트](https://aws.amazon.com/compliance/fips/)
+ [웹 사이트 엔드포인트](WebsiteEndpoints.md)
+ [레거시 글로벌 엔드포인트](VirtualHosting.md#deprecated-global-endpoint)
+ [S3 대시 리전 엔드포인트 ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html)
+ 다른 AWS 리전에 있는 버킷 간 [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/API_UploadPartCopy.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 사용
+ 전송 계층 보안(TLS) 1.0
+ Transport Layer Security (TLS) 1.1
+ Transport Layer Security(TLS) 1.3
+ 하이브리드 양자 내성 Transport Layer Security(TLS)

## VPC 엔드포인트 생성
<a name="s3-creating-vpc"></a>

VPC 인터페이스 엔드포인트를 생성하려면 *AWS PrivateLink 설명서*의 [ VPC 엔드포인트 생성](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)을 참조하십시오. VPC 게이트웨이 엔드포인트를 생성하려면 *AWS PrivateLink 설명서*의 [게이트웨이 엔드포인트 생성](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html#create-gateway-endpoint-s3)을 참조하세요.

## Amazon S3 인터페이스 엔드포인트 액세스
<a name="accessing-s3-interface-endpoints"></a>

인터페이스 엔드포인트를 생성하면 Amazon S3는 두 가지 유형의 엔드포인트별 S3 DNS 이름인 *Regional* 및 *zonal*을 생성합니다.
+ **리전별 DNS 이름에는 고유한 VPC 엔드포인트 ID, 서비스 식별자, AWS 리전, `vpce.amazonaws.com`이 해당 이름에 포함됩니다. 예를 들어, VPC 엔드포인트 ID `vpce-1a2b3c4d`의 경우, 생성된 DNS 이름은 `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com`과(와) 비슷할 수 있습니다.
+ **영역별 DNS 이름에는 가용 영역이 포함됩니다(예: `vpce-1a2b3c4d-5e6f-us-east-1a.s3.us-east-1.vpce.amazonaws.com`). 아키텍처가 가용 영역을 분리하는 경우 이 옵션을 사용할 수 있습니다. 예를 들어, 오류를 제한하거나 리전별 데이터 전송 비용을 줄이는 데 사용할 수 있습니다.

엔드포인트별 S3 DNS 이름은 S3 퍼블릭 DNS 도메인에서 확인할 수 있습니다.

Amazon S3용 VPC 엔드포인트는 IPv4, IPv6 및 듀얼 스택을 비롯한 다양한 유형의 IP 주소 지정을 지원합니다. [VPC 엔드포인트의 IP 주소 유형](#privatelink-ip-address-types) 및 [VPC 엔드포인트의 DNS 레코드 IP 유형](#privatelink-dns-record-types) 섹션을 참조하세요.

## VPC 엔드포인트의 IP 주소 유형
<a name="privatelink-ip-address-types"></a>

Amazon S3용 VPC 엔드포인트는 다음을 비롯한 다양한 유형의 IP 주소 지정을 지원합니다.
+ **(IPv4**)

  VPC 엔드포인트를 연결에 IPv4 주소만 사용하도록 구성할 수 있습니다.
+ **IPv6**

  VPC 엔드포인트를 연결에 IPv6 주소만 사용하도록 구성할 수 있습니다.
+ **이중 스택**

  VPC 엔드포인트를 IPv4 및 IPv6 주소를 동시에 지원하는 듀얼 스택 모드로 구성할 수 있습니다. 이를 통해 IPv4 또는 IPv6 네트워크를 통해 Amazon S3에 유연하게 액세스할 수 있습니다.

VPC 엔드포인트에 대해 선택하는 IP 주소 유형은 애플리케이션 및 인프라의 네트워킹 요구 사항에 따라 달라집니다. 고려 사항에는 VPC, 온프레미스 네트워크 및 Amazon S3에 대한 인터넷 연결 전반에 사용되는 IP 주소 지정 체계가 포함될 수 있습니다. 자세한 내용은 *Amazon Virtual Private Cloud* 가이드의 [인터페이스 엔드포인트](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html#aws-service-ip-address-type) 및 [게이트웨이 엔드포인트](https://docs.aws.amazon.com/vpc/latest/privatelink/gateway-endpoints.html#gateway-endpoint-ip-address-type)의 IP 주소 유형을 참조하세요.

## VPC 엔드포인트의 DNS 레코드 IP 유형
<a name="privatelink-dns-record-types"></a>

IP 주소 유형에 따라 VPC 엔드포인트를 직접 호출할 때 AWS 서비스는 `A` 레코드, `AAAA` 레코드 또는 `A` 및 `AAAA` 레코드를 모두 반환할 수 있습니다. DNS 레코드 IP 유형을 수정하여 AWS 서비스가 반환하는 레코드 유형을 사용자 지정할 수 있습니다. 다음 테이블에는 지원되는 DNS 레코드 IP 유형과 IP 주소 유형이 나와 있습니다.


| 지원되는 IP 주소 유형 | DNS 레코드 IP 유형 | 
| --- | --- | 
| IPv4 | IPv4 | 
| IPv6 | IPv6 | 
| 듀얼 스택 | 듀얼 스택, IPv4, IPv6, 서비스 정의형 | 

### Amazon S3에 대한 서비스 정의 DNS 레코드 IP 유형 구성
<a name="privatelink-dns-record-types-configure"></a>

Amazon S3에 대한 게이트웨이 엔드포인트를 생성하고 DNS 레코드 IP 유형을 서비스 정의로 구성하고 리전 서비스 엔드포인트(예: `s3.us-east-2.amazonaws.com`)를 사용하는 경우, Amazon S3는 클라이언트에 `A` 레코드를 반환합니다. 반대로 게이트웨이 엔드포인트를 생성하고 듀얼 스택 서비스 엔드포인트(예: `s3.dualstack.us-east-2.amazonaws.com`)를 사용하고 DNS 레코드 IP 유형을 `service-defined`로 선택하면 Amazon S3는 `A` 및 `AAAA` 레코드를 모두 클라이언트에 반환합니다.

마찬가지로 프라이빗 DNS가 활성화된 인터페이스 엔드포인트를 생성하고 DNS 레코드 유형으로 정의된 서비스를 선택하면 리전 서비스 엔드포인트(예: `s3.us-east-2.amazonaws.com`)에 대해 Amazon S3가 클라이언트에 `A` 레코드를 반환합니다. 반면 듀얼 스택 서비스 엔드포인트(예: `s3.dualstack.us-east-2.amazonaws.com`)의 경우 Amazon S3는 `A` 및 `AAAA` 레코드를 모두 반환합니다. 자세한 내용은 *VPC 사용 설명서*의 [인터페이스 엔드포인트](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html#aws-services-dns-record-ip-type) 및 [게이트웨이 엔드포인트](https://docs.aws.amazon.com/vpc/latest/privatelink/gateway-endpoints.html#gateway-endpoint-dns-record-ip-type)에 대한 DNS 레코드 IP 유형을 참조하세요.

다음 테이블은 게이트웨이 및 인터페이스 엔드포인트에 지원되는 DNS 레코드 IP 유형을 보여줍니다.


| IP 주소 유형 | S3 게이트웨이 엔드포인트에 지원되는 DNS 레코드 IP 유형 | S3 인터페이스 엔드포인트에 지원되는 DNS 레코드 IP 유형  | 
| --- | --- | --- | 
| IPv4 | IPv4, 서비스 정의형\$1 | IPv4 | 
| IPv6 | IPv6, 서비스 정의형\$1 | IPv6 | 
| 듀얼 스택 | IPv4, IPv6, 듀얼 스택, 서비스 정의형\$1 | 듀얼 스택\$1, IPv4, IPv6, 서비스 정의형 | 

\$1 기본 DNS 레코드 IP 유형을 나타냅니다.

기존 S3 게이트웨이 또는 인터페이스 엔드포인트에서 IPv6 연결을 활성화하려면 엔드포인트의 IP 주소 유형을 **Dualstack**으로 업데이트합니다. 업데이트되면 Amazon S3는 게이트웨이 엔드포인트의 IPv6 주소로 라우팅 테이블을 자동으로 업데이트합니다. 그런 다음 `s3.dualstack.us-east-2.amazonaws.com`과 같은 듀얼 스택 서비스 엔드포인트를 사용할 수 있으며, Amazon S3는 듀얼 스택 S3 DNS 쿼리에 대해 `A` 및 `AAAA` 레코드를 모두 반환합니다. `s3.us-east-2.amazonaws.com`과 같은 리전 서비스 엔드포인트에서 IPV6를 사용하려면 엔드포인트의 IP 주소 유형을 **Dualstack**으로 수정하고 DNS 레코드 IP 유형을 **Dualstack**으로 수정합니다. 그런 다음 Amazon S3는 리전 S3 DNS 쿼리에 대한 `A` 및 `AAAA` 레코드를 모두 반환합니다.

**고려 사항**  
게이트웨이 엔드포인트의 기본 구성이 IP 주소 유형은 `IPv4`이고 DNS 레코드 IP 유형은 `service-defined`인 경우 듀얼 스택 서비스 엔드포인트(예: `s3.dualstack.us-east-2.amazonaws.com`)는 `AAAA` 레코드를 사용하는 트래픽이 게이트웨이 엔드포인트를 통해 라우팅되지 않습니다. 대신 이 트래픽이 있는 경우 IPv6 호환 경로를 통해 삭제되거나 라우팅됩니다. 예를 들어 가상 프라이빗 클라우드(VPC)에 인터넷 게이트웨이가 있는 경우 이 시나리오에서는 IPv6 트래픽이 VPC의 인터넷 게이트웨이를 통해 라우팅됩니다. 트래픽이 항상 VPC 엔드포인트를 통해 라우팅되도록 하려면 지정된 VPC 엔드포인트를 사용하지 않는 경우에 특정 버킷에 대한 액세스를 제한하는 Amazon S3 버킷 정책을 사용할 수 있습니다. 자세한 내용은 [특정 VPC 엔드포인트에 대한 액세스 제한](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html#example-bucket-policies-restrict-accesss-vpc-endpoint)을 참조하세요.
인터페이스 엔드포인트에 IPv4인 IP 주소 유형의 기본 구성과 IPv4인 DNS 레코드 IP 유형이 있는 경우, `ass3.dualstack.us-east-2.amazonaws.com`과 같은 듀얼 스택 서비스 엔드포인트는 지원되지 않습니다. 듀얼스택 서비스 엔드포인트의 `A` 또는 `AAAA` 레코드를 사용하는 트래픽은 인터페이스 엔드포인트를 통해 라우팅되지 않습니다. 대신 이 트래픽이 있는 경우 다른 호환 경로를 통해 삭제되거나 라우팅됩니다.
서비스 정의 이외의 DNS 레코드 IP 유형으로 게이트웨이 엔드포인트를 생성하거나 수정하려면 `enableDnsSupport` 및 `enableDnsHostnames` VPC 속성을 모두 true로 설정해야 합니다.

## 프라이빗 DNS
<a name="private-dns"></a>

VPC 인터페이스 엔드포인트의 프라이빗 DNS 옵션은 VPC 엔드포인트를 통한 S3 트래픽 라우팅을 단순화하고 애플리케이션에서 사용할 수 있는 가장 저렴한 네트워크 경로를 활용할 수 있도록 도와줍니다. 프라이빗 DNS 옵션을 사용하면 인터페이스 엔드포인트의 엔드포인트별 DNS 이름을 사용하도록 S3 클라이언트를 업데이트하거나 DNS 인프라를 관리하지 않고도 리전별 S3 트래픽을 라우팅할 수 있습니다. 프라이빗 DNS 이름을 활성화하면 리전별 S3 DNS 쿼리는 다음 엔드포인트에 대한 AWS PrivateLink 프라이빗 IP 주소로 해결됩니다.
+ 리전 버킷 엔드포인트(예: `s3.us-east-1.amazonaws.com`)
+ 제어 엔드포인트(예: `s3-control.us-east-1.amazonaws.com`)
+ 액세스 포인트 엔드포인트(예: `s3-accesspoint.us-east-1.amazonaws.com`)

VPC에 게이트웨이 엔드포인트가 있는 경우 VPC 내 요청은 기존 S3 게이트웨이 엔드포인트를 통해, 온프레미스 요청은 인터페이스 엔드포인트를 통해 자동으로 라우팅할 수 있습니다. 이 접근 방식을 사용하면 VPC 내 트래픽에 대해 요금이 청구되지 않는 게이트웨이 엔드포인트를 사용하여 네트워킹 비용을 최적화할 수 있습니다. 온프레미스 애플리케이션은 인바운드 해석기 엔드포인트의 도움을 받아 AWS PrivateLink를 사용할 수 있습니다. Amazon은 Route 53 Resolver라고 하는 VPC용 DNS 서버를 제공합니다. 인바운드 Resolver 엔드포인트는 온프레미스 네트워크 상의 DNS 쿼리를 Route 53 Resolver로 전달합니다.

**중요**  
**인바운드 엔드포인트에만 프라이빗 DNS 활성화**를 사용할 때 가장 저렴한 네트워크 경로를 활용하려면 VPC 게이트웨이 엔드포인트가 있어야 합니다. 게이트웨이 엔드포인트가 있으면 **인바운드 엔드포인트에만 프라이빗 DNS 활성화** 옵션을 선택한 경우 VPC 내 트래픽이 항상 AWS 프라이빗 네트워크를 통해 라우팅되도록 할 수 있습니다. **인바운드 엔드포인트에만 프라이빗 DNS 활성화** 옵션을 선택한 상태에서 이 게이트웨이 엔드포인트를 유지 관리해야 합니다. 게이트웨이 엔드포인트를 삭제하려면 먼저 **인바운드 엔드포인트에만 프라이빗 DNS 활성화**를 선택 해제해야 합니다.  
기존 인터페이스 엔드포인트를 **인바운드 엔드포인트에만 프라이빗 DNS 활성화**로 업데이트하려면 먼저 VPC에 S3 게이트웨이 엔드포인트가 있는지 확인하십시오. 게이트웨이 엔드포인트와 프라이빗 DNS 이름 관리에 대한 자세한 내용은 **AWS PrivateLink 가이드의 [게이트웨이 VPC 엔드포인트](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-gateway.html) 및 [DNS 이름 관리](https://docs.aws.amazon.com//vpc/latest/privatelink/manage-dns-names.html)를 각각 참조하십시오.  
**인바운드 해석기에 대해서만 프라이빗 DNS**를 활성화하는 경우, 게이트웨이 엔드포인트의 `dnsRecordIpType`이 인터페이스 엔드포인트와 일치하거나 **서비스가 정의되어** 있어야 합니다.

**인바운드 엔드포인트에만 프라이빗 DNS 활성화** 옵션은 게이트웨이 엔드포인트를 지원하는 서비스에서만 사용할 수 있습니다.

**인바운드 엔드포인트에만 프라이빗 DNS 활성화**를 사용하는 VPC 엔드포인트를 만드는 방법에 대한 자세한 내용은 **AWS PrivateLink 가이드의 [인터페이스 엔드포인트 생성](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html)을 참조하십시오.

**VPC 콘솔 사용**

콘솔에는 **DNS 이름 활성화**와 **인바운드 엔드포인트에만 프라이빗 DNS 활성화**라는 두 가지 옵션이 있습니다. **DNS 이름 활성화**는 AWS PrivateLink에서 지원하는 옵션입니다. **DNS 이름 활성화** 옵션을 사용하면 기본 퍼블릭 엔드포인트 DNS 이름에 요청을 수행하면서 Amazon S3에 대한 Amazon의 프라이빗 연결을 사용할 수 있습니다. 이 옵션을 활성화하면 고객은 애플리케이션에서 사용할 수 있는 가장 저렴한 네트워크 경로를 활용할 수 있습니다.

Amazon S3에 대한 기존 또는 신규 VPC 인터페이스 엔드포인트에서 프라이빗 DNS 이름을 활성화하면 **인바운드 엔드포인트에만 프라이빗 DNS 활성화** 옵션이 기본적으로 선택됩니다. 이 옵션을 선택하면 애플리케이션은 온프레미스 트래픽에 인터페이스 엔드포인트만 사용합니다. 이 VPC 내 트래픽은 비용이 상대적으로 저렴한 게이트웨이 엔드포인트를 자동으로 사용합니다. 또는 **인바운드 엔드포인트에만 프라이빗 DNS 활성화**를 선택 해제하여 인터페이스 엔드포인트를 통해 모든 S3 요청을 라우팅할 수 있습니다.

** 사용AWS CLI**

`PrivateDnsOnlyForInboundResolverEndpoint`의 값을 지정하지 않으면 `true`이 기본값으로 사용됩니다. 그러나 VPC는 설정을 적용하기 전에 VPC에 게이트웨이 엔드포인트가 있는지 확인합니다. VPC 게이트웨이 엔드포인트가 있는 경우 호출은 성공합니다. 없다면 다음과 같은 오류 메시지가 나타납니다.

PrivateDnsOnlyForInboundResolverEndpoint를 참으로 설정하려면 VPC *vpce\$1id*에 해당 서비스의 게이트웨이 엔드포인트가 있어야 합니다.

**신규 VPC 인터페이스 엔드포인트의 경우**

`private-dns-enabled` 및 `dns-options` 특성을 사용하여 명령줄을 통해 프라이빗 DNS를 활성화합니다. `dns-options` 특성의 `PrivateDnsOnlyForInboundResolverEndpoint` 옵션은 `true`으로 설정해야 합니다. `user input placeholders`를 사용자의 정보로 대체합니다.

```
aws ec2 create-vpc-endpoint \
--region us-east-1 \
--service-name s3-service-name \
--vpc-id client-vpc-id \
--subnet-ids client-subnet-id \ 
--vpc-endpoint-type Interface  \
--private-dns-enabled  \
--ip-address-type ip-address-type \ 
--dns-options PrivateDnsOnlyForInboundResolverEndpoint=true \
--security-group-ids client-sg-id
```

**기존 VPC 엔드포인트의 경우**

기존 VPC 엔드포인트에 프라이빗 DNS를 사용하려면 다음 예시 명령을 사용하되 `user input placeholders`를 실제 정보로 대체하십시오.

```
aws ec2 modify-vpc-endpoint \
--region us-east-1 \
--vpc-endpoint-id client-vpc-id \
--private-dns-enabled \
--dns-options PrivateDnsOnlyForInboundResolverEndpoint=false
```

인바운드 해석기에서만 프라이빗 DNS를 사용하도록 기존 VPC 엔드포인트를 업데이트하려면 다음 예시를 사용하되 샘플 값을 실제 값으로 바꾸십시오.

```
aws ec2 modify-vpc-endpoint \
--region us-east-1 \
--vpc-endpoint-id client-vpc-id \
--private-dns-enabled \
--dns-options PrivateDnsOnlyForInboundResolverEndpoint=true
```

## S3 인터페이스 엔드포인트에서 버킷, 액세스 포인트, Amazon S3 제어 API 작업에 액세스
<a name="accessing-bucket-and-aps-from-interface-endpoints"></a>

AWS CLI 또는 AWS SDK를 사용하여 S3 인터페이스 엔드포인트를 통해 버킷, S3 액세스 포인트, Amazon S3 제어 API 작업에 액세스할 수 있습니다.

다음 이미지는 VPC 엔드포인트의 DNS 이름을 찾을 수 있는 VPC 콘솔 **세부 정보** 탭을 보여줍니다. 이 예에서 *VPC 엔드포인트 ID(vpce-id)*는 `vpce-0e25b8cdd720f900e`이고 *DNS 이름*은 `*.vpce-0e25b8cdd720f900e-argc85vg.s3.us-east-1.vpce.amazonaws.com`입니다.







![\[VPC 콘솔의 세부 정보 탭입니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/vpc-console-details-tab.png)


DNS 이름을 사용하여 리소스에 액세스할 때는 *\$1*를 적절한 값으로 바꾸십시오. `*` 대신 사용할 적절한 값은 다음과 같습니다.
+ `bucket`
+ `accesspoint`
+ `control`

예를 들어, 버킷에 액세스하려면 다음과 같은 *DNS 이름*을 사용합니다.

 `bucket.vpce-0e25b8cdd720f900e-argc85vg.s3.us-east-1.vpce.amazonaws.com`

DNS 이름을 사용하여 버킷, 액세스 포인트 및 Amazon S3 제어 API 작업에 액세스하는 방법의 예는 [AWS CLI 예제](#privatelink-aws-cli-examples) 및 [AWS SDK 예제](#privatelink-aws-sdk-examples)의 다음 섹션을 참조하십시오.

엔드포인트별 DNS 이름을 보는 방법에 대한 자세한 내용은 *VPC 사용 설명서*에서 [엔드포인트 서비스 프라이빗 DNS 이름 구성 보기](https://docs.aws.amazon.com/vpc/latest/privatelink/view-vpc-endpoint-service-dns-name.html)를 참조하십시오.

### AWS CLI 예제
<a name="privatelink-aws-cli-examples"></a>

AWS CLI 명령에서 S3 인터페이스 엔드포인트를 통해 S3 버킷, S3 액세스 포인트 또는 S3 제어 API 작업에 액세스하려면 `--region` 및 `--endpoint-url` 파라미터를 사용합니다.

**예: 엔드포인트 URL을 사용하여 버킷의 객체 나열**  
다음 예시에서 버킷 이름 `my-bucket`, 리전 `us-east-1`, VPC 엔드포인트 ID의 DNS 이름 `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
aws s3 ls s3://my-bucket/ --region us-east-1 --endpoint-url https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com
```

**예: 엔드포인트 URL을 사용하여 액세스 포인트의 객체 나열**
+ **방법 1** - 액세스 포인트의 Amazon 리소스 이름(ARN)을 액세스 포인트 엔드포인트에 사용

  ARN `us-east-1:123456789012:accesspoint/accesspointexamplename`, 리전 `us-east-1` 및 VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

  ```
  aws s3api list-objects-v2 --bucket arn:aws:s3:us-east-1:123456789012:accesspoint/accesspointexamplename --region us-east-1 --endpoint-url https://accesspoint.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com
  ```

  명령을 성공적으로 실행할 수 없는 경우 AWS CLI를 최신 버전으로 업데이트하고 다시 시도하십시오. 업데이트 지침에 대한 자세한 내용은 **AWS Command Line Interface 사용 설명서의 [AWS CLI의 최신 버전 설치 또는 업데이트](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html#getting-started-install-instructions)를 참조하십시오.
+ **방법 2** - 액세스 포인트의 별칭을 리전 버킷 엔드포인트와 함께 사용

  다음 예시에서 액세스 포인트 별칭 `accesspointexamplename-8tyekmigicmhun8n9kwpfur39dnw4use1a-s3alias`, 리전 `us-east-1`, VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

  ```
  aws s3api list-objects-v2 --bucket accesspointexamplename-8tyekmigicmhun8n9kwpfur39dnw4use1a-s3alias --region us-east-1 --endpoint-url https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com
  ```
+ **방법 2** - 액세스 포인트의 별칭을 액세스 포인트 엔드포인트와 함께 사용

  먼저 호스트 이름에 버킷이 포함된 S3 엔드포인트를 구성하려면 `aws s3api`가 사용할 주소 지정 스타일을 `virtual`로 설정합니다. `AWS configure`에 대한 자세한 내용은 **AWS Command Line Interface 사용 설명서의 [구성 및 자격 증명 파일 설정](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)을 참조하십시오.

  ```
  aws configure set default.s3.addressing_style virtual
  ```

  그런 다음, 아래 예시에서 액세스 포인트 별칭 `accesspointexamplename-8tyekmigicmhun8n9kwpfur39dnw4use1a-s3alias`, 리전 `us-east-1`, VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다. 액세스 포인트 별칭에 대한 자세한 내용은 [액세스 포인트 별칭](access-points-naming.md#access-points-alias) 섹션을 참조하세요.

  ```
  aws s3api list-objects-v2 --bucket accesspointexamplename-8tyekmigicmhun8n9kwpfur39dnw4use1a-s3alias --region us-east-1 --endpoint-url https://accesspoint.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com
  ```

**예: 엔드포인트 URL을 사용하여 S3 제어 API 작업이 있는 작업 나열**  
다음 예시에서 리전 `us-east-1`, VPC 엔드포인트 `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com`, 계정 ID `12345678`을 실제 정보로 바꿉니다.

```
aws s3control --region us-east-1 --endpoint-url https://control.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com list-jobs --account-id 12345678
```

### AWS SDK 예제
<a name="privatelink-aws-sdk-examples"></a>

AWS SDK를 사용하여 S3 인터페이스 엔드포인트를 통해 S3 버킷, S3 액세스 포인트, Amazon S3 제어 API 작업에 액세스하려면 SDK를 최신 버전으로 업데이트하십시오. 그런 다음, S3 인터페이스 엔드포인트를 통해 버킷, 액세스 포인트 또는 Amazon S3 제어 API에 액세스하기 위해 엔드포인트 URL을 사용하도록 클라이언트를 구성합니다.

------
#### [ SDK for Python (Boto3) ]

**예: 엔드포인트 URL을 사용하여 S3 버킷에 액세스**  
다음 예에서 리전 `us-east-1` 및 VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
s3_client = session.client(
service_name='s3',
region_name='us-east-1',
endpoint_url='https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com'
)
```

**예: 엔드포인트 URL을 사용하여 S3 액세스 포인트에 액세스**  
다음 예에서 리전 `us-east-1` 및 VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
ap_client = session.client(
service_name='s3',
region_name='us-east-1',
endpoint_url='https://accesspoint.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com'
)
```

**예: 엔드포인트 URL을 사용하여 Amazon S3 제어 API에 액세스**  
다음 예에서 리전 `us-east-1` 및 VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
control_client = session.client(
service_name='s3control',
region_name='us-east-1',
endpoint_url='https://control.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com'
)
```

------
#### [ SDK for Java 1.x ]

**예: 엔드포인트 URL을 사용하여 S3 버킷에 액세스**  
다음 예에서 VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
// bucket client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withEndpointConfiguration(
        new AwsClientBuilder.EndpointConfiguration(
                "https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com",
                Regions.DEFAULT_REGION.getName()
        )
).build();
List<Bucket> buckets = s3.listBuckets();
```

**예: 엔드포인트 URL을 사용하여 S3 액세스 포인트에 액세스**  
다음 예에서 VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com` 및 ARN `us-east-1:123456789012:accesspoint/prod`를 실제 정보로 바꿉니다.

```
// accesspoint client
final AmazonS3 s3accesspoint = AmazonS3ClientBuilder.standard().withEndpointConfiguration(
        new AwsClientBuilder.EndpointConfiguration(
                "https://accesspoint.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com",
                Regions.DEFAULT_REGION.getName()
        )
).build();
ObjectListing objects = s3accesspoint.listObjects("arn:aws:s3:us-east-1:123456789012:accesspoint/prod");
```

**예: 엔드포인트 URL을 사용하여 Amazon S3 제어 API 작업에 액세스**  
다음 예에서 VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
// control client
final AWSS3Control s3control = AWSS3ControlClient.builder().withEndpointConfiguration(
        new AwsClientBuilder.EndpointConfiguration(
                "https://control.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com",
                Regions.DEFAULT_REGION.getName()
        )
).build();
final ListJobsResult jobs = s3control.listJobs(new ListJobsRequest());
```

------
#### [ SDK for Java 2.x ]

**예: 엔드포인트 URL을 사용하여 S3 버킷에 액세스**  
다음 예에서 VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com` 및 리전 `Region.US_EAST_1`을 실제 정보로 바꿉니다.

```
// bucket client
Region region = Region.US_EAST_1;
s3Client = S3Client.builder().region(region)
                   .endpointOverride(URI.create("https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com"))
                   .build()
```

**예: 엔드포인트 URL을 사용하여 S3 액세스 포인트에 액세스**  
다음 예에서 VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com` 및 리전 `Region.US_EAST_1`을 실제 정보로 바꿉니다.

```
// accesspoint client
Region region = Region.US_EAST_1;
s3Client = S3Client.builder().region(region)
                   .endpointOverride(URI.create("https://accesspoint.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com"))
                   .build()
```

**예: 엔드포인트 URL을 사용하여 Amazon S3 제어 API에 액세스**  
다음 예에서 VPC 엔드포인트 ID `vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com` 및 리전 `Region.US_EAST_1`을 실제 정보로 바꿉니다.

```
// control client
Region region = Region.US_EAST_1;
s3ControlClient = S3ControlClient.builder().region(region)
                                 .endpointOverride(URI.create("https://control.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com"))
                                 .build()
```

------

## 온프레미스 DNS 구성 업데이트
<a name="updating-on-premises-dns-config"></a>

엔드포인트별 DNS 이름을 사용하여 Amazon S3의 인터페이스 엔드포인트에 액세스할 때는 온프레미스 DNS 확인자를 업데이트할 필요가 없습니다. 퍼블릭 Amazon S3 DNS 도메인의 인터페이스 엔드포인트의 프라이빗 IP 주소로 엔드포인트별 DNS 이름을 확인할 수 있습니다.

### 인터페이스 엔드포인트를 사용하여 VPC의 게이트웨이 엔드포인트 또는 인터넷 게이트웨이 없이 Amazon S3에 액세스
<a name="using-interface-endpoints"></a>

다음 다이어그램과 같이 VPC의 인터페이스 엔드포인트는 Amazon 네트워크를 통해 VPC 내 애플리케이션과 온프레미스 애플리케이션을 모두 Amazon S3로 라우팅할 수 있습니다.

![\[인터페이스 엔드포인트 및 AWS PrivateLink를 사용한 Amazon S3 액세스를 보여 주는 데이터 흐름 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/interface-endpoints.png)


다이어그램은 다음을 보여 줍니다.
+ 온프레미스 네트워크에서는 Direct Connect 또는 Site-to-Site VPN을 사용하여 VPC A에 연결합니다.
+ 온프레미스 및 VPC A의 애플리케이션은 엔드포인트별 DNS 이름을 사용하여 S3 인터페이스 엔드포인트를 통해 Amazon S3에 액세스합니다.
+ 온프레미스 애플리케이션은 Direct Connect(또는 Site-to-Site VPN)를 통해 VPC에서 인터페이스 엔드포인트로 데이터를 전송합니다. AWS PrivateLink는 AWS 네트워크를 통해 인터페이스 엔드포인트에서 Amazon S3로 데이터를 이동합니다.
+ VPC 애플리케이션도 인터페이스 엔드포인트로 데이터를 전송합니다. AWS PrivateLink는 AWS 네트워크를 통해 인터페이스 엔드포인트에서 Amazon S3로 데이터를 이동합니다.

### 동일한 VPC에서 게이트웨이 엔드포인트와 인터페이스 엔드포인트를 함께 사용하여 Amazon S3에 액세스
<a name="using-gateway-and-interface-endpoints"></a>

다음 다이어그램과 같이 인터페이스 엔드포인트를 생성하고 기존 게이트웨이 엔드포인트를 동일한 VPC에 유지할 수 있습니다. 이 접근법을 사용하면 VPC 내 애플리케이션이 게이트웨이 엔드포인트를 통해 Amazon S3에 계속 액세스할 수 있으며, 요금은 청구되지 않습니다. 그런 다음, 온프레미스 애플리케이션만 인터페이스 엔드포인트를 사용하여 Amazon S3에 액세스합니다. 이러한 방식으로 Amazon S3에 액세스하려면 Amazon S3에 대한 엔드포인트별 DNS 이름을 사용하도록 온프레미스 애플리케이션을 업데이트해야 합니다.

![\[게이트웨이 엔드포인트 및 인터페이스 엔드포인트를 사용한 Amazon S3 액세스를 보여 주는 데이터 흐름 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/interface-and-gateway-endpoints.png)


다이어그램은 다음을 보여 줍니다.
+ 온프레미스 애플리케이션은 엔드포인트별 DNS 이름을 사용하여 Direct Connect(또는 Site-to-Site VPN)를 통해 VPC에서 인터페이스 엔드포인트로 데이터를 전송합니다. AWS PrivateLink는 AWS 네트워크를 통해 인터페이스 엔드포인트에서 Amazon S3로 데이터를 이동합니다.
+ VPC 내 애플리케이션은 기본 리전 Amazon S3 이름을 사용하여 AWS 네트워크를 통해 Amazon S3에 연결하는 게이트웨이 엔드포인트로 데이터를 전송합니다.

게이트웨이 엔드포인트에 대한 자세한 내용은 *VPC 사용 설명서*에서 [게이트웨이 VPC 엔드포인트](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-gateway.html)를 참조하십시오.

## Amazon S3에 대한 VPC 엔드포인트 정책 생성
<a name="creating-vpc-endpoint-policy"></a>

Amazon S3에 대한 액세스를 제어하는 VPC 엔드포인트에 엔드포인트 정책을 연결할 수 있습니다. 이 정책은 다음 정보를 지정합니다.
+ 작업을 수행할 수 있는 AWS Identity and Access Management(IAM) 보안 주체.
+ 수행할 수 있는 작업 
+ 작업을 수행할 수 있는 리소스 

Amazon S3 버킷 정책을 사용하여 버킷 정책의 `aws:sourceVpce` 조건을 통해 특정 VPC 엔드포인트의 특정 버킷에 대한 액세스를 제한할 수도 있습니다. 다음 예에서는 버킷 또는 엔드포인트에 대한 액세스를 제한하는 정책을 보여줍니다.

**Topics**
+ [예제: VPC 엔드포인트에서 특정 버킷에 대한 액세스 제한](#privatelink-example-restrict-access-to-bucket)
+ [예제: VPC 엔드포인트에서 특정 계정의 버킷에 대한 액세스 제한](#privatelink-example-access-bucket-in-specific-account-only)
+ [예제: S3 버킷 정책에서 특정 VPC 엔드포인트에 대한 액세스 제한](#privatelink-example-restrict-access-to-vpc-endpoint)

### 예제: VPC 엔드포인트에서 특정 버킷에 대한 액세스 제한
<a name="privatelink-example-restrict-access-to-bucket"></a>

특정 Amazon S3 버킷에 대한 액세스만 제한하는 엔드포인트 정책을 생성할 수 있습니다. 이 정책 유형은 VPC에 버킷을 사용하는 다른 AWS 서비스가 있을 경우 유용합니다. 다음 버킷 정책은 `amzn-s3-demo-bucket1`에 대한 액세스만 제한합니다. 이 엔드포인트 정책을 사용하려면 `amzn-s3-demo-bucket1`을 실제 버킷의 이름으로 대체합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "Policy1415115909151",
  "Statement": [
    { "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket1",
                   "arn:aws:s3:::amzn-s3-demo-bucket1/*"]
    }
  ]
}
```

------

### 예제: VPC 엔드포인트에서 특정 계정의 버킷에 대한 액세스 제한
<a name="privatelink-example-access-bucket-in-specific-account-only"></a>

특정 AWS 계정의 S3 버킷에 대해서만 액세스를 제한하는 엔드포인트 정책을 생성할 수 있습니다. VPC 내의 클라이언트가 사용자가 소유하지 않은 버킷에 액세스하지 못하게 하려면 엔드포인트 정책에서 다음 명령문을 사용합니다. 다음 예시 명령문에서는 하나의 AWS 계정 ID인 *`111122223333`*이 소유한 리소스에 대한 액세스를 제한하는 정책을 생성합니다.

```
{
  "Statement": [
    {
      "Sid": "Access-to-bucket-in-specific-account-only",
      "Principal": "*",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Deny",
      "Resource": "arn:aws:s3:::*",
      "Condition": {
        "StringNotEquals": {
          "aws:ResourceAccount": "111122223333"
        }
      }
    }
  ]
}
```

**참고**  
액세스되는 리소스의 AWS 계정 ID를 지정하려면 IAM 정책에서 `aws:ResourceAccount` 또는 `s3:ResourceAccount` 키를 사용하면 됩니다. 그러나 일부 AWS 서비스는 AWS 관리형 버킷에 대한 액세스에 의존합니다. 따라서 IAM 정책에서 `aws:ResourceAccount` 또는 `s3:ResourceAccount` 키를 사용하면 이러한 리소스에 대한 액세스에도 영향을 미칠 수 있습니다.

### 예제: S3 버킷 정책에서 특정 VPC 엔드포인트에 대한 액세스 제한
<a name="privatelink-example-restrict-access-to-vpc-endpoint"></a>

다음 Amazon S3 버킷 정책은 VPC 엔드포인트 `vpce-1a2b3c4d`에서만 특정 버킷 `amzn-s3-demo-bucket2`에 대한 액세스를 허용합니다. 이 정책은 지정된 엔드포인트가 사용되지 않으면 버킷에 대한 모든 액세스를 거부합니다. `aws:sourceVpce` 조건은 엔드포인트를 지정하며, VPC 엔드포인트 리소스에 대한 Amazon 리소스 이름(ARN)을 필요로 하지 않고 엔드포인트 ID만 필요로 합니다. 이 버킷 정책을 사용하려면 `amzn-s3-demo-bucket2` 및 `vpce-1a2b3c4d`를 실제 버킷의 이름과 엔드포인트로 대체합니다.

**중요**  
특정 VPC 엔드포인트만 액세스할 수 있도록 다음 Amazon S3 버킷 정책을 적용할 경우 의도치 않게 버킷에 대한 액세스를 차단할 수 있습니다. VPC 엔드포인트에서 시작하는 연결에 대한 버킷 액세스를 특별히 제한하기 위한 버킷 정책은 버킷에 대한 모든 연결을 차단할 수 있습니다. 이 문제를 해결하는 방법에 대한 자세한 내용은 [버킷 정책의 VPC 또는 VPC 엔드포인트 ID가 올바르지 않습니다.를 참조하십시오. 버킷에 액세스할 수 있도록 정책을 수정하는 방법은 무엇입니까?](https://aws.amazon.com/premiumsupport/knowledge-center/s3-regain-access/)(*지원 지식 센터*)를 참조하세요.
다음 예제 정책을 사용하기 전에 VPC 엔드포인트 ID를 사용 사례에 적합한 값으로 바꾸세요. 그렇지 않으면 버킷에 액세스할 수 없습니다.
콘솔 요청은 지정된 VPC 종단점에서 발생하지 않으므로 이 정책은 지정된 버킷에 대한 *콘솔* 액세스를 사용 중지합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "Policy1415115909152",
  "Statement": [
    { "Sid": "Access-to-specific-VPCE-only",
      "Principal": "*",
      "Action": "s3:*",
      "Effect": "Deny",
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket2",
                   "arn:aws:s3:::amzn-s3-demo-bucket2/*"],
      "Condition": {"StringNotEquals": {"aws:sourceVpce": "vpce-1a2b3c4d"}}
    }
  ]
}
```

------

자세한 정책 예는 *VPC 사용 설명서*에서 [Amazon S3용 엔드포인트](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html#vpc-endpoints-policies-s3)를 참조하십시오.

VPC 연결에 대한 자세한 내용은 AWS 백서, [Amazon Virtual Private Cloud(VPC) 연결 옵션](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/welcome.html)에서 [네트워크와 VPC 연결 옵션](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)을 참조하십시오.

# Amazon S3에 대한 규정 준수 확인
<a name="s3-compliance"></a>

서드 파티 감사자는 다음을 포함하는 여러 AWS 규정 준수 프로그램의 일환으로 Amazon S3의 보안 및 규정 준수를 평가합니다.
+ SOC(시스템 및 조직 제어)
+ PCI DSS(지불 카드 산업 데이터 보안 표준)
+ 연방정부의 위험 및 인증 관리 프로그램(FedRAMP)
+ HIPAA(미국 건강 보험 양도 및 책임에 관한 법)

AWS는 [규정 준수 프로그램 제공 범위 내 AWS 서비스](https://aws.amazon.com/compliance/services-in-scope/) 페이지에서 특정 규정 준수 프로그램 범위 내 자주 업데이트되는 AWS 서비스의 목록을 제공합니다.

AWS Artifact를 사용하여 다운로드할 수 있는 타사 감사 보고서가 있습니다. 자세한 내용은 [AWS Artifact에서 보고서 다운로드](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)를 참조하세요.

AWS 규정 준수 프로그램에 대한 자세한 내용은 [AWS 규정 준수 프로그램](https://aws.amazon.com/compliance/programs/)을 참조하십시오.

Amazon S3 사용 시 귀하의 규정 준수 책임은 데이터의 민감도, 조직의 규정 준수 목표, 관련 법률과 규정에 따라 결정됩니다. Amazon S3 사용 시 HIPAA, PCI, FedRAMP와 같은 표준을 준수해야 하는 경우 다음과 같은 AWS의 도움말 리소스를 활용하십시오.
+ [보안 및 규정 준수 빠른 시작 안내서](https://aws.amazon.com/quickstart/?awsf.quickstart-homepage-filter=categories%23security-identity-compliance)에서는 아키텍처 고려 사항에 대해 설명하고 보안 및 규정 준수에 중점을 둔 기본 환경을 AWS에 배포하기 위한 단계를 제공합니다.
+ [HIPAA 보안 및 규정 준수를 위한 설계](https://docs.aws.amazon.com/whitepapers/latest/architecting-hipaa-security-and-compliance-on-aws/architecting-hipaa-security-and-compliance-on-aws.html)에서는 기업에서 AWS를 사용하여 HIPAA 요구 사항을 충족하는 방법을 설명합니다.
+ [AWS 규정 준수 리소스](https://aws.amazon.com/compliance/resources/)는 귀사의 산업 및 위치에 적용될 수 있는 몇몇 종류별 워크북 및 안내서를 제공합니다.
+ [AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html)를 사용하여 리소스 구성이 내부 관행, 업계 지침 및 규정을 준수하는 정도를 평가할 수 있습니다.
+ [AWS Security Hub](https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html)는 보안 업계 표준 및 모범 사례 준수 여부를 확인하는 데 도움이 되는 AWS 내 보안 상태에 대한 포괄적인 관점을 제공합니다.
+ [Object Lock으로 객체 잠금](object-lock.md)으로 특정한 유형의 도서 및 기록 정보에 WORM(write once, read many) 데이터 스토리지를 요구하는 금융 서비스 규제 기관(예: SEC, FINRA, CFTC)의 기술 요구 사항을 충족할 수 있습니다.
+ [S3 Inventory를 사용한 데이터 카탈로그화 및 분석](storage-inventory.md)를 사용하여 비즈니스, 규정 준수 및 규제 요건에 대한 객체의 복제 및 암호화 상태를 감사하고 보고할 수 있습니다.

# Amazon S3의 복원성
<a name="disaster-recovery-resiliency"></a>

AWS 글로벌 인프라는 리전 및 가용 영역을 중심으로 구축됩니다. AWS 리전에서는 물리적으로 분리되고 격리된 다수의 가용 영역을 제공하며 이러한 가용 영역은 짧은 대기 시간, 높은 처리량 및 높은 중복성을 갖춘 네트워크에 연결되어 있습니다. 이러한 가용 영역은 응용 프로그램과 데이터베이스를 설계하고 운영하는 효과적인 방법을 제공합니다. 가용 영역은 기존의 단일 또는 다중 데이터 센터 인프라보다 가용성, 내결함성, 확장성이 뛰어납니다. 특히 데이터를 더 멀리 복제해야 하는 경우, 여러 AWS 리전의 버킷 간에 객체를 비동기식으로 자동 복사할 수 있게 해주는 [리전 내 및 리전 간 객체 복제](replication.md) 기능을 사용할 수 있습니다.

AWS 리전마다 여러 가용 영역이 있습니다. 내결함성과 짧은 지연 시간을 위해 같은 리전에 있는 여러 가용 영역에 애플리케이션을 배포할 수 있습니다. 가용 영역은 빠른 프라이빗 광섬유 네트워킹으로 서로 연결되어 있어 중단 없이 가용 영역 간에 자동으로 장애 조치가 이루어지는 애플리케이션을 손쉽게 설계할 수 있습니다.

AWS 리전 및 가용 영역에 대한 자세한 내용은 [AWS 글로벌 인프라](https://aws.amazon.com/about-aws/global-infrastructure/)를 참조하십시오.

AWS 글로벌 인프라 외에도 Amazon S3는 데이터 복원성과 백업 요구 사항을 지원하는 다양한 기능을 제공합니다.

**수명 주기 구성**  
수명 주기 구성은 Amazon S3가 객체 그룹에 적용되는 작업을 정의하는 일련의 규칙입니다. 수명 주기 구성 규칙을 사용하면 Amazon S3가 객체를 더 저렴한 스토리지 클래스로 전환하거나 보관하거나 삭제하도록 유도할 수 있습니다. 자세한 내용은 [객체 수명 주기 관리](object-lifecycle-mgmt.md) 섹션을 참조하세요.

**버전 관리**  
버전 관리는 동일 버킷 내에 여러 개의 객체 변형을 보유하는 것을 의미합니다. 버전 관리를 사용하면 Amazon S3 버킷에 저장된 모든 버전의 모든 객체를 보존, 검색 및 복원할 수 있습니다. 또한 의도치 않은 사용자 작업 및 애플리케이션 장애로부터 쉽게 복구할 수 있습니다. 자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하세요.

**S3 객체 잠금**  
S3 객체 잠금을 사용하면 *write once, read many*(WORM) 모델을 사용하여 객체를 저장할 수 있습니다. S3 객체 잠금을 사용하면 고정된 시간 동안 또는 무기한으로 객체를 삭제하거나 덮어쓰지 않도록 할 수 있습니다. S3 객체 잠금을 사용하여 WORM 스토리지가 필요한 규제 요구 사항을 충족하거나 객체 변경 및 삭제에 대한 보호 계층을 추가할 수 있습니다. 자세한 내용은 [Object Lock으로 객체 잠금](object-lock.md) 섹션을 참조하세요.

**스토리지 클래스**  
Amazon S3는 워크로드 요구 사항에 따라 선택할 수 있는 다양한 스토리지 클래스를 제공합니다. S3 Standard-IA 및 S3 One Zone-IA 스토리지 클래스는 한 달에 한 번 정도 액세스하며 밀리초 단위의 액세스가 필요한 데이터용으로 설계되었습니다. S3 Glacier Instant Retrieval 스토리지 클래스는 분기에 한 번 정도 액세스하며 밀리초 단위의 액세스가 필요한 수명이 긴 아카이브 데이터용으로 설계되었습니다. 백업과 같이 즉각적인 액세스가 필요하지 않은 아카이브 데이터의 경우 S3 Glacier Flexible Retrieval 또는 S3 Glacier Deep Archive 스토리지 클래스를 사용할 수 있습니다. 자세한 내용은 [Amazon S3 스토리지 클래스 이해 및 관리](storage-class-intro.md) 섹션을 참조하세요.

다음 보안 모범 사례에서도 복원성을 다룹니다.
+ [Enable versioning](security-best-practices.md#versioning)
+ [Consider Amazon S3 cross-region replication](security-best-practices.md#cross-region)
+ [Identify and audit all your Amazon S3 buckets](security-best-practices.md#audit)

## Amazon S3 백업의 암호화
<a name="backup-encryption"></a>

Amazon S3를 사용하여 백업을 저장하는 경우 백업의 암호화는 해당 버킷의 구성에 따라 달라집니다. Amazon S3를 사용하면 S3 버킷의 기본 암호화 동작을 설정할 수 있습니다. 버킷에 저장되는 모든 객체를 암호화하도록 버킷에 대한 기본 암호화를 설정할 수 있습니다. 기본 암호화는 AWS KMS(SSE-KMS)에 저장된 키를 지원합니다. 자세한 내용은 [Amazon S3 버킷에 대한 기본 서버 측 암호화 동작 설정](bucket-encryption.md) 섹션을 참조하세요.

버전 관리 및 객체 잠금에 대한 자세한 내용은 다음 주제를 참조하십시오. [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) [Object Lock으로 객체 잠금](object-lock.md) 

# Amazon S3의 인프라 보안
<a name="network-isolation"></a>

관리형 서비스인 Amazon S3는 [AWS Well-Architected Framework](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/welcome.html)의 보안 원칙에 설명된 AWS 글로벌 네트워크 보안 절차로 보호됩니다.

네트워크를 통한 Amazon S3 액세스는 AWS에서 게시한 API를 통해 이루어집니다. 클라이언트가 전송 계층 보안(TLS) 1.2를 지원해야 합니다. TLS 1.3 및 하이브리드 양자 내성 키 교환도 지원하는 것이 좋습니다. AWS에서 블로그 게시물 및 연구 논문에 대한 링크와 양자 내성 암호화에 대해 알아보려면 [AWS의 양자 내성 암호화](https://aws.amazon.com/security/post-quantum-cryptography/)를 참조하세요.

**참고**  
TLS 1.3은 AWS PrivateLink for Amazon S3 및 다중 리전 액세스 포인트를 제외한 모든 S3 엔드포인트에서 지원됩니다.

클라이언트는 DHE(Ephemeral Diffie-Hellman) 또는 ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)와 같은 PFS(전달 완전 보안)가 포함된 암호 제품군도 지원해야 합니다. 또한, 유효한 자격 증명을 제공해야 하는 AWS 서명 V4 또는 AWS 서명 V2를 사용하여 요청에 서명해야 합니다.

네트워크 위치에서 이 API를 호출할 수 있습니다. 다만 Amazon S3는 원본 IP 주소 기반의 제한을 포함할 수 있는 리소스 기반 액세스 정책을 지원합니다. Amazon S3 버킷 정책을 사용하여 특정 가상 프라이빗 클라우드(VPC) 엔드포인트 또는 특정 VPC의 버킷에 대한 액세스를 제어할 수도 있습니다. 그러면 AWS 네트워크의 특정 VPC에서만 특정 Amazon S3 버킷에 대한 네트워크 액세스가 효과적으로 격리됩니다. 자세한 내용은 [버킷 정책을 사용하여 VPC 엔드포인트에서 액세스 제어](example-bucket-policies-vpc-endpoint.md) 섹션을 참조하세요.

다음 보안 모범 사례에서도 Amazon S3의 인프라 보안을 다룹니다.
+ [Consider VPC endpoints for Amazon S3 access](security-best-practices.md#end-points)
+ [Identify and audit all your Amazon S3 buckets](security-best-practices.md#audit)

# Amazon S3의 구성 및 취약성 분석
<a name="vulnerability-analysis-and-management"></a>

AWS가 게스트 운영 체제(OS), 데이터베이스 패치, 방화벽 구성, 재해 복구 등의 기본 보안 작업을 처리합니다. 적합한 제3자가 이 절차를 검토하고 인증하였습니다. 자세한 내용은 다음 리소스를 참조하세요.
+ [Amazon S3에 대한 규정 준수 확인](s3-compliance.md)
+ [공동 책임 모델](https://aws.amazon.com/compliance/shared-responsibility-model/)
+ [Amazon Web Services: 보안 프로세스의 개요](https://d0.awsstatic.com/whitepapers/Security/AWS_Security_Whitepaper.pdf)

다음 보안 모범 사례에서도 Amazon S3의 구성 및 취약성 분석을 다룹니다.
+ [Identify and audit all your Amazon S3 buckets](security-best-practices.md#audit)
+ [ 사용 설정AWS Config](security-best-practices.md#config)

# 액세스 관리
<a name="security-access-management"></a>

Amazon S3는 다양한 액세스 관리 도구를 제공합니다. 다음은 이러한 기능 및 도구의 목록입니다. 이러한 액세스 관리 도구가 모두 필요한 것은 아니지만, Amazon S3 버킷, 객체 및 기타 [S3 리소스](access-management.md#access-management-resources)에 대한 액세스 권한을 부여하려면 하나 이상을 사용해야 합니다. 이러한 도구를 올바르게 적용하면 의도한 사용자만 리소스에 액세스하도록 할 수 있습니다.

가장 일반적으로 사용되는 액세스 관리 도구는 **액세스 정책입니다. 액세스 정책은 AWS 리소스에 연결된 **리소스 기반 정책일 수 있습니다(예: 버킷의 버킷 정책). 액세스 정책은 IAM 사용자, 그룹 또는 역할과 같은 AWS Identity and Access Management(IAM) ID에 연결된 **ID 기반 정책일 수도 있습니다. 액세스 정책은 누가 무엇에 액세스 할 수 있는지를 나타냅니다. AWS 계정, IAM 사용자, 그룹, 역할에 리소스에서 작업을 수행할 수 있는 권한을 부여하는 액세스 정책을 작성하세요. 예를 들어, 다른 AWS 계정에서 내 버킷에 객체를 업로드할 수 있도록 다른 계정에 `PUT Object` 권한을 부여할 수 있습니다.

Amazon S3에서 제공되는 액세스 관리 도구는 다음과 같습니다. Amazon S3 액세스 제어에 대한 보다 포괄적인 가이드는 [Amazon S3의 액세스 제어](access-management.md) 섹션을 참조하세요.

**버킷 정책**  
Amazon S3 버킷 정책은 특정 버킷에 연결된 JSON 형식 [AWS Identity and Access Management(IAM) 리소스 기반 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)입니다. 버킷 정책을 사용하여 다른 AWS 계정 또는 IAM ID에 버킷과 버킷에 포함된 객체에 대한 권한을 부여합니다. 버킷 정책을 사용하면 많은 S3 액세스 관리 사용 사례를 충족할 수 있습니다. 버킷 정책을 사용하면 버킷 액세스를 개인화하여 승인된 ID만 리소스에 액세스하고 리소스 내에서 작업을 수행하도록 할 수 있습니다. 자세한 내용은 [Amazon S3의 버킷 정책](bucket-policies.md) 섹션을 참조하세요.

**자격 증명 기반 정책**  
ID 기반 또는 IAM 사용자 정책은 일종의 [AWS Identity and Access Management(IAM) 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)입니다. ID 기반 정책은 AWS 계정의 IAM 사용자, 그룹 또는 역할에 연결된 JSON 형식의 정책입니다. ID 기반 정책을 사용하여 버킷이나 객체에 대한 IAM ID 액세스 권한을 부여할 수 있습니다. 내 계정으로 IAM 사용자, 그룹, 역할을 만들고 액세스 정책을 연결할 수 있습니다. 그런 다음 Amazon S3 리소스를 포함한 AWS 리소스에 대한 액세스 권한을 부여할 수 있습니다. 자세한 내용은 [Amazon S3의 ID 기반 정책](security_iam_id-based-policy-examples.md) 섹션을 참조하세요.

**S3 Access Grants**  
S3 Access Grants를 사용하여 회사 ID 디렉터리의 ID(예: Active Directory) 및 AWS Identity and Access Management(IAM) ID 모두에 대해 Amazon S3 데이터에 대한 액세스 권한을 생성할 수 있습니다. S3 Access Grants는 대규모로 데이터 권한을 관리하는 데 도움이 됩니다. 또한 S3 Access Grants는 AWS CloudTrail의 S3 데이터에 액세스하는 데 사용된 최종 사용자 ID와 애플리케이션을 로깅합니다. 이를 통해 S3 버킷의 데이터에 대한 모든 액세스에 대해 최종 사용자 ID까지 상세한 감사 기록이 제공됩니다. 자세한 내용은 [S3 Access Grants를 통한 액세스 관리](access-grants.md) 섹션을 참조하세요.

**액세스 포인트**  
Amazon S3 액세스 포인트는 S3의 공유 데이터세트를 사용하는 애플리케이션에 대한 대규모 데이터 액세스 관리를 간소화합니다. 액세스 포인트는 버킷에 연결된 명명된 네트워크 엔드포인트입니다. 액세스 포인트를 사용하여 객체 업로드 및 검색과 같은 S3 객체 작업을 수행할 수 있습니다. 버킷에는 최대 1만 개의 액세스 포인트가 연결될 수 있으며, 각 액세스 포인트에 대해 고유한 권한과 네트워크 제어를 적용하여 S3 객체에 대한 액세스를 세부적으로 제어할 수 있습니다. S3 액세스 포인트는 동일한 계정 또는 다른 신뢰할 수 있는 계정의 버킷과 연결할 수 있습니다. 액세스 포인트 정책은 기본 버킷 정책과 함께 평가되는 리소스 기반 정책입니다. 자세한 내용은 [액세스 포인트로 공유 데이터세트에 대한 액세스 관리](access-points.md) 섹션을 참조하세요.

**ACL(액세스 제어 목록)**  
ACL은 피부여자와 그에 부여된 권한을 식별하는 권한 부여 목록입니다. ACL은 다른 AWS 계정에 기본적인 읽기 또는 쓰기 권한을 부여합니다. ACL은 Amazon S3별 XML 스키마를 사용합니다. ACL은 일종의 [AWS Identity and Access Management(IAM) 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)입니다. 객체 ACL은 객체에 대한 액세스를 관리하는 데 사용되고, 버킷 ACL은 버킷에 대한 액세스를 관리하는 데 사용됩니다. 버킷 정책의 경우 전체 버킷에 적용되는 하나의 버킷 정책이 있지만 객체 ACL은 객체별로 지정됩니다. 각 객체에 대해 액세스를 개별적으로 제어해야 하는 상황을 제외하고는 ACL을 비활성화한 채로 두는 것이 좋습니다. ACL 사용에 대한 자세한 내용은 [객체 소유권 제어 및 버킷에 대해 ACL 사용 중지](about-object-ownership.md) 섹션을 참조하세요.

**주의**  
Amazon S3의 최신 사용 사례 대부분은 ACL을 사용할 필요가 없습니다.

**객체 소유권**  
객체에 대한 액세스를 관리하려면 객체 소유자여야 합니다. 객체 소유권 버킷 수준 설정을 사용하여 버킷에 업로드되는 객체의 소유권을 제어할 수 있습니다. 또한 ACL을 활성화하는 데도 객체 소유권을 사용합니다. 기본적으로 객체 소유권은 *버킷 소유자 적용 설정*으로 설정되며 모든 ACL이 비활성화되어 있습니다. ACL이 비활성화되면 버킷 소유자는 버킷의 모든 객체를 소유하고 데이터에 대한 액세스를 독점적으로 관리합니다. 액세스를 관리하기 위해 버킷 소유자는 정책이나 다른 액세스 관리 도구(ACL 제외)를 사용합니다. 자세한 내용은 [객체 소유권 제어 및 버킷에 대해 ACL 사용 중지](about-object-ownership.md) 섹션을 참조하세요.

Amazon S3 액세스 제어에 대한 보다 포괄적인 가이드와 추가 모범 사례는 [Amazon S3의 액세스 제어](access-management.md) 섹션을 참조하세요.

# Amazon Simple Storage Service 데이터 인벤토리
<a name="s3-data-inventory"></a>

## Amazon S3
<a name="s3-intro"></a>

Amazon S3는 AWS 클라우드에서 확장 가능한 객체 스토리지를 제공합니다. 이로써 웹을 통해 어디서든 원하는 양의 데이터를 저장하고 검색할 수 있습니다. 고유한 아키텍처를 기반으로 하는 S3는 99.999999999%의 데이터 내구성을 초과하도록 설계되었습니다. 또한 S3는 기본적으로 최소 3개의 가용 영역에 데이터를 중복 저장하여 광범위한 재해에 대한 기본적인 복원력을 제공합니다. 고객은 단일 가용 영역에 데이터를 저장하여 스토리지 비용이나 지연 시간을 최소화하거나, 전체 데이터 센터의 영구 손실에 대한 복원력을 갖추기 위해 여러 가용 영역에 저장하거나, 지리적 복원력 요구 사항을 충족하기 위해 여러 AWS 리전에 저장할 수 있습니다.주요 특징

지리적 위치  
Amazon S3는 전 세계의 여러 곳에서 호스팅되고 있습니다. 고객에게 가까운 데이터 위치를 선택할 수 있습니다.

버킷  
버킷은 Amazon S3에 저장된 객체에 대한 컨테이너입니다. 모든 객체는 버킷에 포함됩니다.

개체  
객체는 Amazon S3에 저장되는 기본 개체입니다. 객체는 객체 데이터와 메타데이터로 구성됩니다.

스토리지 클래스  
Amazon S3는 다양한 사용 사례에 최적화된 여러 스토리지 클래스를 제공합니다.

스토리지 관리  
Amazon S3에는 비용을 관리하고 규정 준수 요구 사항을 충족하는 데 사용할 수 있는 스토리지 관리 기능이 있습니다.

액세스 관리 및 보안  
Amazon S3는 버킷 및 객체에 대한 액세스 감사 및 관리 기능을 제공합니다.

## 지리적 위치
<a name="s3-geographic-location"></a>

Amazon S3는 전 세계 모든 AWS 리전에서 사용할 수 있습니다. 각 리전은 개별 지리 영역입니다.

### 중요한 이유
<a name="s3-geographic-location-why"></a>

데이터를 저장할 위치를 결정한 후 필요에 따라 기능적으로 동등한 스토리지를 같은 위치에 배포할지 또는 다른 위치에 배포할지 결정할 수 있습니다.

### 모든 리전의 Amazon S3 버킷 요약을 보는 방법
<a name="s3-geographic-location-how"></a>

다음 AWS CLI 명령을 사용합니다.

```
   aws s3api list-buckets /
    --max-items 100 / 
    --page-size 100
```

자세한 내용은 AWS CLI 명령 참조의 [list-buckets](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-buckets.html)를 참조하세요.

## 버킷
<a name="s3-buckets"></a>

Amazon S3 버킷은 객체의 컨테이너입니다. 각 버킷은 AWS 전체에서 고유한 이름을 가집니다. Amazon S3는 범용 버킷, 디렉터리 버킷, 테이블 버킷, 벡터 버킷 등 네 가지 유형을 지원합니다. 각 버킷 유형은 다양한 사용 사례에 맞는 고유한 기능 세트를 제공합니다. 다양한 버킷 유형에 대한 자세한 내용은 Amazon S3 사용 설명서의 [버킷](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html#BasicsBucket) 섹션을 참조하세요.

### 이것이 중요한 이유
<a name="s3-buckets-why"></a>

버킷을 나열한 후 다양한 버킷 구성 설정을 검토하여 기능적으로 동등한 스토리지 시스템의 버킷 설정을 검증할 수 있습니다.

### 버킷 구성을 나열하는 방법
<a name="s3-buckets-how"></a>

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

자세한 내용은 AWS CLI 명령 참조의 [get-bucket-versioning](https://docs.aws.amazon.com/cli/latest/reference/s3api/get-bucket-versioning.html) 섹션을 참조하세요.

## 개체
<a name="s3-objects"></a>

객체는 Amazon S3에 저장되는 기본 개체입니다. 각 객체는 데이터, 키(이름), 메타데이터로 구성됩니다.

### 이것이 중요한 이유
<a name="s3-objects-why"></a>

객체 특성을 파악하면 기능적으로 동등한 시스템에서 동등한 스토리지 용량 및 성능 요구 사항을 계획하는 데 도움이 됩니다.

### 객체 및 속성을 나열하는 방법
<a name="s3-objects-how"></a>

```
aws s3api list-objects-v2 --bucket amzn-s3-demo-bucket1 /
    --query 'Contents[].{Key: Key, Size: Size, LastModified: LastModified}'
```

자세한 내용은 AWS CLI 명령 참조에서 [list-objects-v2](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects-v2.html)를 참조하세요.

## 스토리지 클래스
<a name="s3-storage-classes"></a>
+ Amazon S3 Standard
+ Amazon S3 Intelligent Tiering
+ Amazon S3 Standard-IA
+ Amazon S3 One Zone-IA
+ Amazon S3 Glacier Instant Retrieval
+ Amazon S3 Glacier Flexible Retrieval
+ Amazon S3 Glacier Deep Archive
+ Amazon S3 Express One Zone

### 이것이 중요한 이유
<a name="s3-storage-classes-why"></a>

스토리지 클래스 사용량을 파악하면 기능적으로 동등한 시스템에서 적절한 스토리지 계층을 결정하는 데 도움이 됩니다. 자세한 내용은 Amazon S3 사용 설명서의 [Amazon S3 스토리지 클래스 이해 및 관리](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html) 섹션을 참조하세요.

### 스토리지 클래스 선택 및 사용량을 검토하는 방법
<a name="s3-storage-classes-how"></a>

Amazon S3 Storage Lens를 사용하여 스토리지 클래스 선택 및 사용량을 검토할 수 있습니다. 자세한 내용은 Amazon S3 사용 설명서의 [Amazon S3 스토리지 클래스 이해 및 관리](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html) 섹션을 참조하세요.

## 스토리지 관리
<a name="s3-storage-management"></a>

### 중요한 이유
<a name="s3-storage-management-why"></a>

스토리지 관리 사용량을 파악하면 기능적으로 동등한 시스템에서 비용을 관리하고 규정 준수 요구 사항을 충족할 수 있는 동등한 기능 계획을 세우는 데 도움이 됩니다.

### 스토리지 관리 기능 선택 및 사용량을 검토하는 방법
<a name="s3-storage-management-how"></a>

Amazon S3 Storage Lens를 사용하여 스토리지 관리 기능의 사용량을 검토할 수 있습니다. 자세한 내용은 Amazon S3 사용 설명서의 [Amazon S3 Storage Lens 지표 용어집](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html)을 참조하세요.

## 액세스 관리 및 보안
<a name="s3-access-management"></a>

### 이것이 중요한 이유
<a name="s3-access-management-why"></a>

액세스 관리 및 보안 설정을 파악하면 기능적으로 동등한 시스템에서 액세스 및 보안 요구 사항을 관리하기 위한 동등한 기능 계획을 세우는 데 도움이 됩니다.

### 액세스 관리 및 보안 설정을 검토하는 방법
<a name="s3-access-management-how"></a>

버킷을 나열한 후 다양한 버킷 구성 설정을 검토하여 기능적으로 동등한 스토리지 시스템의 버킷 보안 및 액세스 설정을 검증할 수 있습니다.

```
aws s3api get-public-access-block --bucket amzn-s3-demo-bucket1 
aws s3api get-bucket-acl --bucket amzn-s3-demo-bucket1 
aws s3api get-bucket-encryption --bucket amzn-s3-demo-bucket1
aws s3api get-bucket-policy --bucket amzn-s3-demo-bucket1
```

## 데이터 전송
<a name="s3-data-transfer"></a>

다음과 같은 여러 가지 방법으로 Amazon S3에서 데이터를 전송할 수 있습니다.
+ AWS CLI
+ AWS SDK
+ Amazon S3 REST API
+ 타사 도구

### AWS CLI 사용 예제
<a name="s3-data-transfer-examples"></a>

전체 버킷을 다운로드하는 방법

```
aws s3 sync s3://amzn-s3-demo-bucket1 /local/path
```

자세한 내용은 AWS CLI 명령 참조의 [동기화](https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html) 섹션을 참조하세요.

특정 객체를 다운로드하는 방법

```
aws s3 cp s3://amzn-s3-demo-bucket1/path/to/object /local/path
```

자세한 내용은 AWS CLI 명령 참조의 [cp](https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html) 섹션을 참조하세요.

## 관련 리소스
<a name="s3-related-resources"></a>

다음은 Amazon S3의 추가 특징입니다.
+ [Amazon S3의 액세스 제어](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-management.html)
+ [Amazon S3의 보안](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security.html)
+ [Amazon S3의 데이터 보호](https://docs.aws.amazon.com/AmazonS3/latest/userguide/data-protection.html)
+ [Amazon S3의 로깅 및 모니터링](https://docs.aws.amazon.com/AmazonS3/latest/userguide/monitoring-overview.html)