메뉴
Amazon Simple Storage Service
개발자 안내서 (API 버전 2006-03-01)

AWS SDK for Java를 사용하여 서버 측 암호화 지정

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

멀티파트 업로드 API를 사용하여 객체를 업로드할 때도 서버 측 암호화를 요청할 수 있습니다.

  • 상위 수준 멀티파트 업로드 API를 사용하는 경우 TransferManager 메서드를 사용하여 객체를 업로드할 때 객체에 서버 측 암호화를 적용합니다. ObjectMetadata를 파라미터로 사용하는 모든 업로드 메서드를 사용할 수 있습니다. 자세한 내용은 멀티파트 업로드용 AWS Java SDK(상위 수준 API) 사용 단원을 참조하십시오.

  • 하위 수준 멀티파트 업로드 API를 사용하는 경우 멀티파트 업로드를 시작할 때 서버 측 암호화를 지정합니다. InitiateMultipartUploadRequest.setObjectMetadata() 메서드를 호출하여 ObjectMetadata 속성을 추가합니다. 자세한 내용은 파일 업로드 단원을 참조하십시오.

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

다음 예제에서는 AWS SDK for Java를 사용하여 서버 측 암호화를 설정하는 방법을 보여줍니다. 이 예제에서는 다음 작업을 수행하는 방법을 설명합니다.

  • 서버 측 암호화를 사용하여 새 객체 업로드

  • 객체의 사본을 만들어 객체의 암호화 상태 변경(이 예제에서는 이전에 암호화되지 않은 객체를 암호화함)

  • 객체의 암호화 상태 확인

서버 측 암호화에 대한 자세한 정보는 REST API를 사용하여 서버 측 암호화 지정 단원을 참조하십시오. 실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 Amazon S3 Java 코드 예제 테스트 단원을 참조하십시오.

import java.io.ByteArrayInputStream; import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; 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.CopyObjectRequest; import com.amazonaws.services.s3.model.CopyObjectResult; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.PutObjectResult; public class SpecifyServerSideEncryption { public static void main(String[] args) { String clientRegion = "*** Client 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"; // Specify server-side encryption. ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(objectContent.length()); objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION); PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName, new ByteArrayInputStream(objectContent.getBytes()), 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); } }