요청 인증: 쿼리 파라미터 사용(AWS 서명 버전 4)
인증 개요(인증 방법 참조)에 설명된 대로 쿼리 문자열 파라미터를 사용하여 인증 정보를 제공할 수 있습니다. 쿼리 파라미터를 사용하여 요청을 인증하는 것은 요청을 하나의 URL에서 완전히 표현하려는 경우에 유용합니다. 이 방법을 URL 미리 서명이라고도 합니다.
미리 서명된 URL의 사용 사례 시나리오는 Amazon S3 리소스에 대한 임시 액세스 권한을 부여할 수 있다는 것입니다. 예를 들어 웹 사이트에 미리 서명된 URL을 포함하거나 명령줄 클라이언트(예: Curl)에 이를 사용하여 객체를 다운로드할 수 있습니다.
참고
AWS CLI를 사용하여 미리 서명된 URL을 생성할 수도 있습니다. 자세한 내용은 AWS CLI 명령 참조의 presign 섹션을 참조하십시오.
다음은 미리 서명된 URL의 예입니다.
https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=<your-access-key-id>/20130721/us-east-1/s3/aws4_request &X-Amz-Date=20130721T201207Z &X-Amz-Expires=86400 &X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>
예제 URL에서 다음 사항에 유의하세요.
-
가독성을 위해 라인 피드가 추가되어 있습니다.
-
URL의
X-Amz-Credential값은 가독성을 위해 ‘/’ 문자만 표시합니다. 실제로는%2F로 인코딩되어야 합니다. 예제:&X-Amz-Credential=<your-access-key-id>%2F20130721%2Fus-east-1%2Fs3%2Faws4_request
다음 표에서는 인증 정보를 제공하는 URL의 쿼리 파라미터를 설명합니다.
| 쿼리 문자열 파라미터 이름 | 예제 값 |
|---|---|
X-Amz-Algorithm |
서명 계산에 사용한 AWS 서명 버전과 알고리즘을 식별합니다. AWS 서명 버전 4의 경우 이 파라미터 값을 |
X-Amz-Credential |
이 파라미터는 액세스 키 ID 외에도 서명이 유효한 범위(AWS 리전 및 서비스)를 제공합니다. 이 값은 다음 섹션의 설명과 같이 서명 계산에 사용하는 범위와 일치해야 합니다. 이 파라미터의 값의 일반적인 형식은 다음과 같습니다.
예제:
Amazon S3의 경우 |
X-Amz-Date |
날짜 및 시간 형식은 ISO 8601 표준을 따르고, ' |
X-Amz-Expires |
생성된 미리 서명된 URL이 유효한 기간(초)을 제공합니다. 예: 서명 계산에 사용하는 서명 키는 최대 7일 동안 유효하므로 미리 서명된 URL은 최대 7일 동안 유효할 수 있습니다. |
X-Amz-SignedHeaders |
서명 계산에 사용한 헤더를 나열합니다. 서명 계산에는 다음 헤더가 필요합니다.
참고보안을 강화하려면 요청에 포함하려는 모든 요청 헤더에 서명해야 합니다. |
X-Amz-Signature |
요청을 인증하기 위한 서명을 제공합니다. 이 서명은 Amazon S3가 계산하는 서명과 일치해야 합니다. 그렇지 않으면 Amazon S3가 요청을 거부합니다. 예: 서명 계산은 다음 섹션에서 설명합니다. |
X-Amz-Security-Token |
STS 서비스에서 가져온 보안 인증 정보를 사용하는 경우의 선택적 보안 자격 증명 파라미터입니다. |
서명 계산
다음 다이어그램은 서명 계산 프로세스를 보여줍니다.
다음 표에서는 다이어그램에 표시된 함수를 설명합니다. 이러한 함수의 코드를 구현해야 합니다.
| 함수 | 설명 |
|---|---|
Lowercase() |
문자열을 소문자로 변환합니다. |
Hex() |
소문자 16진법 인코딩. |
SHA256Hash() |
보안 해시 알고리즘(SHA) 암호화 해시 함수. |
HMAC-SHA256() |
제공된 서명 키를 포함한 SHA256 알고리즘을 사용하여 HMAC를 계산합니다. 이것이 최종 서명입니다. |
Trim() |
선행 또는 후행 공백을 모두 제거합니다. |
UriEncode() |
URI는 모든 바이트를 인코딩합니다. UriEncode()는 다음 규칙을 적용해야 합니다.
중요개발 플랫폼에서 제공하는 표준 UriEncode 함수는 구현상의 차이와 기본 RFC의 관련 모호성으로 인해 효과적이지 않을 수 있습니다. 인코딩이 제대로 작동하도록 사용자 지정 UriEncode 함수를 직접 작성하는 것이 좋습니다. 다음은 Java로 작성된 UriEncode() 함수 예제입니다.
|
서명 프로세스에 대한 자세한 내용(정식 요청 생성, 서명할 문자열 및 서명 계산에 대한 세부 정보)은 Authorization 헤더에 대한 서명 계산: 페이로드를 단일 청크로 전송(AWS 서명 버전 4) 섹션을 참조하세요. 미리 서명된 URL에서 CanonicalRequest를 생성하는 것이 다음과 같이 다르다는 점을 제외하면 프로세스는 전반적으로 동일합니다.
-
미리 서명된 URL을 생성할 때는 임의의 페이로드를 업로드하는 데 해당 URL이 사용되므로 페이로드 콘텐츠를 알 수 없습니다. 따라서 정식 요청에 페이로드 해시를 포함하지 않습니다. 대신 상수 문자열
UNSIGNED-PAYLOAD를 사용합니다. -
정식 쿼리 문자열에는
X-Amz-Signature를 제외하고 위 표의 모든 쿼리 파라미터가 포함되어야 합니다. -
S3의 경우 STS 서비스에서 가져온 자격 증명을 사용한다면 URL에
X-Amz-Security-Token쿼리 파라미터를 포함해야 합니다. -
정식 헤더에는 HTTP
host헤더가 포함되어야 합니다.x-amz-*헤더를 포함하려는 경우 서명 계산을 위해 이러한 헤더도 추가해야 합니다. 선택적으로 요청에 포함하려는 다른 모든 헤더를 추가할 수 있습니다. 보안을 강화하려면 가능한 한 많은 헤더에 서명해야 합니다. 서명된 쿼리 파라미터이기도 한 서명된 헤더를 추가하는 경우 값이 서로 다르면 입력이 충돌하여InvalidRequest오류가 발생합니다.
예제
examplebucket 버킷에 test.txt 객체가 있다고 가정해 보겠습니다. 미리 서명된 URL을 생성하여 24시간(86,400초) 동안 이 객체를 다른 사람과 공유하려고 합니다.
https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>
다음 단계에서는 먼저 서명 계산을 설명한 다음 미리 서명된 URL 구성을 설명합니다. 이 예제에서는 다음을 추가로 가정합니다.
-
요청 타임스탬프는
Fri, 24 May 2013 00:00:00 GMT입니다. -
버킷은 미국 동부(버지니아 북부) 리전에 있으며, 자격 증명
Scope및Signing Key계산은us-east-1을 리전 지정자로 사용합니다. 자세한 내용은 AWS 일반 참조의 리전 및 엔드포인트를 참조하세요.
이 예제를 테스트 사례로 사용하여 코드가 계산하는 서명을 확인할 수 있습니다. 단, 동일한 버킷 이름, 객체 키, 타임스탬프 및 다음 예제 자격 증명을 사용해야 합니다.
| 파라미터 | 값 |
|---|---|
AWSAccessKeyId |
AKIAIOSFODNN7EXAMPLE |
AWSSecretAccessKey |
wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
-
StringToSign
-
CanonicalRequest
GET /test.txt X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host host:examplebucket.s3.amazonaws.com host UNSIGNED-PAYLOAD -
StringToSign
AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04
-
-
SigningKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request") -
서명
aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404이제 미리 서명된 URL을 구성하는 데 필요한 모든 정보를 얻었습니다. 이 예제의 결과 URL은 다음과 같습니다(이 URL을 사용하여 미리 서명된 URL을 비교할 수 있음).
https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404
예제 2
다음은 X-Amz-Security-Token 파라미터와 함께 미리 서명된 URL을 보여주는 예제입니다(이전 예제와 관련이 없음).
https://examplebucket.s3.us-east-1.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20200524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Security-Token=IQoJb3JpZ2luX2VjEMv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJGMEQCIBSUbVdj9YGs2g0HkHsOHFdkwOozjARSKHL987NhhOC8AiBPepRU1obMvIbGU0T%2BWphFPgK%2Fqpxaf5Snvm5M57XFkCqlAgjz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDQ3MjM4NTU0NDY2MCIM83pULBe5%2F%2BNm1GZBKvkBVslSaJVgwSef7SsoZCJlfJ56weYl3QCwEGr2F4BmCZZyFpmWEYzWnhNK1AnHMj5nkfKlKBx30XAT5PZGVrmq4Vkn9ewlXQy1Iu3QJRi9Tdod8Ef9%2FyajTaUGh76%2BF5u5a4O115jwultOQiKomVwO318CO4l8lv%2F3HhMOkpdanMXn%2B4PY8lvM8RgnzSu90jOUpGXEOAo%2F6G8OqlMim3%2BZmaQmasn4VYRvESEd7O72QGZ3%2BvDnDVnss0lSYjlv8PP7IujnvhZRnj0WoeOyMe1lL0wTG%2Fa9usH5hE52w%2FYUJccOn0OaZuyROuVsRV4Q70sbWQhUvYUt%2B0tUMKzm8vsFOp4BaNZFqobbjtb36Y92v%2Bx5kY6i0s8QE886jJtUWMP5ldMziClGx3p0mN5dzsYlM3GyiJ%2FO1mWkPQDwg3mtSpOA9oeeuAMPTA7qMqy9RNuTKBDSx9EW27wvPzBum3SJhEfxv48euadKgrIX3Z79ruQFSQOc9LUrDjR%2B4SoWAJqK%2BGX8Q3vPSjsLxhqhEMWd6U4TXcM7ku3gxMbzqfT8NDg%3D &X-Amz-Signature=<signature-value>