Amazon Web Services
일반 참조 (버전 1.0)

작업 1: 서명 버전 4에 대한 표준 요청 생성

서명 프로세스를 시작하려면 표준화된(표준) 형식의 요청 정보를 포함하는 문자열을 생성합니다. 그러면 AWS에서 요청을 수신한 후 사용자가 계산한 것과 동일한 서명을 계산할 수 있습니다.

이 단계에 따라 표준 버전의 요청을 생성합니다. 그렇지 않으면 사용자의 버전이 AWS에서 계산된 버전과 일치하지 않으므로 요청이 거부됩니다.

다음 예에서는 표준 요청을 생성하는 유사 코드를 보여줍니다.

예 표준 요청 유사 코드

CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))

이 유사 코드에서 Hash는 메시지 다이제스트를 생성하는 기능을 나타내며 일반적으로 SHA-256입니다. (프로세스 후반에서 사용 중인 해시 알고리즘을 지정합니다.) HexEncode는 16진수를 기반으로 하는 다이제스트 인코딩을 소문자로 반환하는 기능입니다. 예를 들어, HexEncode("m")6D 대신 6d를 값으로 반환합니다. 각 입력 바이트를 정확히 두 개의 16진수 문자로 표시해야 합니다.

서명 버전 4에서는 특정 문자 인코딩을 사용하여 표준 요청을 인코딩하도록 요구하지 않습니다. 하지만 일부 AWS 서비스에서는 특정 인코딩이 필요할 수 있습니다. 자세한 내용은 해당 서비스에 대한 문서를 참조하십시오.

다음 예에서는 IAM에 대한 표준 요청을 구성하는 방법을 보여줍니다. 이 예에는 서명 정보가 아직 포함되어 있지 않지만, 이 점만 제외하면 클라이언트가 AWS에 보낸 원래 요청을 그대로 보여줍니다.

예 요청

GET https://iam.amazonaws.com/?Action=ListUsers&Version=2010-05-08 HTTP/1.1 Host: iam.amazonaws.com Content-Type: application/x-www-form-urlencoded; charset=utf-8 X-Amz-Date: 20150830T123600Z

이전 예제 요청은 AWS Identity and Access Management(호스트)에 대한 ListUsers API(작업) 호출을 만드는 GET 요청(메서드)입니다. 이 작업에서는 Version 파라미터를 사용합니다.

표준 요청을 생성하려면 각 단계에서 다음 구성 요소를 하나의 문자열로 연결합니다.

  1. HTTP 요청 메서드(GET, PUT, POST 등)로 시작하고 그 뒤에 줄 바꿈 문자가 옵니다.

    예 요청 메서드

    GET
  2. 표준 URI 파라미터를 추가하고 그 뒤에 줄 바꿈 문자를 지정합니다. 표준 URI는 URI 절대 경로 구성 요소의 URI로 인코딩된 버전이며, HTTP 호스트부터 쿼리 문자열 파라미터(있는 경우)를 시작하는 물음표 문자("?")까지 URI의 모든 내용을 나타냅니다.

    RFC 3986에 따라 URI 경로를 정규화합니다. 중복 및 상대 경로 구성 요소를 제거합니다. 각 경로 세그먼트는 두 번 URI로 인코딩되어야 합니다(한 번만 URI로 인코딩되는 Amazon S3는 제외).

    예 인코딩을 사용하는 표준 URI

    /documents%2520and%2520settings/

    참고

    이 경우를 제외하고 Amazon S3에 대한 요청의 URI 경로를 정규화하지 않습니다. 예를 들어 이름이 my-object//example//photo.user인 객체를 포함하는 버킷이 있는 경우, 해당 경로를 사용합니다. my-object/example/photo.user에 대한 경로를 정규화하면 요청이 실패합니다. 자세한 내용은 Amazon Simple Storage Service API Reference작업 1: 정식 요청 생성을 참조하십시오.

    절대 경로가 비어있는 경우, 슬래시(/)를 사용합니다. 예제 IAM 요청에서는 URI의 호스트 뒤에 아무것도 오지 않으므로 절대 경로가 비어 있습니다.

    예 표준 URI

    /
  3. 표준 쿼리 문자열을 추가하고 그 뒤에 줄 바꿈 문자를 입력합니다. 요청에 쿼리 문자열이 포함되어 있지 않은 경우, 빈 문자열(빈 줄)을 사용하십시오. 예제 요청의 쿼리 문자열은 다음과 같습니다.

    예 표준 쿼리 문자열

    Action=ListUsers&Version=2010-05-08

    표준 쿼리 문자열을 생성하려면 다음 단계를 완료하십시오.

    1. 문자 코드 포인트를 기준으로 파라미터 이름을 오름차순으로 정렬합니다. ​중복된 이름을 가진 파라미터는 값별로 정렬해야 합니다. 예를 들어 대문자 F로 시작하는 파라미터 이름 앞에 소문자 b로 시작하는 파라미터 이름이 옵니다.

    2. 다음 규칙에 따라 각 파라미터 이름과 값을 URI 인코딩합니다.

      • 예약되지 않은 문자는 URI로 인코딩하지 않습니다. RFC 3986에 정의된 예약되지 않은 문자는 A-Z, a-z, 0-9, 하이픈( - ), 밑줄( _ ), 마침표( . ) 및 물결표( ~ )입니다.

      • %XY와 같이 모든 기타 문자를 퍼센트 인코딩합니다. 여기서 X 및 Y는 16진 문자(0 ~ 9 및 대문자 A ~ F)입니다. 예를 들어 공백 문자는 %20(일부 인코딩 구조인 +가 아님)로 인코딩되고, 확장 UTF-8 문자는 %XY%ZA%BC 형식이어야 합니다.

    3. 정렬된 목록의 첫 번째 파라미터 이름으로 시작하여 표준 쿼리 문자열을 빌드합니다.

    4. 각 파라미터에 대해 URI로 인코딩된 파라미터 이름을 추가하고 그 뒤에 등호(=), URI로 인코딩된 파라미터 값을 순서대로 추가합니다. 값이 없는 파라미터의 경우, 빈 문자열을 사용하십시오.

    5. 목록의 마지막 값을 제외하고 각 파라미터 값 뒤에 앰퍼샌드(&) 문자를 추가합니다.

    쿼리 API에 대한 한 가지 옵션으로 쿼리 문자열에 요청 파라미터를 모두 입력할 수 있습니다. 예를 들어, 미리 서명된 URL을 만들려면 Amazon S3에 대해 이 작업을 수행할 수 있습니다. 이 경우, 표준 쿼리 문자열은 요청에 대한 파라미터뿐 아니라 서명 프로세스의 일부로 사용되는 파라미터, 즉 해시 알고리즘, 자격 증명 범위, 날짜, 서명된 헤더 파라미터도 포함해야 합니다.

    다음 예에서는 인증 정보를 포함하는 쿼리 문자열을 보여줍니다. 이 예에서는 이해를 돕기 위해 줄 바꿈을 적용하여 서식이 지정되었지만, 코드의 표준 쿼리 문자열은 연속하는 한 줄의 텍스트로 되어 있어야 합니다.

    예 쿼리 문자열의 인증 파라미터

    Action=ListUsers& Version=2010-05-08& X-Amz-Algorithm=AWS4-HMAC-SHA256& X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fiam%2Faws4_request& X-Amz-Date=20150830T123600Z& X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-date

    인증 파라미터에 대한 자세한 내용은 작업 2: 서명 버전 4에 대한 서명할 문자열 생성 단원을 참조하십시오.

    참고

    AWS Security Token Service(AWS STS)에 제공되는 임시 보안 자격 증명을 사용하여 요청에 서명할 수 있습니다. 프로세스는 장기 자격 증명을 사용하는 것과 동일하지만 쿼리 문자열에 서명 정보를 추가할 경우, 보안 토큰에 대한 쿼리 파라미터를 추가해야 합니다. 파라미터 이름은 X-Amz-Security-Token이고 파라미터 값은 URI로 인코딩된 세션 토큰(임시 보안 자격 증명을 가져올 때 AWS STS에서 수신한 문자열)입니다.

    일부 서비스의 경우, 표준(서명된) 쿼리 문자열에 X-Amz-Security-Token 쿼리 파라미터를 포함해야 합니다. 다른 서비스의 경우, 서명을 계산한 이후에 X-Amz-Security-Token 파라미터를 끝에 추가합니다. 자세한 내용은 해당 서비스에 대한 API 참조 문서를 참조하십시오.

  4. 표준 헤더를 추가하고 그 뒤에 줄 바꿈 문자를 입력합니다. 표준 헤더는 서명된 요청에 포함할 모든 HTTP 헤더의 목록으로 구성되어 있습니다.

    HTTP/1.1 요청의 경우에는 최소한 host 헤더는 반드시 포함해야 합니다. content-type 같은 표준 헤더는 선택사항입니다. HTTP/2 요청의 경우에는 :authority 헤더가 아닌 host 헤더를 포함해야 합니다. 서비스마다 다른 헤더가 필요할 수도 있습니다.

    예 표준 헤더

    content-type:application/x-www-form-urlencoded; charset=utf-8\n host:iam.amazonaws.com\n x-amz-date:20150830T123600Z\n

    표준 헤더 목록을 생성하려면 모든 헤더 이름을 소문자로 변환하고 선행 공백과 후행 공백을 제거합니다. 헤더 값의 순차적 공백을 단일 공백으로 변환합니다.

    다음 유사 코드에서는 헤더의 표준 목록을 생성하는 방법을 설명합니다.

    CanonicalHeaders = CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ... + CanonicalHeadersEntryN CanonicalHeadersEntry = Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'

    Lowercase는 모든 문자를 소문자로 변환하는 함수를 나타냅니다. Trimall 함수는 값의 앞/뒤에 있는 초과 공백을 제거하고 순차적 공백을 단일 공백으로 변환합니다.

    (소문자) 헤더를 문자 코드로 정렬한 다음 헤더 이름을 반복하여 표준 헤더 목록을 생성합니다. 다음 규칙에 따라 각 헤더를 작성합니다.

    • 소문자 헤더 이름과 콜론을 차례대로 추가합니다.

    • 헤더에 대한 쉼표로 구분된 값 목록을 추가합니다. 여러 값을 가진 헤더에서 값을 정렬하지 마십시오.

    • 새 줄('\n')을 추가합니다.

    다음 예에서는 더 복잡한 헤더를 표준 양식과 비교합니다.

    예 원래 헤더

    Host:iam.amazonaws.com\n Content-Type:application/x-www-form-urlencoded; charset=utf-8\n My-header1:    a   b   c \n X-Amz-Date:20150830T123600Z\n My-Header2:    "a   b   c" \n

    예 표준 양식

    content-type:application/x-www-form-urlencoded; charset=utf-8\n host:iam.amazonaws.com\n my-header1:a b c\n my-header2:"a b c"\n x-amz-date:20150830T123600Z\n

    참고

    각 헤더 뒤에 줄 바꿈 문자가 옵니다. 즉, 전체 목록이 줄 바꿈 문자로 끝납니다.

    표준 양식에서 다음과 같이 변경했습니다.

    • 헤더 이름을 소문자로 변환했습니다.

    • 헤더를 문자 코드별로 정렬했습니다.

    • 선행 공백과 후행 공백을 my-header1my-header2 값에서 제거했습니다.

    • a b c의 순차적 공백을 my-header1my-header2 값에 대해 단일 공백으로 변환했습니다.

    참고

    AWS Security Token Service(AWS STS)에 제공되는 임시 보안 자격 증명을 사용하여 요청에 서명할 수 있습니다. 프로세스는 장기 자격 증명을 사용하는 것과 동일하지만, Authorization 헤더에 서명 정보를 포함할 경우 보안 토큰에 대한 HTTP 헤더를 추가해야 합니다. 헤더 이름은 X-Amz-Security-Token이고 헤더의 값은 세션 토큰(임시 보안 자격 증명을 가져올 때 AWS STS에서 수신한 문자열)입니다.

  5. 서명된 헤더를 추가하고 그 뒤에 줄 바꿈 문자를 입력합니다. 이 값은 표준 헤더에 포함된 헤더의 목록입니다. 이 헤더 목록을 추가하여 요청에서 서명 프로세스의 일부인 헤더와 요청 검증을 위해 무시할 수 있는 헤더(예: 프록시에 의해 추가된 헤더)를 AWS에 알려줍니다.

    HTTP/1.1 요청의 경우 host 헤더는 서명된 헤더로 포함되어야 합니다. :authority 헤더가 아닌 host 헤더를 포함하는 HTTP/2 요청의 경우에는 :authority 헤더를 서명된 헤더로 포함해야 합니다 날짜 또는 x-amz-date 헤더를 포함할 경우, 서명된 헤더 목록에 해당 헤더를 포함해야 합니다.

    서명된 헤더 목록을 생성하려면 모든 헤더 이름을 소문자로 변환한 다음 문자 코드를 기준으로 정렬하고 세미콜론을 사용하여 헤더 이름을 구분합니다. 다음 유사 코드에서는 서명된 헤더 목록을 생성하는 방법을 설명합니다. Lowercase는 모든 문자를 소문자로 변환하는 함수를 나타냅니다.

    SignedHeaders = Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ... + Lowercase(HeaderNameN)

    헤더 이름 모음을 반복하고 소문자 문자 코드를 기준으로 정렬하여 서명된 헤더 목록을 생성합니다. 마지막 항목을 제외한 각 헤더 이름에 대해 세미콜론(';')을 추가하여 다음 헤더 이름과 구분합니다.

    예 서명된 헤더

    content-type;host;x-amz-date\n
  6. SHA256과 같은 해시(다이제스트) 함수를 사용하여 HTTP 또는 HTTPS 요청의 본문에 있는 페이로드에서 해시된 값을 생성합니다. 서명 버전 4에서는 특정 문자 인코딩을 사용하여 페이로드의 텍스트를 인코딩하도록 요구하지 않습니다. 하지만 일부 AWS 서비스에서는 특정 인코딩이 필요할 수 있습니다. 자세한 내용은 해당 서비스에 대한 문서를 참조하십시오.

    예 페이로드의 구조

    HashedPayload = Lowercase(HexEncode(Hash(requestPayload)))

    서명할 문자열을 생성할 때 페이로드를 해시하는 데 사용한 서명 알고리즘을 지정합니다. 예를 들어 SHA256을 사용한 경우, AWS4-HMAC-SHA256을 서명 알고리즘으로 지정합니다. 해시된 페이로드를 소문자 16진수 문자열로 표시해야 합니다.

    페이로드가 비어 있는 경우, 빈 문자열을 해시 함수에 대한 입력으로 사용합니다. IAM 예에는 페이로드가 비어 있습니다.

    예 해시된 페이로드(빈 문자열)

    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  7. 완성된 표준 요청을 작성하려면 각 단계의 모든 구성 요소를 단일 문자열로 결합합니다. 언급한 바와 같이 각 구성 요소는 줄 바꿈 문자로 끝납니다. 앞서 설명한 표준 요청 유사 코드를 따를 경우, 결과 표준 요청은 다음 예에 나와 있습니다.

    예 표준 요청

    GET / Action=ListUsers&Version=2010-05-08 content-type:application/x-www-form-urlencoded; charset=utf-8 host:iam.amazonaws.com x-amz-date:20150830T123600Z content-type;host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  8. 페이로드를 해시하는 데 사용한 것과 동일한 알고리즘을 사용하여 표준 요청의 다이제스트(해시)를 생성합니다.

    참고

    서명 버전 4에서는 다이제스트를 계산하기 이전에 특정 문자 인코딩을 사용하여 표준 요청을 인코딩하도록 요구하지 않습니다. 하지만 일부 AWS 서비스에서는 특정 인코딩이 필요할 수 있습니다. 자세한 내용은 해당 서비스에 대한 문서를 참조하십시오.

    해시된 표준 요청은 소문자 16진수 문자열로 표시되어야 합니다. 다음 예에서는 SHA-256을 사용하여 예제 표준 요청을 해시할 때의 결과를 보여줍니다.

    예 해시된 표준 요청

    f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59

    해시된 표준 요청을 작업 2: 서명 버전 4에 대한 서명할 문자열 생성에 서명할 문자열의 일부로 포함합니다.