Amazon Web Services 한국 블로그

Amazon S3, 신규 객체에 대한 기본 데이터 무결성 보호 기능 출시

AWS에서는 대부분의 새로운 기능은 고객의 직접적인 피드백을 기반으로 합니다. 2년 전 Jeff는 Amazon S3에 저장된 객체가 사용자가 전송한 것과 정확히 일치하는지 확인하기 위한 추가 체크섬 알고리즘과 선택적 클라이언트 측 체크섬 계산을 발표했습니다. 저장된 객체가 사용자가 전송한 객체라는 확신을 줄 수 있기 때문에 이 추가 검증이 마음에 든다고 말씀하셨습니다. 또한 이러한 추가 인증을 자동으로 활성화하여 추가 코드를 개발하지 않아도 되는 것이 좋겠다고 말씀하셨습니다.

오늘부터 객체를 업로드할 때 Amazon Simple Storage Service(Amazon S3)의 기본 동작을 업데이트합니다. 이제 Amazon S3는 기존 내구성 상태를 기반으로 데이터가 네트워크를 통해 애플리케이션에서 S3 버킷으로 올바르게 전송되는지 자동으로 확인합니다.

Amazon S3는 99.999999999%의 데이터 내구성(, 11개의 9)을 제공하도록 설계되었습니다. Amazon S3에서는 객체가 여러 스토리지 디바이스에 기록되기 전에 서버에 도달할 때 체크섬을 계산하여 객체 업로드의 무결성을 항상 확인했습니다. 데이터가 Amazon S3에 저장되면 저장 데이터에 대한 정기적인 무결성 검사를 통해 시간 경과에 따른 데이터 내구성을 지속적으로 모니터링합니다. 또한 Amazon S3는 데이터의 이중화를 적극적으로 모니터링하여 객체가 여러 스토리지 디바이스의 동시 장애를 견딜 수 있는지 확인할 수 있습니다.

하지만 데이터가 서버에 도달하기 전에 퍼블릭 인터넷을 통과하기 때문에 여전히 무결성 위험에 직면할 수 있습니다. 관리하지 않는 네트워크의 하드웨어 결함 또는 클라이언트 소프트웨어 버그와 같은 문제로 인해 Amazon S3에서 데이터를 검증하기 전에 데이터가 손상되거나 손실될 수 있습니다. 이전에는 PutObject 또는 UploadPart 요청과 함께 미리 계산된 자체 체크섬을 제공하여 무결성 보호를 확장할 수 있었습니다. 하지만 이를 위해서는 체크섬을 생성하고 추적하기 위한 도구와 애플리케이션을 구성해야 하는데, Amazon S3에 객체를 업로드하는 모든 클라이언트 애플리케이션에서 일관되게 구현하기가 복잡할 수 있습니다.

새로운 기본 동작은 애플리케이션을 변경할 필요 없이 기존 데이터 무결성 보호를 기반으로 합니다. 또한 새 체크섬은 객체의 메타데이터에 저장되므로 언제든지 무결성 검증을 위해 액세스할 수 있습니다.

자동 클라이언트 측 무결성 보호
Amazon S3는 이제 기본적으로 클라이언트 측 애플리케이션까지 데이터 무결성 보호를 확장합니다. AWS SDK의 최신 버전은 업로드할 때마다 순환 중복 검사(CRC) 기반 체크섬을 자동으로 계산하여 Amazon S3로 전송합니다. Amazon S3는 서버 측에서 체크섬을 독립적으로 계산하고 제공된 값과 비교하여 검증한 후 객체와 해당 체크섬을 객체의 메타데이터에 안정적으로 저장합니다.

클라이언트 애플리케이션이 CRC 체크섬을 전송하지 않는 경우(이전 버전의 SDK를 사용하거나 애플리케이션 사용자 지정 코드를 아직 업데이트하지 않은 경우) Amazon S3는 어쨌든 CRC 기반 체크섬을 계산하고 나중에 참조할 수 있도록 객체 메타데이터에 저장합니다. 나중에 저장된 CRC를 사용자 측에서 계산한 CRC와 비교하여 네트워크 전송이 올바른지 확인할 수 있습니다.

이 새로운 기능은 최신 버전의 AWS SDK, AWS Command Line Interface(AWS CLI)AWS Management Console의 새로운 업로드에 대한 자동 체크섬 계산 및 검증을 제공합니다. 또한 언제든지 객체의 메타데이터에 저장된 체크섬을 확인할 수 있습니다. 새로운 기본 데이터 무결성 보호는 기존 CRC32 및 CRC32C 알고리즘 또는 새로운 CRC64NVME 알고리즘을 사용합니다. 또한 Amazon S3는 개발자에게 싱글파트 및 멀티파트 업로드 전반에서 일관된 전체 객체 체크섬을 제공합니다.

파일을 여러 파트로 업로드할 때 SDK는 각 파트의 체크섬을 계산합니다. Amazon S3는 이러한 체크섬을 사용하여 UploadPart API를 통해 각 파트의 무결성을 검증합니다. 또한 S3는 CompleteMultipartUpload API를 직접적으로 호출할 때 전체 파일의 크기와 체크섬을 검증합니다.

CreateMultiPartUpload API에는 사용할 체크섬 유형을 지정할 수 있는 새로운 HTTP 헤더인 x-amz-checksum-type이 도입되었습니다. 전체 객체 체크섬(모든 개별 파트의 체크섬을 결합하여 계산) 또는 복합 체크섬을 선택할 수 있습니다.

전체 객체 체크섬은 나중에 참조할 수 있도록 객체 메타데이터와 함께 저장됩니다. 이 새로운 보호 기능은 서버 측 암호화와 원활하게 작동합니다. 업로드, 멀티파트 업로드, 다운로드 및 암호화 모드 전반의 일관된 동작은 클라이언트 측 무결성 검사를 간소화합니다. 전체 객체 체크섬을 사용하여 무결성을 검증하고 나중에 사용할 수 있도록 저장하면 애플리케이션을 간소화하는 데 도움이 될 수 있습니다.

이제 작동하는 모습을 살펴보겠습니다.
이 추가 무결성 보호 사용을 시작하려면 AWS SDK 또는 AWS CLI의 최신 버전으로 업데이트하세요. 새로운 무결성 보호를 활성화하기 위해 코드를 변경할 필요가 없습니다.

사례 1: 이제 Amazon S3는 체크섬 없이 객체를 업로드할 때 서버 측 객체에 체크섬 연결

S3 버킷에 콘텐츠를 업로드하고 S3 버킷에서 콘텐츠를 다운로드하는 간단한 Python 스크립트를 작성했습니다. Amazon S3 안팎으로 전송되는 실제 HTTP 헤더를 볼 수 있도록 최대 로깅 세부 수준을 활성화했습니다.

import boto3
import logging

BUCKET_NAME="aws-news-blog-20241111"
CONTENT='Hello World!'
OBJECT_NAME='test.txt'

# Enable debug logging for boto3 and botocore to stdout (this is verbose !!!)
logging.basicConfig(level=logging.DEBUG)

# create a s3 client
client = boto3.client('s3')

# put an object
client.put_object(Bucket=BUCKET_NAME, Key=OBJECT_NAME, Body=CONTENT)

# get the object 
response = client.get_object(Bucket=BUCKET_NAME, Key=OBJECT_NAME)
print(response['Body'].read().decode('utf-8'))

이 데모의 첫 번째 단계에서는 클라이언트 측에서 CRC 체크섬을 계산하지 않는 이전 AWS SDK for Python을 사용합니다. 그럼에도 불구하고 Amazon S3는 이제 객체를 수신할 때 계산한 체크섬으로 응답한다는 것을 알 수 있습니다.

S3 응답:
{
    ...
    "x-amz-checksum-crc64nvme": "AuUcyF784aU=",
    "x-amz-checksum-type": "FULL_OBJECT",
    ...
}

사례 2: 새 체크섬 유형인 CRC64NVME 체크섬을 수동으로 미리 계산하여 업로드

최신 버전의 AWS SDK를 사용할 수 있는 옵션이 없거나 자체 코드를 사용하여 S3 버킷에 객체를 업로드하는 경우 체크섬을 계산하여 PutObject API 요청에서 전송할 수 있습니다. Amazon S3로 콘텐츠를 전송하기 전에 콘텐츠의 체크섬을 계산하는 방법은 다음과 같습니다. 이 코드를 간단히 설명하기 위해 저는 새로운 AWS SDK for Python에서 제공되는 체크섬 패키지를 사용합니다.

from awscrt import checksums
import base64

checksum = checksums.crc64nvme("Hello World!")
checksum_bytes = checksum.to_bytes(8, byteorder='big')  # CRC64 is 8 bytes
checksum_base64 = base64.b64encode(checksum_bytes)
print(checksum_base64)

그리고 코드를 실행해 보면 CRC64NVME 체크섬이 이전 단계에서 Amazon S3가 반환한 것과 동일하다는 것을 알 수 있습니다.

$ python crc.py
b'AuUcyF784aU='

PutObject API 직접 호출의 일환으로 이 체크섬을 제공할 수 있습니다.

response = s3.put_object(
    Bucket=BUCKET_NAME,
    Key=OBJECT_NAME,
    Body=b'Hello World!',
    ChecksumAlgorithm='CRC64NVME', 
    ChecksumCRC64NVME=checksum_base64
)

사례 3: 새 SDK가 클라이언트 측에서 체크섬 계산

이제 업로드 및 다운로드 스크립트를 다시 실행합니다. 이번에는 AWS SDK for Python의 최신 버전을 사용합니다. 이제 SDK가 요청에 CRC 헤더를 보내는 것을 확인했습니다. 응답에는 체크섬도 포함됩니다. 요청과 응답에서 버전을 쉽게 비교하여 수신한 객체가 제가 보낸 객체인지 확인할 수 있습니다.

REQUEST:
{
    ...
    "x-amz-checksum-crc64nvme": "AuUcyF784aU=",
    "x-amz-checksum-type": "FULL_OBJECT",
    ... 
}

언제든지 객체 체크섬을 요청하여 HeadObject 또는 GetObject API를 통해 로컬 복사본의 무결성을 검증할 수 있습니다.

 get_response = s3.get_object(
        Bucket=BUCKET_NAME,
        Key=OBJECT_NAME,
        ChecksumMode='ENABLED'
    )

응답 객체에는 HTTPHeaders 필드의 체크섬이 포함되어 있습니다.

{
...
    "x-amz-checksum-crc64nvme": "AuUcyF784aU=",
    "x-amz-checksum-type": "FULL_OBJECT",
...
}

사례 4: 새로운 CRC 기반 전체 객체 체크섬을 사용하여 멀티파트 업로드

CreateMultipartUpload, UploadPartCompleteMultipartUpload API를 사용하여 대형 객체를 업로드하는 경우 최신 버전의 SDK가 자동으로 체크섬을 계산합니다.

알려진 콘텐츠 체크섬을 사용하여 데이터의 무결성을 검증하려는 경우 멀티파트 업로드에 대한 CRC 기반 전체 객체 체크섬을 미리 계산하여 클라이언트 측 도구를 단순화할 수 있습니다. 멀티파트 업로드에 전체 객체 체크섬을 사용하면 객체를 업로드할 때 더 이상 파트 수준의 체크섬을 추적할 필요가 없습니다.


# precomputed CRC64NVME checksum for the full object
full_object_crc64_nvme_checksum = 'Naz0uXkYBPM='

# start multipart upload
create_response = s3.create_multipart_upload(
            Bucket=BUCKET_NAME,
            Key=OBJECT_NAME,
            ChecksumAlgorithm='CRC64NVME',
            ChecksumType='FULL_OBJECT'
        )
upload_id = create_response['UploadId']

# Upload parts
uploaded_parts = []

# part 1
data_part_1 = b'0' * (5 * 1024 * 1024) # minimum part size
upload_part_response_1 = s3.upload_part(
    Body=data_part_1,
    Bucket=BUCKET_NAME,
    Key=OBJECT_NAME,
    PartNumber=1,
    UploadId=upload_id,
    ChecksumAlgorithm='CRC64NVME'
)
uploaded_parts.append({'PartNumber': 1, 'ETag': upload_part_response_1['ETag']})

# part 2
data_part_2 = b'0' * (5 * 1024 * 1024)
upload_part_response_2 = s3.upload_part(
    Body=data_part_2,
    Bucket=BUCKET_NAME,
    Key=OBJECT_NAME,
    PartNumber=2,
    UploadId=upload_id,
    ChecksumAlgorithm='CRC64NVME'
)
uploaded_parts.append({'PartNumber': 2, 'ETag': upload_part_response_2['ETag']})

# Complete the multipart upload with the FULL_OBJECT CRC64NVME checksum to validate the integrity of your entire object. 
complete_response = s3.complete_multipart_upload(
            Bucket=BUCKET_NAME,
            Key=OBJECT_NAME,
            UploadId=upload_id,
            ChecksumCRC64NVME=full_object_crc64_nvme_checksum,
            ChecksumType='FULL_OBJECT',
            MultipartUpload={'Parts': uploaded_parts}
        )
print(complete_response)

알아야 할 사항
기존 객체의 경우 복사할 때 체크섬이 추가됩니다. 대상 객체에 대해 원하는 체크섬 알고리즘을 선택할 수 있도록 CopyObject API를 업데이트했습니다.

이 새로운 클라이언트 측 체크섬 계산은 최신 버전의 AWS SDK에서 구현됩니다. 이전 SDK 또는 체크섬을 미리 계산하지 않는 사용자 지정 코드를 사용하면 Amazon S3는 수신한 모든 새 객체에 대해 체크섬을 계산하고 이를 객체의 메타데이터에 저장합니다. 멀티파트 업로드의 경우에도 마찬가지입니다.

요금 및 가용성
이 확장된 체크섬 계산 및 스토리지는 추가 비용 없이 모든 AWS 리전에서 사용할 수 있습니다.

지금 AWS SDK와 AWS CLI를 업데이트하면 전송 중 데이터에 대한 이러한 추가 무결성 보호 기능을 자동으로 활용할 수 있습니다.

Amazon S3의 데이터 무결성 보호에 대해 자세히 알아보려면 Amazon S3 사용 설명서의 객체 무결성 확인을 참조하세요.

— seb