기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
서명된AWS API 요청 생성
다음은 서명된 요청을 만드는 프로세스를 요약한 것입니다. 자세한 내용은 AWSSDK의 코드 예제를 참조하십시오.
1단계: 표준 요청 생성
다음 문자열을 개행 문자로 구분하여 연결하여 표준 요청을 생성합니다. 이렇게 하면 계산한 서명과 계산하는 서명이 일치하는지 확인할 수 있습니다.AWS
HTTPMethod
CanonicalUri
CanonicalQueryString
CanonicalHeaders
SignedHeaders
HashedPayload
-
HTTP 메서드
— HTTP 메서드입니다. -
CanonicalUri
— 절대 경로 구성 요소 URL의 URI 인코딩 버전 (호스트와 물음표 문자 사이의 모든 항목 (?) 그러면 쿼리 문자열 매개 변수가 시작됩니다. 절대 경로가 비어 있는 경우 슬래시 문자 (/) 를 사용하십시오. -
CanonicalQueryString
— URL로 인코딩된 쿼리 문자열 매개 변수로, 앰퍼샌드 (&) 로 구분됩니다. 공백 문자를 포함한 예약 문자를 퍼센트 인코딩합니다. 이름과 값을 별도로 인코딩합니다. 빈 매개 변수가 있는 경우 인코딩하기 전에 매개 변수 이름에 등호를 추가하십시오. 인코딩 후 키 이름을 기준으로 파라미터를 알파벳순으로 정렬합니다. 쿼리 문자열이 없는 경우 빈 문자열 (“”) 을 사용하십시오. -
CanonicalHeaders
— 서명될 요청 헤더와 해당 값은 줄 바꿈 문자로 구분됩니다. 헤더 이름은 소문자를 사용해야 하며 다음에는 콜론 (:) 이 와야 합니다. 값의 경우 선행 또는 후행 공백을 모두 제거하고 순차 공백을 단일 공백으로 변환하고 다중 값 헤더의 값을 쉼표로 구분합니다.host
헤더 (HTTP/1.1) 또는:authority
헤더 (HTTP/2) 및 모든x-amz-*
헤더를 서명에 포함해야 합니다. 서명에 다른 표준 헤더 (예:) 를 선택적으로 포함할 수content-type
있습니다. -
SignedHeaders
— 포함된 헤더 목록으로CanonicalHeaders
, 세미콜론 (;) 으로 구분됩니다. 이는 서명 프로세스의 일부인 헤더를 나타냅니다. 헤더 이름은 소문자를 사용해야 하며 알파벳 순서로 표시되어야 합니다. -
HashedPayload
— HTTP 요청 본문의 페이로드를 해시 함수의 입력으로 사용하여 만든 문자열입니다. 이 문자열은 소문자 16진수 문자를 사용합니다. 페이로드가 비어 있는 경우, 빈 문자열을 해시 함수에 대한 입력으로 사용합니다.
다음은 Amazon EC2DescribeInstances
API 작업을 호출하는 표준 요청의 예입니다.
GET
/
Action=DescribeInstances&Version=2016-11-15
content-type:application/x-www-form-urlencoded; charset=utf-8
host:ec2.amazonaws.com
x-amz-date:20220830T123600Z
host;x-amz-date
payload-hash
2단계: 표준 요청의 해시 생성
페이로드의 해시를 생성하는 데 사용한 것과 동일한 알고리즘을 사용하여 표준 요청의 해시 (다이제스트) 를 생성합니다. 표준 요청의 해시는 소문자 16진수 문자로 구성된 문자열입니다.
3단계: 서명할 문자열 생성
다음 문자열을 줄 바꿈 문자로 구분하여 연결하여 문자열을 만듭니다. 이 문자열을 줄바꿈 문자로 끝내지 마십시오.
Algorithm
RequestDateTime
CredentialScope
HashedCanonicalRequest
-
알고리즘
— 표준 요청의 해시를 생성하는 데 사용되는 알고리즘입니다. SHA-256 알고리즘은 다음과 같습니다AWS4-HMAC-SHA256
. -
RequestDateTime
— 자격 증명 범위에 사용된 날짜 및 시간 -
CredentialScope
— 자격 증명 범위 이렇게 하면 결과 서명이 지정된 지역 및 서비스로 제한됩니다. 문자열의 형식은 다음과 같습니다.YYYYMMDD
/지역
/서비스
/aws4_request. -
HashedCanonicalRequest
— 표준 요청의 해시입니다.
다음은 예와 같은 문자입니다.
AWS4-HMAC-SHA256
20220830T123600Z
20220830/us-east-1/ec2/aws4_request
canonical-request-hash
4단계: 서명 계산
서명할 문자열을 만들었으면 요청에 추가할 인증 정보에 대한 서명을 계산할 수 있습니다. 각 단계마다 필요한 키와 데이터를 사용하여 해시 함수를 호출합니다.
hash(key, data)
해시 함수에 대한 각 호출의 결과는 다음 해시 함수 호출의 입력값이 됩니다.
필수 입력
보안 액세스 키가 포함된 문자열
Key
자격 증명 범위에 사용된 날짜를 YYYYMMDD 형식으로 포함하는 문자열
Date
지역 코드가 포함된 문자열 (예:
us-east-1
)Region
서비스 코드가 포함된 문자열 (예:
ec2
)Service
이전 단계에서 만든 서명할 문자입니다.
서명을 계산하려면
-
“AWS4"와 보안 액세스 키를 연결합니다. 연결된 문자열을 키로, 날짜 문자열을 데이터로 사용하여 해시 함수를 호출합니다.
kDate = hash("AWS4" + Key, Date)
-
이전 호출 결과를 키로, Region 문자열을 데이터로 사용하여 해시 함수를 호출합니다.
kRegion = hash(kDate, Region)
-
이전 호출 결과를 키로, 서비스 문자열을 데이터로 사용하여 해시 함수를 호출합니다.
kService = hash(kRegion, Service)
-
이전 호출 결과를 키로, “aws4_request”를 데이터로 사용하여 해시 함수를 호출합니다.
kSigning = hash(kService, "aws4_request")
-
이전 호출 결과를 키로, 서명할 문자열을 데이터로 사용하여 해시 함수를 호출합니다. 결과는 이진수 값으로서의 서명입니다.
signature = hash(kSigning,
string-to-sign
) -
서명을 2진수에서 16진수 표현으로 소문자로 변환합니다.
5단계: 서명을 추가
HTTPAuthorization
헤더 또는 쿼리 문자열 파라미터를 사용하여 요청에 인증 정보를 추가할 수 있습니다. Authorization
헤더 및 쿼리 문자열 매개 변수를 모두 사용하여 인증 정보를 추가할 수는 없습니다.
예: 인증 헤더
다음 예에서는DescribeInstances
작업의Authorization
헤더를 보여 줍니다. 이 예제는 가독성을 높이기 위해 줄 바꿈으로 서식을 지정했습니다. 코드에서 이 문자열은 연속형 문자열이어야 합니다. 알고리즘과 Credential
사이에 쉼표는 없습니다. 그러나 다른 요소는 구분해야 합니다.
Authorization: AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request,
SignedHeaders=host;x-amz-date,
Signature=calculated-signature
예: 쿼리 문자열에 인증 파라미터가 포함된 요청
다음 예와 같은DescribeInstances
쿼리를 보여줍니다. 이 예제는 가독성을 위해 줄 바꿈으로 서식이 지정되었으며 URL로 인코딩되지 않았습니다. 코드에서 쿼리 문자열은 URL로 인코딩된 연속 문자열이어야 합니다.
https://ec2.amazonaws.com/?
Action=DescribeInstances&
Version=2016-11-15&
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request&
X-Amz-Date=20220830T123600Z&
X-Amz-SignedHeaders=host;x-amz-date&
X-Amz-Signature=calculated-signature
임시 보안 자격 증명
장기 자격 증명을 사용하여 요청에 서명하는 대신AWS Security Token Service (AWS STS) 에서 제공하는 임시 보안 자격 증명을 사용할 수 있습니다.
임시 보안 자격 증명을 사용하는 경우 Authorization 헤더 또는 쿼리 문자열에 세션 토큰을X-Amz-Security-Token
저장하도록 추가해야 합니다. 일부 서비스의 경우 표준 요청에X-Amz-Security-Token
추가해야 합니다. 다른 서비스는 서명을 계산한 후X-Amz-Security-Token
마지막에 추가하기만 하면 됩니다. 자세한AWS 서비스 내용은 각 설명서를 참조하십시오.
AWSSDK의 코드 예제
AWSSDK에는AWS API 요청에 서명하는 방법을 GitHub 보여주는 소스 코드가 포함되어 있습니다.
-
AWS SDK for .NET— AWS4Signer.cs
-
AWS SDK for C++— AWSAuthV4Signer.cpp
-
AWS SDK for Go— v4.go
-
AWS SDK for Java— BaseAws4Signer.java
-
AWS SDK for JavaScript— v4.js
-
AWS SDK for PHP— SignatureV4.php
-
AWS SDK for Python (Boto)— signers.py
-
AWS SDK for Ruby— signer.rb