Authorization 헤더에 대한 서명 계산: 페이로드를 단일 청크로 전송(AWS 서명 버전 4)
Authorization 헤더를 사용하여 요청을 인증할 때 헤더 값에는 무엇보다 서명이 포함됩니다. 서명 계산은 페이로드 전송을 위해 선택한 항목에 따라 달라집니다(개요). 이 섹션에서는 페이로드를 단일 청크로 전송하도록 선택하는 경우의 서명 계산에 대해 설명합니다. 예제 섹션(예제: 서명 계산 참조)에는 코드를 확인하기 위한 테스트 스위트로 사용할 수 있는 서명 계산 및 결과 Authorization 헤더가 나와 있습니다.
중요
페이로드를 단일 청크로 전송할 때 선택적으로 서명 계산에 페이로드 해시를 포함하도록 선택할 수 있으며, 이를 서명된 페이로드라고 합니다(페이로드 해시를 포함하지 않으면 페이로드가 서명되지 않은 것으로 간주됨). 다음 섹션에서 설명하는 서명 절차는 둘 모두에 적용되지만 다음과 같은 차이점이 있습니다.
-
서명된 페이로드 옵션 – 정식 요청을 구성할 때 페이로드 해시를 포함합니다(이 경우 서명 계산 섹션에 설명된 대로 StringToSign의 일부가 됨). 또한 S3에 요청을 전송할 때
x-amz-content-sha256헤더 값과 동일한 값을 지정합니다. -
서명되지 않은 페이로드 옵션 - 표준 요청을 구성할 때 리터럴 문자열
UNSIGNED-PAYLOAD를 포함하고, Amazon S3에 요청을 전송할 때x-amz-content-sha256헤더 값과 동일한 값을 설정합니다.
Amazon S3에 요청을 전송하면 x-amz-content-sha256 헤더 값은 페이로드가 서명되었는지 여부를 Amazon S3에 알립니다. 그런 다음 Amazon S3는 그에 따라 확인을 위해 서명을 생성할 수 있습니다.
두 경우 모두 x-amz-content-sha256 헤더 값이 이미 HashedPayload의 일부이므로 x-amz-content-sha256 헤더를 정식 헤더로 포함할 필요가 없습니다.
서명 계산
서명을 계산하려면 먼저 서명할 문자열이 필요합니다. 이후 서명 키를 사용하여 서명할 문자열의 HMAC-SHA256 해시를 계산합니다. 다음 다이어그램은 서명을 위해 생성한 문자열의 다양한 구성 요소를 포함한 프로세스를 보여줍니다.
Amazon S3는 인증된 요청을 수신하면 서명을 계산한 다음 요청에 제공된 서명과 비교합니다. 이러한 이유로 인해 Amazon S3가 사용한 방법과 동일한 방법으로 서명을 계산해야 합니다. 요청을 서명을 위해 합의된 형식에 추가하는 과정을 정규화라고 합니다.
다음 표에서는 다이어그램에 표시된 함수를 설명합니다. 이러한 함수의 코드를 구현해야 합니다.
| 함수 | 설명 |
|---|---|
Lowercase() |
문자열을 소문자로 변환합니다. |
Hex() |
소문자 16진법 인코딩. |
SHA256Hash() |
보안 해시 알고리즘(SHA) 암호화 해시 함수. |
HMAC-SHA256() |
제공된 서명 키를 포함한 SHA256 알고리즘을 사용하여 HMAC를 계산합니다. 이것이 최종 서명입니다. |
Trim() |
선행 또는 후행 공백을 모두 제거합니다. |
UriEncode() |
URI는 모든 바이트를 인코딩합니다. UriEncode()는 다음 규칙을 적용해야 합니다.
중요개발 플랫폼에서 제공하는 표준 UriEncode 함수는 구현상의 차이와 기본 RFC의 관련 모호성으로 인해 효과적이지 않을 수 있습니다. 인코딩이 제대로 작동하도록 사용자 지정 UriEncode 함수를 직접 작성하는 것이 좋습니다. 다음은 Java로 작성된 UriEncode() 함수 예제입니다.
|
작업 1: 표준 요청 생성
이 섹션에서는 정식 요청 생성에 대한 개요를 제공합니다.
다음은 Amazon S3가 서명을 계산하는 데 사용하는 정식 요청 형식입니다. 서명을 일치시키려면 이 형식으로 정식 요청을 생성해야 합니다.
<HTTPMethod>\n<CanonicalURI>\n<CanonicalQueryString>\n<CanonicalHeaders>\n<SignedHeaders>\n<HashedPayload>
위치:
-
HTTPMethod는 GET, PUT, HEAD, DELETE와 같은 HTTP 메서드 중 하나입니다. -
CanonicalURI는 도메인 이름 뒤에 오는 '/'로 시작하여 문자열의 끝 또는 쿼리 문자열 파라미터가 있는 경우 물음표 문자('?')까지 URI의 절대 경로 구성 요소를 URI로 인코딩한 버전입니다. 다음 예제에서 URI/examplebucket/myphoto.jpg는 절대 경로이며 절대 경로에는 ‘/’를 인코딩하지 않습니다.http://s3.amazonaws.com/examplebucket/myphoto.jpg참고
Amazon S3에 대한 요청의 URI 경로를 정규화하지 않습니다. 예를 들어 'my-object//example//photo.user'라는 객체가 있는 버킷이 있습니다. 경로를 정규화하면 요청의 객체 이름이 'my-object/example/photo.user'로 변경됩니다. 이는 해당 객체의 잘못된 경로입니다.
-
CanonicalQueryString은 URI로 인코딩된 쿼리 문자열 파라미터를 지정합니다. 이름과 값을 개별적으로 URI 인코딩합니다. 또한 표준 쿼리 문자열의 파라미터를 키 이름별로 알파벳순으로 정렬해야 합니다. 정렬은 인코딩 후에 이루어집니다. 다음 URI 예제의 쿼리 문자열은 다음과 같습니다.prefix=somePrefix&marker=someMarker&max-keys=20http://s3.amazonaws.com/examplebucket?prefix=somePrefix&marker=someMarker&max-keys=20표준 쿼리 문자열은 다음과 같습니다(가독성을 위해 줄바꿈 추가됨).
UriEncode("marker")+"="+UriEncode("someMarker")+"&"+ UriEncode("max-keys")+"="+UriEncode("20") + "&" + UriEncode("prefix")+"="+UriEncode("somePrefix")요청이 하위 리소스를 대상으로 하는 경우 해당 쿼리 파라미터 값은 빈 문자열(‘’)이 됩니다. 예를 들어, 다음 URI는
examplebucket버킷에서ACL하위 리소스를 식별합니다.http://s3.amazonaws.com/examplebucket?acl이 경우 CanonicalQueryString은 다음과 같습니다.
UriEncode("acl") + "=" + ""URI에 '?'가 포함되지 않은 경우 요청에는 쿼리 문자열이 없으며, 표준 쿼리 문자열을 빈 문자열(‘’)로 설정합니다. 여전히 ‘\n’을 포함해야 합니다.
-
CanonicalHeaders는 요청 헤더 및 해당 값의 목록입니다. 개별 헤더 이름과 값 페어는 개행 문자(‘\n’)로 구분됩니다. 헤더 이름은 소문자여야 합니다. 다음 예제와 같이 헤더 이름을 알파벳순으로 정렬하여 문자열을 구성해야 합니다.Lowercase(<HeaderName1>)+":"+Trim(<value>)+"\n" Lowercase(<HeaderName2>)+":"+Trim(<value>)+"\n" ... Lowercase(<HeaderNameN>)+":"+Trim(<value>)+"\n"이 예제에서 사용하는
Lowercase()및Trim()함수는 이전 섹션에서 설명합니다.CanonicalHeaders목록에는 다음이 포함되어야 합니다.-
HTTP
host헤더 -
Content-MD5헤더가 요청에 있는 경우 이를CanonicalHeaders목록에 추가해야 합니다. -
요청에 포함할
x-amz-*헤더 또한 추가되어야 합니다. 예를 들어, 임시 보안 인증 정보를 사용하는 경우 요청에x-amz-security-token을 포함해야 합니다. 이 헤더를CanonicalHeaders목록에 추가해야 합니다.
참고
x-amz-content-sha256헤더는 모든 AWS 서명 버전 4 요청에 필요합니다. 요청 페이로드의 해시를 제공합니다. 그러나 S3는 요청에서 전송된 페이로드 해시를 계산할 때 자동으로 해당 값을 사용하기 때문에x-amz-content-sha256를 정식 헤더로 포함할 필요는 없습니다.페이로드가 없는 경우 빈 문자열의 해시를 제공해야 합니다.
S3가 요청의 해시와 대조하지 않도록 하려면 대신 리터럴 문자열
"UNSIGNED-PAYLOAD"를 사용할 수 있습니다.
다음은
CanonicalHeaders문자열의 예입니다. 헤더 이름은 소문자이고 정렬되어 있습니다.예예 1
host:s3.amazonaws.com x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130708T220855Z예예제 2
host:s3.amazonaws.com x-amz-content-sha256:UNSIGNED-PAYLOAD x-amz-date:20130708T220855Z예예 3
host:s3.amazonaws.com x-amz-date:20130708T220855Z참고
권한 부여 서명을 계산하려면 호스트 헤더 그리고
x-amz-content-sha256을 제외한 모든x-amz-*헤더가 필요합니다. 그러나 데이터 변조를 방지하려면 서명 계산에 모든 헤더를 포함하는 것을 고려해야 합니다.수신된 요청 페이로드 해시를 계산할 때 S3가 해당 값을 사용하기 때문에
x-amz-content-sha256헤더 서명은 선택 사항입니다. -
-
SignedHeaders는 소문자 요청 헤더 이름의 알파벳순으로 정렬되고 세미콜론으로 구분된 목록입니다. 목록의 요청 헤더는CanonicalHeaders문자열에 포함한 것과 동일합니다. 이전 예제에서SignedHeaders의 값은 다음과 같습니다.예예제 1 및 2
host;x-amz-content-sha256;x-amz-date예예 3
host;x-amz-date -
HashedPayload는 요청 페이로드 SHA256 해시의 16진수 값입니다.Hex(SHA256Hash(<payload>)요청에 페이로드가 없는 경우 다음과 같이 빈 문자열의 해시를 계산합니다.
Hex(SHA256Hash(""))해시는 다음 값을 반환합니다.
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855예를 들어 PUT 요청을 사용하여 객체를 업로드하는 경우 본문에 객체 데이터를 제공합니다. GET 요청을 사용하여 객체를 검색하는 경우 빈 문자열 해시를 계산합니다.
작업 2: 서명할 문자열 생성
이 섹션에서는 서명할 문자열 생성에 대한 개요를 제공합니다. 단계별 지침은 AWS 일반 참조의 작업 2: 서명할 문자열 생성을 참조하세요.
서명할 문자열은 다음 문자열을 연결한 것입니다.
"AWS4-HMAC-SHA256" + "\n" + timeStampISO8601Format + "\n" +<Scope>+ "\n" + Hex(SHA256Hash(<CanonicalRequest>))
상수 문자열 AWS4-HMAC-SHA256은 사용 중인 해시 알고리즘인 HMAC-SHA256을 지정합니다. timeStamp는 ISO 8601 형식의 현재 UTC 시간입니다(예: 20130524T000000Z).
Scope는 결과 서명을 특정 날짜, AWS 리전 및 서비스에 바인딩합니다. 따라서 결과 서명은 특정 리전 및 특정 서비스에서만 작동합니다. 서명은 지정된 날짜 이후 7일 동안 유효합니다.
date.Format(<YYYYMMDD>) + "/" +<region>+ "/" +<service>+ "/aws4_request"
Amazon S3의 경우 서비스 문자열은 s3입니다. 리전 문자열 목록은 AWS 일반 참조의 리전 및 엔드포인트를 참조하세요. 이 표의 리전 열은 유효한 리전 문자열의 목록입니다.
다음 범위는 결과 서명을 us-east-1 리전 및 Amazon S3로 제한합니다.
20130606/us-east-1/s3/aws4_request
참고
Scope는 다음 섹션에서 설명한 대로 서명 키를 계산하는 데 사용하는 것과 동일한 날짜를 사용해야 합니다.
작업 3: 서명 계산
AWS 서명 버전 4에서는 AWS 액세스 키를 사용하여 요청에 서명하는 대신, 먼저 특정 리전 및 서비스로 범위가 지정된 서명 키를 생성합니다. 서명 키에 대한 자세한 정보는 서명 요청 소개 섹션을 참조하세요.
DateKey = HMAC-SHA256("AWS4"+"<SecretAccessKey>", "<YYYYMMDD>") DateRegionKey = HMAC-SHA256(<DateKey>, "<aws-region>") DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<aws-service>") SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "aws4_request")
참고
일부 사용 사례에서는 서명 키를 최대 7일 동안 처리할 수 있습니다. 자세한 내용은 다른 사용자와 객체 공유를 참조하세요.
리전 문자열 목록은 AWS 일반 참조의 리전 및 엔드포인트를 참조하세요.
서명 키를 사용하면 AWS 자격 증명을 한 곳에 안전하게 보관할 수 있습니다. 예를 들어 Amazon S3와 통신하는 서버가 여러 개 있는 경우 서명 키를 해당 서버와 공유합니다. 그러면 각 서버에 시크릿 액세스 키의 사본을 보관할 필요가 없습니다. 서명 키는 최대 7일 동안 유효합니다. 따라서 서명 키를 계산할 때마다 서명 키를 서버와 공유해야 합니다. 자세한 내용은 요청 인증(AWS 서명 버전 4) 섹션을 참조하세요.
최종 서명은 서명 키를 키로 사용하여 서명할 문자열의 HMAC-SHA256 해시입니다.
HMAC-SHA256(SigningKey, StringToSign)
서명 생성에 대한 단계별 지침은 AWS 일반 참조의 작업 3: 서명 생성을 참조하세요.
예제: 서명 계산
이 섹션의 예제는 코드의 서명 계산을 점검하기 위한 참조로 사용할 수 있습니다. 예제에 표시된 계산은 다음 데이터를 사용합니다.
-
예제 액세스 키.
파라미터 값 AWSAccessKeyIdAKIAIOSFODNN7EXAMPLEAWSSecretAccessKeywJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -
요청 타임스탬프 20130524T000000Z(
Fri, 24 May 2013 00:00:00 GMT). -
버킷 이름
examplebucket. -
버킷은 미국 동부(버지니아 북부) 리전에 있는 것으로 가정합니다. 자격 증명
Scope및Signing Key계산은us-east-1을 리전 지정자로 사용합니다. 다른 리전에 대한 자세한 내용은 AWS 일반 참조의 리전 및 엔드포인트를 참조하세요. -
경로 방식 또는 가상 호스팅 방식 요청을 사용할 수 있습니다. 다음 예제에서는 가상 호스팅 방식 요청에 서명하는 방법을 보여줍니다.
https://examplebucket.s3.amazonaws.com/photos/photo1.jpg자세한 내용은 Amazon Simple Storage Service 사용 설명서의 버킷의 가상 호스팅을 참조하세요.
예제: GET Object
다음 예제에서는 examplebucket에서 객체(test.txt)의 처음 10바이트를 가져옵니다. 이 API 작업에 대한 자세한 내용은 GetObject를 참조하세요.
GET /test.txt HTTP/1.1 Host: examplebucket.s3.amazonaws.com Authorization:SignatureToBeCalculatedRange: bytes=0-9 x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date: 20130524T000000Z
이 GET 요청은 본문 콘텐츠를 제공하지 않으므로 x-amz-content-sha256 값은 빈 요청 본문의 해시 또는 리터럴 문자열 "UNSIGNED-PAYLOAD"일 수 있습니다. 다음 단계에서는 빈 문자열의 해시를 사용하여 Authorization 헤더의 서명 계산 및 구성을 보여줍니다.
-
StringToSign
-
CanonicalRequest
GET /test.txt host:examplebucket.s3.amazonaws.com range:bytes=0-9 x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130524T000000Z host;range;x-amz-content-sha256;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855정식 요청 문자열에서 마지막 줄은 빈 요청 본문의 해시입니다. 세 번째 줄은 요청에 쿼리 파라미터가 없기 때문에 비어 있습니다.
-
StringToSign
AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 7344ae5b7ee6c3e7e6b0fe0640412a37625d1fbfff95c48bbb2dc43964946972
-
-
SigningKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request") -
서명
f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41 -
Authorization 헤더
결과
Authorization헤더는 다음과 같습니다.AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;range;x-amz-content-sha256;x-amz-date,Signature=f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41
예제: PUT Object
이 예제 PUT 요청은 examplebucket에서 객체(test$file.text)를 생성합니다. 이 예시에서는 다음과 같이 가정합니다.
-
x-amz-storage-class요청 헤더를 추가하여REDUCED_REDUNDANCY를 스토리지 클래스로 요청하고 있습니다. 스토리지 클래스에 대한 자세한 내용은 Amazon Simple Storage Service 사용 설명서의 스토리지 클래스를 참조하세요. -
업로드된 파일의 콘텐츠는 문자열
"Welcome to Amazon S3."입니다. 요청에서x-amz-content-sha256의 값은 이 문자열을 기반으로 합니다.
이 API 작업에 대한 자세한 내용은 PutObject를 참조하세요.
PUT test$file.text HTTP/1.1 Host: examplebucket.s3.amazonaws.com Date: Fri, 24 May 2013 00:00:00 GMT Authorization:SignatureToBeCalculatedx-amz-date: 20130524T000000Z x-amz-storage-class: REDUCED_REDUNDANCY x-amz-content-sha256: 44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072<Payload>
다음 단계에서는 서명 계산을 보여줍니다.
-
StringToSign
-
CanonicalRequest
PUT /test%24file.text date:Fri, 24 May 2013 00:00:00 GMT host:examplebucket.s3.amazonaws.com x-amz-content-sha256:44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072 x-amz-date:20130524T000000Z x-amz-storage-class:REDUCED_REDUNDANCY date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class 44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072정식 요청에서 세 번째 줄은 요청에 쿼리 파라미터가 없기 때문에 비어 있습니다.
x-amz-content-sha256정식 헤더는 선택적으로 서명할 수 있습니다. 요청 하단에 페이로드 해시가 이미 제공되기 때문입니다. 마지막 줄은 본문의 해시로, HTTP 요청에서 S3로 전송된x-amz-content-sha256 header값과 동일해야 합니다. -
StringToSign
AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 9e0e90d9c76de8fa5b200d8c849cd5b8dc7a3be3951ddb7f6a76b4158342019d
-
-
SigningKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request") -
서명
98ad721746da40c64f1a55b78f14c238d841ea1380cd77a1b5971af0ece108bd -
Authorization 헤더
결과
Authorization헤더는 다음과 같습니다.AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class,Signature=98ad721746da40c64f1a55b78f14c238d841ea1380cd77a1b5971af0ece108bd
예제: GET Bucket Lifecycle
다음 GET 요청은 examplebucket의 수명 주기 구성을 검색합니다. 이 API 작업에 대한 자세한 내용은 GetBucketLifecycleConfiguration을 참조하세요.
GET ?lifecycle HTTP/1.1 Host: examplebucket.s3.amazonaws.com Authorization:SignatureToBeCalculatedx-amz-date: 20130524T000000Z x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
요청은 본문 콘텐츠를 제공하지 않으므로 x-amz-content-sha256 헤더 값은 빈 요청 본문의 해시입니다. 다음 단계에서는 서명 계산을 보여줍니다.
-
StringToSign
-
CanonicalRequest
GET / lifecycle= host:examplebucket.s3.amazonaws.com x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130524T000000Z host;x-amz-content-sha256;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855정식 요청에서 마지막 줄은 빈 요청 본문의 해시입니다.
-
StringToSign
AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 9766c798316ff2757b517bc739a67f6213b4ab36dd5da2f94eaebf79c77395ca
-
-
SigningKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request") -
서명
fea454ca298b7da1c68078a5d1bdbfbbe0d65c699e0f91ac7a200a0136783543 -
Authorization 헤더
결과
Authorization헤더는 다음과 같습니다.AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=fea454ca298b7da1c68078a5d1bdbfbbe0d65c699e0f91ac7a200a0136783543
예제: Get Bucket(List Objects)
다음 예제는 examplebucket 버킷에서 객체의 목록을 검색합니다. 이 API 작업에 대한 자세한 내용은 ListObjects를 참조하세요.
GET ?max-keys=2&prefix=J HTTP/1.1 Host: examplebucket.s3.amazonaws.com Authorization:SignatureToBeCalculatedx-amz-date: 20130524T000000Z x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
요청은 본문을 제공하지 않으므로 x-amz-content-sha256의 값은 빈 요청 본문의 해시입니다. 다음 단계에서는 서명 계산을 보여줍니다.
-
StringToSign
-
CanonicalRequest
GET / max-keys=2&prefix=J host:examplebucket.s3.amazonaws.com x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130524T000000Z host;x-amz-content-sha256;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855정식 문자열에서 마지막 줄은 빈 요청 본문의 해시입니다.
-
StringToSign
AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request df57d21db20da04d7fa30298dd4488ba3a2b47ca3a489c74750e0f1e7df1b9b7
-
-
SigningKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request") -
서명
34b48302e7b5fa45bde8084f4b7868a86f0a534bc59db6670ed5711ef69dc6f7 -
Authorization 헤더
결과
Authorization헤더는 다음과 같습니다.AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=34b48302e7b5fa45bde8084f4b7868a86f0a534bc59db6670ed5711ef69dc6f7