객체 메타데이터 다루기

메타데이터 개요

객체에는 관련 메타데이터가 있을 수 있습니다. 이 메타데이터는 Content-Type, Cache-Control, Content-Disposition, Content-Encoding을 포함하여 GET 요청을 처리하는 방식을 제어합니다(아래 하위 섹션에서 자세히 설명). 또한 애플리케이션에서 사용할 수 있는 커스텀 메타데이터를 설정할 수 있습니다(예: 특정 객체에 일부 속성이 있음을 태그 지정).

객체에 메타데이터를 설정하는 방법에는 두 가지가 있습니다.

  • 업로드 시 gsutil -h 옵션을 사용하여 객체와 연결할 메타데이터 속성을 하나 이상 지정할 수 있습니다. 예를 들어 다음 명령어를 실행하면 gsutil이 images라는 로컬 디렉터리에서 업로드하는 각 파일에 대해 Content-Type 및 Cache-Control을 설정합니다.

    gsutil -h "Content-Type:text/html" \
           -h "Cache-Control:public, max-age=3600" cp -r images \
           gs://bucket/images
    

    -h는 cp 하위 명령어가 아닌 gsutil 명령어의 옵션입니다.

  • gsutil setmeta 명령어를 사용하여 이미 업로드된 객체에서 메타데이터 필드를 설정하거나 삭제할 수 있습니다. gsutil help setmeta를 참조하세요.

특정 메타데이터에 대한 자세한 내용은 아래에 설명되어 있습니다.

Content-Type

가장 일반적으로 설정되는 메타데이터는 Content-Type(MIME 유형이라고도 함)입니다. 이를 통해 브라우저가 객체를 제대로 렌더링할 수 있습니다. gsutil은 업로드 시 각 파일 이름 확장자를 기반으로 Content-Type을 자동으로 설정합니다. 예를 들어 이름이 .txt로 끝나는 파일을 업로드하면 Content-Type이 text/plain으로 설정됩니다. Linux 또는 macOS에서 gsutil을 실행하고 이름 지정 및 콘텐츠 검사를 기반으로 콘텐츠 유형을 설정하려는 경우 .boto 구성 파일에서 use_magicfile 구성 변수를 참조하세요. 일반적으로 use_magicfile을 사용하는 것이 더 강력하고 구성 가능하지만 Windows에서는 사용할 수 없습니다.

콘텐츠를 업로드할 때 -h로 Content-Type을 지정할 경우(이전 섹션에서 제공된 gsutil 명령어 예시와 같이) 파일 이름 확장자 또는 콘텐츠를 기반으로 설정한 Content-Type이 재정의됩니다. 이는 일부 파일에서 Content-Type 감지 알고리즘이 제대로 작동하지 않는 경우에 유용합니다.

Cache-Control

일반적으로 설정되는 또 다른 메타데이터는 Cache-Control입니다. 이를 통해 브라우저 캐시와 인터넷 캐시가 객체를 캐시할 수 있는지 여부와 캐시할 수 있는 기간을 제어할 수 있습니다. Cache-Control은 공개 읽기 ACL이 있는 객체에만 적용됩니다. 비공개 데이터는 캐시할 수 없습니다.

다음은 캐싱을 허용하기 위해 photos라는 로컬 디렉터리에서 객체 집합을 업로드하는 예시입니다.

gsutil -h "Cache-Control:public,max-age=3600" cp -a public-read \
       -r photos gs://bucket/photos

이 명령어는 photos 디렉터리(및 하위 디렉터리)의 모든 파일을 업로드하고 공개적으로 읽고 캐시할 수 있게 하며 캐시 만료 시간은 1시간입니다.

캐싱을 허용하면 최신 대체 객체를 업로드한 후에도 다운로드 시 이전 버전의 객체가 표시될 수 있습니다. 또한 인터넷의 다양한 공간에서 객체가 캐시될 수 있기 때문에 브라우저에서 캐시를 강제로 새로고침하는 방법과 달리 캐시된 객체가 모두 만료되게 할 수 있는 방법은 없습니다. 공개적으로 읽을 수 있는 객체의 캐시된 버전을 제공하지 않으려면 객체에 'Cache-Control:no-cache, max-age=0'을 설정합니다. 다음과 같은 명령어를 사용하면 됩니다.

gsutil -h "Cache-Control:no-cache,max-age=0" \
       cp -a public-read file.png gs://your-bucket

Cache-Control을 사용하는 또 다른 방법은 호환되지 않는 클라이언트의 gzip 콘텐츠 인코딩 삭제와 같은 다운로드 요청의 특성을 기반으로 콘텐츠 변환을 적용하지 않도록 Cloud Storage에 지시하는 'no-transform' 값을 사용하는 것입니다. 이 매개변수는 XML API에서만 사용 가능합니다. Cloud Storage JSON API는 public, private, no-cache, max-age Cache-Control 매개변수만 적용합니다.

Cache-Control 메타데이터를 설정하는 방법에 대한 자세한 내용은 gsutil help setmeta를 참조하세요.

Content-Encoding

Content-Encoding을 지정하여 Content-Type을 유지하면서 객체가 압축되었음을 나타낼 수 있습니다(예: gzip 압축 사용). gsutil을 사용하여 업로드하기 전에 지정된 Content-Encoding을 사용하여 파일이 압축되었는지 확인해야 합니다. Linux의 경우 다음 예시를 참조하세요.

echo "Highly compressible text" | gzip > foo.txt
gsutil -h "Content-Encoding:gzip" \
       -h "Content-Type:text/plain" \
       cp foo.txt gs://bucket/compressed

대부분의 브라우저는 기본 Content-Type을 기반으로 Content-Encoding: gzip으로 제공되는 객체를 동적으로 압축을 풀고 처리할 수 있으므로 이는 gzip으로 압축한 객체인 foo.txt.gz를 Content-Type: application/x-gzip을 통해 업로드하는 것과는 다릅니다.

압축 가능한 콘텐츠의 경우 Content-Encoding: gzip을 사용하면 네트워크 및 스토리지 비용이 절약되고 콘텐츠 제공 성능이 향상됩니다. 그러나 이미 압축된 콘텐츠(예: 보관 파일 및 많은 미디어 형식)의 경우 Content-Encoding을 통해 다른 수준의 압축을 적용하면 객체 크기와 성능에 악영향을 미치므로 이를 피해야 합니다.

gsutil은 Content-Encoding: gzip을 통해 간편하게 콘텐츠를 압축하여 저장할 수 있는 방법을 제공합니다. gsutil help cp에서 -z 및 -Z 옵션을 참조하세요.

Content-Disposition

객체에 Content-Disposition을 설정하여 전송 중인 데이터에 대한 표시 정보를 지정할 수 있습니다. 다음은 attachments라는 로컬 디렉터리에서 파일을 업로드하는 예시입니다.

gsutil -h 'Content-Disposition:attachment; filename=filename.ext' \
       cp -r attachments gs://bucket/attachments

Content-Disposition을 설명하면 콘텐츠의 표시 스타일을 제어할 수 있습니다. 예를 들어 첨부파일을 자동으로 표시할지 또는 첨부파일을 열기 위해 일정한 형태의 사용자 작업이 필요한지 여부를 결정할 수 있습니다. Content-Disposition의 의미에 대한 자세한 내용은 https://tools.ietf.org/html/rfc6266을 참조하세요.

커스텀 메타데이터

-h와 함께 'x-goog-meta'를 사용하여 Cloud Storage 객체에 커스텀 메타데이터(예: 애플리케이션 사용 목적)를 추가할 수 있습니다. 예를 들면 다음과 같습니다.

gsutil -h x-goog-meta-reviewer:jane cp mycode.java gs://bucket/reviews

다른 이름의 커스텀 메타데이터 필드를 여러 개 각 객체에 추가할 수 있습니다.

설정 가능한 필드, 필드 값

ETag 및 Content-Length와 같은 일부 메타데이터 필드는 설정할 수 없습니다. 설정할 수 있는 필드는 다음과 같습니다.

  • Cache-Control
  • Content-Disposition
  • Content-Encoding
  • Content-Language
  • Content-Type
  • 커스텀 메타데이터

필드 이름은 대소문자를 구분하지 않습니다.

모든 필드와 해당 값은 ASCII 문자로만 구성되어야 하며, 임의의 유니코드 값을 포함할 수 있는 x-goog-meta- 필드 값은 예외입니다. 커스텀 메타데이터를 HTTP 헤더로 전송하는 XML API를 사용하여 메타데이터를 설정하면 유니코드 문자는 UTF-8로 인코딩된 다음 ASCII로 URL 인코딩됩니다. 예를 들면 다음과 같습니다.

gsutil setmeta -h "x-goog-meta-foo: ã" gs://bucket/object

'foo' 및 '%C3%A3'의 커스텀 메타데이터 키-값 쌍을 저장합니다. 이후에 JSON API를 통해 'ls -L'을 실행하여 객체의 메타데이터를 나열하면 '%C3%A3'이 인쇄되고 XML API를 통해 'ls -L'을 실행하면 이 값이 자동으로 URL 디코딩되어 'ã' 문자가 인쇄됩니다.

현재 설정된 메타데이터 보기

다음을 사용하여 현재 객체에 설정된 메타데이터를 확인할 수 있습니다.

gsutil ls -L gs://the_bucket/the_object