서명

서명은 Cloud Storage XML API로 전송되는 요청을 인증하기 위한 한 가지 방법입니다. 예를 들어 서명은 서명된 URL 또는 HTML 양식을 사용할 때 사용됩니다. 이 페이지에는 서명 생성 권장 프로세스인 V4 서명 프로세스를 사용하여 만든 서명이 사용됩니다.

개요

서명은 ID 및 강력한 인증을 모두 제공하여 Cloud Storage에 대한 요청이 특정 계정의 권한을 사용해서 처리되도록 보장합니다. 서명을 사용하면 해당 계정과 연결된 보안 비밀 또는 비공개 키라고 하는 민감한 키 정보를 노출하지 않고도 이러한 인증을 수행할 수 있습니다.

서명으로 요청을 수행하면 Cloud Storage에서 해당 핵심 정보 사본을 사용하여 요청에 사용 가능한 동등한 서명을 계산합니다. 요청에 포함된 서명이 Cloud Storage에서 계산된 서명과 일치하는 경우 Cloud Storage는 서명이 관련 보안 비밀이나 비공개 키를 통해 생성되었다는 점을 확인합니다.

Cloud Storage에서 서명은 다음 항목을 작업할 때 사용되어야 합니다.

또한 다음 항목을 만들 때도 서명을 사용할 수 있습니다.

  • XML API에 대한 직접 서명된 요청

직접 요청에 서명을 사용하는 것은 Amazon S3에서 간단한 마이그레이션을 수행할 때 유용합니다. 하지만 직접 요청에 권장되는 인증 흐름은 OAuth 2.0 토큰을 사용하는 것입니다.

구조

서명을 생성하기 위한 구성요소와 프로세스는 서명의 용도와 사용할 인증 키에 따라 다릅니다. 일반적으로 서명에는 서명 키요청 정보라는 두 가지 구성요소가 있습니다. 이러한 두 구성요소에 서명 알고리즘을 적용하여 서명을 생성합니다. 아래 표에서는 서명에 대한 여러 사용 사례와 서명 생성을 위해 각 사례에 필요한 구성요소를 요약해서 보여줍니다.

사용 사례 서명 키 요청 정보
RSA 키가 포함된 HTML 양식 RSA 비공개 키 직접 사용 Base64로 인코딩된 정책 문서
HMAC 키가 포함된 HTML 양식 HMAC 키의 보안 비밀에서 파생 Base64로 인코딩된 정책 문서
RSA 키가 포함된 서명된 URL 또는 서명된 요청 RSA 비공개 키 직접 사용 서명 문자열
HMAC 키가 포함된 서명된 URL 또는 서명된 요청 HMAC 키의 보안 비밀에서 파생 서명 문자열

서명 문자열

서명 문자열에는 요청에 대한 메타 정보와 서명하려는 정규 요청의 해시가 포함됩니다.

구조

서명 문자열은 UTF-8로 인코딩되어야 하며, 각 요소 간 줄바꿈 사용을 포함하여 다음 구조를 사용해야 합니다.

SIGNING_ALGORITHM
ACTIVE_DATETIME
CREDENTIAL_SCOPE
HASHED_CANONICAL_REQUEST

서명 알고리즘

SIGNING_ALGORITHM에 사용하는 값은 사용하는 키의 유형과 헤더 또는 쿼리 매개변수에 사용하는 확장 프로그램에 따라 다릅니다.

사용 사례 SIGNING_ALGORITHM
x-goog-* 확장 프로그램 및 RSA 키 GOOG4-RSA-SHA256
x-goog-* 확장 프로그램 및 HMAC 키 GOOG4-HMAC-SHA256
x-amz-* 확장 프로그램 및 HMAC 키 AWS4-HMAC-SHA256

활성 날짜/시간

서명을 사용할 수 있는 ISO 8601 기본 형식 YYYYMMDD'T'HHMMSS'Z'의 날짜 및 시간입니다.

  • 서명된 URL의 경우 활성 날짜/시간 15분 전부터 지정된 만료 시간까지 서명을 사용할 수 있습니다. 활성 날짜/시간은 서명된 URL의 X-Goog-Date 쿼리 문자열 매개변수와 일치해야 하며, 사용자 인증 정보 범위에 지정한 것과 동일한 일자를 사용해야 합니다.

  • 서명된 요청의 경우 활성 날짜/시간 15분 전부터 활성 날짜/시간 15분 후까지 서명을 사용할 수 있습니다. 활성 날짜/시간은 서명된 요청의 x-goog-date 요청 헤더와 일치해야 하며, 사용자 인증 정보 범위에 지정한 것과 동일한 일자를 사용해야 합니다.

사용자 인증 정보 범위

요청의 사용자 인증 정보 범위입니다.

정규 요청의 해시

정규 요청의 16진수로 인코딩된 SHA-256 해시입니다. SHA-256 해싱 함수를 사용하여 정규 요청의 해시 값을 만듭니다. 사용하는 프로그래밍 언어에 SHA-256 해시를 만들 수 있는 라이브러리가 있어야 합니다. 해시 값의 예시는 다음과 같습니다.

436b7ce722d03b17d3f790255dd57904f7ed61c02ac5127a0ca8063877e4e42c

예시

다음은 줄바꿈이 \n 대신 실제 줄바꿈으로 표시된 올바른 형식의 서명 문자열 예시입니다

GOOG4-RSA-SHA256
20191201T190859Z
20191201/us-central1/storage/goog4_request
54f3076005db23fbecdb409d25c0ccb9fb8b5e24c59f12634654c0be13459af0

정책 문서

정책 문서는 해당 HTML 양식에 대해 액세스 권한이 있는 사용자가 Cloud Storage에 업로드할 수 있는 항목을 정의합니다. 정책 문서는 HTML 양식이 파일을 대상 버킷에 업로드할 수 있도록 승인을 제공합니다. 정책 문서를 사용하여 웹사이트 방문자가 Cloud Storage에 파일을 업로드하도록 허용할 수 있습니다.

정책 문서는 자바스크립트 객체 표기법(JSON)으로 구성되어 있습니다. 정책 문서는 UTF-8 및 Base64로 인코딩되어야 합니다. 정책 문서에는 다음 섹션이 포함됩니다.

항목 설명
expiration ISO 8601 기본 형식 YYYYMMDD'T'HHMMSS'Z'로 표시된 정책 문서의 만료 시간입니다. 정책 문서가 만료되면 HTML 양식이 손상됩니다.
conditions 모든 업로드 시 충족시켜야 하는 조건 배열입니다.

conditions 섹션에는 다음이 포함되어야 합니다.

  • x-goog-signature, file, policy 필드를 제외하고 HTML 양식에서 사용하는 각 필드의 조건문입니다.

  • "bucket" 조건문(HTML 양식에서 버킷 필드를 사용하지 않는 경우도 해당)

동일 필드에 여러 조건문을 사용하려면 각 조건문마다 개별 HTML 양식을 만들어야 합니다. 조건문에는 세 가지 유형의 조건을 사용할 수 있습니다.

  • 일치검색

    필드에 대해 일치검색을 수행합니다. HTML 양식의 지정된 필드에 사용되는 값이 이 조건에 설정된 값과 일치해야 합니다. 다음 구문 스타일 중 하나를 사용해서 이 조건을 설정합니다.

    {"field" : "value"}
    ["eq", "$field", "value"]

    Content-Length를 제외한 모든 유효한 HTML 양식은 일치검색을 사용할 수 있습니다.

  • 시작 값

    필드 값이 특정 프리픽스로 시작해야 할 경우 다음 구문으로 starts-with 조건을 사용합니다.

    ["starts-with", "$field", "value"]

    필드 값에 제한이 없으면 다음 구문으로 starts-with 조건을 사용합니다.

    ["starts-with", "$field", ""]

    Content-Length를 제외한 모든 유효한 HTML 양식 필드에 starts-with 조건을 사용할 수 있습니다.

  • 콘텐츠 길이 범위

    Content-Length 필드에 사용할 수 있는 허용되는 값 범위를 지정합니다. 다음 구문을 사용하여 이 조건을 지정합니다.

    ["content-length-range", min_range, max_range]

예시

다음은 정책 문서의 예시입니다.

{"expiration": "2020-06-16T11:11:11Z",
 "conditions": [
  ["starts-with", "$key", ""],
  {"bucket": "travel-maps"},
  {"success_action_redirect": "http://www.example.com/success_notification.html"},
  ["eq", "$Content-Type", "image/jpeg"],
  ["content-length-range", 0, 1000000],
  {"x-goog-algorithm": "GOOG4-RSA-SHA256"},
  {"x-goog-credential": "example_account@example_project.iam.gserviceaccount.com/20191102/us-central1/storage/goog4_request"},
  {"x-goog-date": "20191102T043530Z"}
  ]
}

이 정책 문서는 다음 조건을 정의합니다.

  • 양식은 UTC 기준 2020년 6월 16일 11:11:11에 만료됩니다.
  • 파일 이름은 모든 유효한 문자로 시작할 수 있습니다.
  • 파일을 travel-maps 버킷에 업로드해야 합니다.
  • 업로드가 성공하면 사용자가 http://www.example.com/success_notification.html로 리디렉션됩니다.
  • 양식에서 이미지만 업로드가 허용됩니다.
  • 사용자는 1MB를 초과하는 파일을 업로드할 수 없습니다.

사용자 인증 정보 범위

사용자 인증 정보 범위는 서명 문자열 및 정책 문서에 모두 표시되는 문자열입니다. 사용자 인증 정보 범위에는 다음 구조가 포함됩니다.

DATE/LOCATION/SERVICE/REQUEST_TYPE

사용자 인증 정보 범위에는 다음 구성요소가 포함됩니다.

  • DATE: 서명을 사용할 수 있게 되는 날짜로, YYYYMMDD 형식입니다.
  • LOCATION: Cloud Storage 리소스의 경우 LOCATION에 어떤 값이든 사용할 수 있습니다. 사용할 권장 값은 서명이 적용되는 리소스와 연결된 위치입니다. 예를 들면 us-central1입니다. 이 매개변수는 Amazon S3와의 호환성 유지를 위해 존재합니다.
  • SERVICE: 서비스 이름 대부분의 경우 Cloud Storage 리소스에 액세스할 때 이 값은 storage입니다. Amazon S3 x-amz 확장 프로그램을 사용할 때는 이 값이 s3입니다.
  • REQUEST_TYPE: 요청 유형입니다. 대부분의 경우 Cloud Storage 리소스에 액세스할 때 이 값은 goog4_request입니다. Amazon S3 x-amz 확장 프로그램을 사용할 때는 이 값이 aws4_request입니다.

예를 들어 일반적인 사용자 인증 정보 범위는 다음과 같습니다.

20191102/us-central1/storage/goog4_request

반면에 x-amz 확장 프로그램으로 서명 문자열을 사용할 때의 사용자 인증 정보 범위는 다음과 같습니다.

20150830/us-east1/s3/aws4_request

서명

서명을 만들려면 암호화 해시 함수로도 알려진 서명 알고리즘을 사용해서 서명 문자열 또는 정책 문서를 서명합니다. 사용하는 서명 알고리즘은 갖고 있는 인증 키 유형에 따라 달라집니다.

인증 키 서명 알고리즘 서명 키
RSA 키 RSA-SHA256 RSA 비공개 키 직접 사용
HMAC 키 HMAC-SHA256 HMAC 키의 보안 비밀에서 파생

RSA 키와 IAM signBlob 메서드를 사용하여 서명 문자열이나 정책 문서에 서명하는 가이드는 서명 만들기를 참조하세요.

HMAC 키에서 서명 키 파생

HMAC 키로 서명할 때는 HMAC 키 보안 비밀에서 파생되는 UTF-8로 인코딩된 서명 키를 만들어야 합니다. 파생된 키는 요청과 관련된 날짜, 위치, 서비스, 요청 유형에 따라 달라집니다. 다음 의사 코드는 서명 키를 파생하는 방법을 보여줍니다.

key_date = HMAC-SHA256("PREFIX" + HMAC_KEY_SECRET, "DATE")
key_region = HMAC-SHA256(key_date, "LOCATION")
key_service = HMAC-SHA256(key_region, "SERVICE")
signing_key = HMAC-SHA256(key_service, "REQUEST_TYPE")

의사 코드에는 다음과 같은 구성요소가 있습니다.

  • PREFIX: 대부분의 경우 Cloud Storage 리소스에 액세스할 때 이 값은 GOOG4입니다. Amazon S3 x-amz 확장 프로그램을 사용할 때는 이 값이 AWS4입니다.
  • HMAC_KEY_SECRET: 요청을 만들고 서명하는 데 사용하는 HMAC 키의 보안 비밀입니다.
  • DATE, LOCATION, SERVICE, REQUEST_TYPE: 이 값은 사용자 인증 정보 범위에 지정된 값과 일치해야 합니다.

서명 후

서명을 완료하려면 메시지 다이제스트라고 부르는 서명 출력을 16진수로 인코딩해야 합니다.

예시

다음은 정책 문서를 서명하기 위한 의사 코드입니다.

EncodedPolicy = Base64Encode(PolicyDocument)
MessageDigest = SigningAlgorithm(SigningKey, EncodedPolicy)
Signature = HexEncode(MessageDigest)

다음은 서명 문자열을 서명하기 위한 의사 코드입니다.

MessageDigest = SigningAlgorithm(SigningKey, StringToSign)
Signature = HexEncode(MessageDigest)

제한사항

업로드가 단위 분할 전송 인코딩을 사용하는 경우에는 서명을 사용하여 업로드를 인증할 수 없습니다. 업로드에 단위 분할 전송 인코딩을 사용하려면 OAuth 2.0 토큰을 사용하세요.

다음 단계