View a markdown version of this page

요청 인증: 쿼리 파라미터 사용(AWS 서명 버전 4) - Amazon Simple Storage Service

요청 인증: 쿼리 파라미터 사용(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의 경우 이 파라미터 값을 AWS4-HMAC-SHA256으로 설정합니다. 이 문자열은 AWS 서명 버전 4(AWS4) 및 HMAC-SHA256 알고리즘(HMAC-SHA256)을 식별합니다.

X-Amz-Credential

이 파라미터는 액세스 키 ID 외에도 서명이 유효한 범위(AWS 리전 및 서비스)를 제공합니다. 이 값은 다음 섹션의 설명과 같이 서명 계산에 사용하는 범위와 일치해야 합니다. 이 파라미터의 값의 일반적인 형식은 다음과 같습니다.

<your-access-key-id>/<date>/<AWS 리전>/<AWS-service>/aws4_request

예제:

AKIAIOSFODNN7EXAMPLE/20130721/us-east-1/s3/aws4_request

Amazon S3의 경우 AWS-service 문자열은 s3입니다. S3 AWS-region 문자열의 목록은 AWS 일반 참조리전 및 엔드포인트를 참조하세요.

X-Amz-Date

날짜 및 시간 형식은 ISO 8601 표준을 따르고, 'yyyyMMddTHHmmssZ' 형식을 사용해야 합니다. 예를 들어 날짜와 시간이 ‘08/01/2016 15:32:41.982-700’인 경우 UTC(협정 세계시)로 변환하여 ‘20160801T223241Z’로 제출해야 합니다.

X-Amz-Expires

생성된 미리 서명된 URL이 유효한 기간(초)을 제공합니다. 예: 86400(24시간). 이 값은 정수입니다. 설정할 수 있는 최소값은 1이고 최대값은 604800(7일)입니다.

서명 계산에 사용하는 서명 키는 최대 7일 동안 유효하므로 미리 서명된 URL은 최대 7일 동안 유효할 수 있습니다.

X-Amz-SignedHeaders

서명 계산에 사용한 헤더를 나열합니다. 서명 계산에는 다음 헤더가 필요합니다.

  • HTTP host 헤더.

  • 요청에 추가하려는 모든 x-amz-* 헤더.

참고

보안을 강화하려면 요청에 포함하려는 모든 요청 헤더에 서명해야 합니다.

X-Amz-Signature

요청을 인증하기 위한 서명을 제공합니다. 이 서명은 Amazon S3가 계산하는 서명과 일치해야 합니다. 그렇지 않으면 Amazon S3가 요청을 거부합니다. 예: 733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7

서명 계산은 다음 섹션에서 설명합니다.

X-Amz-Security-Token

STS 서비스에서 가져온 보안 인증 정보를 사용하는 경우의 선택적 보안 자격 증명 파라미터입니다.

서명 계산

다음 다이어그램은 서명 계산 프로세스를 보여줍니다.

정식 요청, 서명할 문자열 및 서명 생성 단계를 포함하는 AWS 서명 버전 4 서명 프로세스입니다.

다음 표에서는 다이어그램에 표시된 함수를 설명합니다. 이러한 함수의 코드를 구현해야 합니다.

함수 설명
Lowercase() 문자열을 소문자로 변환합니다.
Hex() 소문자 16진법 인코딩.
SHA256Hash() 보안 해시 알고리즘(SHA) 암호화 해시 함수.
HMAC-SHA256() 제공된 서명 키를 포함한 SHA256 알고리즘을 사용하여 HMAC를 계산합니다. 이것이 최종 서명입니다.
Trim() 선행 또는 후행 공백을 모두 제거합니다.
UriEncode()

URI는 모든 바이트를 인코딩합니다. UriEncode()는 다음 규칙을 적용해야 합니다.

  • URI는 예약되지 않은 문자를 제외한 모든 바이트를 인코딩합니다. 'A'-'Z', 'a'-'z', '0'-'9', '-', '.', '_' 및 '~'.

  • 공백 문자는 예약된 문자이고 ‘+’가 아닌 ‘%20’로 인코딩되어야 합니다.

  • 각 URI 인코딩 바이트는 '%' 및 바이트의 두 자리 16진수 값으로 구성됩니다.

  • 16진수 값의 문자는 대문자여야 합니다(예: ‘%1A’).

  • 슬래시 문자('/')를 객체 키 이름을 제외한 모든 위치에 인코딩합니다. 예를 들어, 객체 키 이름이 photos/Jan/sample.jpg인 경우 키 이름의 슬래시는 인코딩되지 않습니다.

중요

개발 플랫폼에서 제공하는 표준 UriEncode 함수는 구현상의 차이와 기본 RFC의 관련 모호성으로 인해 효과적이지 않을 수 있습니다. 인코딩이 제대로 작동하도록 사용자 지정 UriEncode 함수를 직접 작성하는 것이 좋습니다.

다음은 Java로 작성된 UriEncode() 함수 예제입니다.

public static String UriEncode(CharSequence input, boolean encodeSlash) { StringBuilder result = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') { result.append(ch); } else if (ch == '/') { result.append(encodeSlash ? "%2F" : ch); } else { result.append(toHexUTF8(ch)); } } return result.toString(); }

서명 프로세스에 대한 자세한 내용(정식 요청 생성, 서명할 문자열 및 서명 계산에 대한 세부 정보)은 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입니다.

  • 버킷은 미국 동부(버지니아 북부) 리전에 있으며, 자격 증명 ScopeSigning Key 계산은 us-east-1을 리전 지정자로 사용합니다. 자세한 내용은 AWS 일반 참조리전 및 엔드포인트를 참조하세요.

이 예제를 테스트 사례로 사용하여 코드가 계산하는 서명을 확인할 수 있습니다. 단, 동일한 버킷 이름, 객체 키, 타임스탬프 및 다음 예제 자격 증명을 사용해야 합니다.

파라미터
AWSAccessKeyId AKIAIOSFODNN7EXAMPLE
AWSSecretAccessKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  1. StringToSign
    1. 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

    2. StringToSign

      AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04

  2. SigningKey

    signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request")

  3. 서명

    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>