해시 및 ETag: 권장사항

Cloud Storage는 버킷에 대해 전송되는 데이터를 검증하도록 권장합니다. 이 페이지에서는 CRC32C 또는 MD5 체크섬을 사용해서 검증을 수행하기 위한 권장사항을 설명합니다.

해시를 사용하여 데이터 손상 방지

Cloud에서 업로드 또는 다운로드하는 동안 데이터가 여러 가지 이유로 손상될 수 있습니다.

  • 클라이언트나 서버 컴퓨터, 또는 경로상에 있는 라우터에서의 메모리 오류
  • 소프트웨어 버그(예: 고객이 사용하는 라이브러리에서)
  • 장기간에 걸쳐 업로드가 발생하면 소스 파일이 변경됩니다.

Cloud Storage에서는 데이터 무결성 확인을 위해 사용할 수 있는 CRC32C 및 MD5라는 두 가지 해시 유형이 지원됩니다. CRC32C는 무결성 검사를 수행하는 권장되는 검증 방법입니다. MD5를 선호하는 고객은 해시를 사용할 수 있지만 복합 객체 또는 MD5 해시에서는 XML API 멀티파트 업로드에서 생성된 객체를 지원하지 않습니다.

CRC32C

모든 Cloud Storage 객체에는 CRC32C 해시가 있습니다. CRC32C 계산을 위한 라이브러리로는 다음이 포함됩니다.

Base64로 인코딩되는 CRC32C는 Big Endian 바이트 순서를 따릅니다.

MD5

Cloud Storage는 다음 기준을 충족하는 객체에 MD5 해시를 지원합니다.

이 해시는 전체 객체에만 적용되므로 범위 GET에 의해 실행되는 부분 다운로드의 무결성 검사에는 사용될 수 없습니다.

ETag

다음 조건이 모두 충족되면 객체의 ETag 헤더가 객체의 MD5 값을 반환합니다.

다른 모든 경우에서 사용자는 사양에 따라 기본 데이터 또는 메타데이터가 변경될 때마다 ETag가 변경된다는 점을 제외하고 ETag에 사용된 값을 가정하면 안 됩니다.

동일한 객체가 XML API에서 요청되면 JSON API와 비교 시 다른 ETag 값이 있을 수 있습니다.

유효성 검사

다운로드한 데이터를 실시간으로 해싱하고 결과를 서버에서 제공한 해시와 비교하여 다운로드 무결성 검사를 수행할 수 있습니다. 잘못된 해시 값이 있는 다운로드 데이터를 삭제하고 잠재적으로 높은 비용을 초래하는 무한 루프를 방지하기 위해 재시도 로직을 사용해야 합니다.

Cloud Storage는 다음과 같은 경우에 서버 측 유효성 검사를 수행합니다.

  • Cloud Storage 내에서 복사 또는 재작성 요청을 수행하는 경우

  • 업로드 요청에서 객체의 예상 MD5 또는 CRC32C 해시를 제공할 경우 사용자가 제공한 해시가 Cloud Storage에서 계산하는 값과 일치하는 경우에만 Cloud Storage가 객체를 만듭니다. 일치하지 않으면 요청이 BadRequestException: 400 오류와 함께 거부됩니다.

또는 사용자가 업로드된 객체의 메타데이터에 대한 요청을 실행하고 보고된 해시 값을 비교한 후 일치하지 않으면 객체를 삭제하여 업로드의 클라이언트 측 유효성 검사를 수행할 수 있습니다. 이 방법은 업로드 시작 시 객체의 MD5 또는 CRC32C 해시를 알 수 없는 경우에 유용합니다. 독립된 프로세스가 서로의 데이터를 삭제하거나 교체하는 경합 상태를 방지하려면 객체 생성과 사전 조건을 사용합니다.

동시 복합 업로드의 경우 사용자는 각 구성요소 업로드에 대한 무결성 검사를 수행한 후 구성 요청과 함께 구성요소 사전 조건을 사용하여 경합 상태를 방지해야 합니다. 객체 구성은 서버 측 MD5 유효성 검사를 제공하지 않으므로, 엔드 투 엔드 무결성 검사를 수행할 사용자는 새로운 복합 객체에 클라이언트 측 유효성 검사를 적용해야 합니다.

XML API

XML API에서는 base64 인코딩 MD5 및 CRC32C 해시가 x-goog-hash 헤더를 통해 노출되고 허용됩니다. 이전에는 MD5가 객체 ETag로 사용되었지만 사용자는 이러한 가정을 하지 않는 것이 좋습니다. 일부 객체는 객체 변경 시 변경 이외에는 어떤 보장도 하지 않는 불투명한 ETag 값을 사용하기 때문입니다.

서버 측 업로드 유효성 검사는 x-goog-hash 요청 헤더를 통해 로컬에서 계산된 해시를 제공하여 수행될 수 있습니다. 또한 표준 HTTP Content-MD5 헤더를 사용하여 MD5를 제공할 수 있습니다(사양 참조).

JSON API

JSON API의 경우 객체 리소스 md5Hashcrc32c 속성에는 각각 base64로 인코딩된 MD5 및 CRC32C 해시가 포함되어 있습니다. 메타데이터 속성 제공은 선택사항입니다. 재개 가능한 업로드 또는 JSON API 멀티파트 업로드의 일부로 속성을 제공하면 새 객체의 서버 측 유효성 검사가 트리거됩니다. Cloud Storage가 제공된 값과 일치하지 않는 속성 값을 계산하면 객체가 생성되지 않습니다. 업로드에서 속성이 제공되지 않으면 Cloud Storage에서 이 값을 계산하고 객체의 메타데이터에 씁니다.

Google Cloud CLI

Google Cloud CLI의 경우 Cloud Storage 버킷에 대해 복사된 데이터가 검증됩니다. 이는 cp, mv, rsync 명령어에 적용됩니다. 소스 데이터의 체크섬이 대상 데이터의 체크섬과 일치하지 않으면 gcloud CLI가 잘못된 사본을 삭제하고 경고 메시지를 출력합니다. 이러한 일은 매우 드뭅니다. 실제로 발생하는 경우, 작업을 다시 시도해야 합니다.

객체 자체가 완료된 후 이 자동 검증이 수행되므로 잘못된 객체가 식별되고 삭제되기 전에 1~3초 동안 표시됩니다. 또한 업로드가 완료된 후 검증을 수행하기 전에 gcloud CLI가 중단되는 경우 잘못된 객체가 그대로 유지됩니다. --content-md5=MD5 플래그를 사용할 때 발생하는 서버 측 검증을 사용하여 단일 파일을 Cloud Storage에 업로드할 때 이러한 문제를 방지할 수 있습니다.

다음 단계