API Gateway에 대한 IAM 인증을 사용하여 SigV4로 서명된 요청을 할 때 서명 불일치 오류를 해결하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2022년 9월 22일

Amazon API Gateway에 대한 Signature Version 4(SigV4)의 서명 요청이 403 응답 및 다음과 유사한 오류로 인해 실패했습니다.

"The request signature we calculated does not match the signature you provided(계산한 요청 서명이 제공한 서명과 일치하지 않습니다). Check your AWS Secret Access Key and signing method(AWS 비밀 액세스 키와 서명 방법을 확인하세요)."

이 문제를 해결하려면 어떻게 해야 하나요?

간략한 설명

AWS Identity and Access Management(IAM) 인증을 사용하는 API Gateway API 엔드포인트는 다음과 같은 경우 403 오류를 반환할 수 있습니다.

  • API 요청은 서명되지 않았으며 API 요청은 IAM 인증을 사용합니다.
  • 요청에 서명하는 데 사용된 IAM 보안 인증이 잘못되었거나 API를 호출할 권한이 없습니다.
  • 서명된 API 요청의 서명이 API Gateway API 엔드포인트의 서명과 일치하지 않습니다.
  • API 요청 헤더가 올바르지 않습니다.

해결 방법

IAM 인증

IAM 인증을 사용하는 API 요청이 SigV4로 서명되었는지 확인합니다. API 요청이 서명되지 않은 경우 'Missing Authentication Token(인증 토큰 누락)' 오류가 발생할 수 있습니다.

IAM 보안 인증

액세스 키 및 비밀 키의 보안 인증 자격 증명이 올바른지 확인하세요. 액세스 키가 잘못된 경우 다음과 같은 오류 메시지가 표시될 수 있습니다. 'The security token included in the request is invalid(요청에 포함된 보안 토큰이 유효하지 않습니다).'

요청에 서명하는 데 사용된 IAM 개체에 execute-api:Invoke 권한이 있는지 확인하세요. IAM 개체에 execute-api:Invoke 권한이 없는 경우 다음과 같은 오류 메시지가 표시될 수 있습니다. 'User: arn:aws:iam::xxxxxxxxxxxxxxxxxx:user/username is not authorized to perform: execute-api:Invoke on resource(사용자: arn:aws:iam::xxxxxxxxxxxxxxxxxx:user/username에 실행할 권한 없음: execute-api:Invoke on resource)'

서명 불일치

비밀 액세스 키가 잘못된 경우 다음과 같은 오류 메시지가 표시될 수 있습니다. 'The request signature we calculated does not match the signature you provided(계산한 요청 서명이 입력한 서명과 일치하지 않습니다).'

비밀 액세스 키는 Credential 파라미터의 액세스 키 ID와 일치해야 합니다. 자세한 내용은 API Gateway REST API에 대한 IAM 인증을 활성화하려면 어떻게 해야 하나요?인증 설정을 테스트하기 위한 요청 보내기 섹션을 참조하세요.

SigV4 서명 프로세스의 지침을 따랐는지 확인하세요. 서명 계산에 잘못된 값이 있는 경우 다음과 같은 오류 메시지가 표시될 수 있습니다. 'The request signature we calculated does not match the signature you provided(계산한 요청 서명이 입력한 서명과 일치하지 않습니다).'

API Gateway는 서명된 요청을 받으면 서명을 다시 계산합니다. 값에 차이가 있는 경우 API Gateway는 다른 서명을 받습니다. 서명된 요청과 canonical 요청 및 문자열을 오류 메시지의 값과 비교합니다. 차이가 있는 경우 서명 프로세스를 수정하세요.

canonical 요청의 예:

GET                                                      -------- HTTP method
/                                                        -------- Path. For API stage endpoint, it should be /{stage-name}/{resource-path}
                                                         -------- Query string key-value pair. Leave it blank if the request doesn't have any query string
content-type:application/json                            -------- header key-value pair. One header per line
host:0123456789.execute-api.us-east-1.amazonaws.com      -------- host and x-amz-data are required headers for all signed request                       
x-amz-date:20220806T024003Z                              

content-type;host;x-amz-date                             -------- A list of signed headers
d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501        -------- hash of the payload

canonical 오류 응답의 예:

<ErrorResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
  <Error>
    <Type>Sender</Type>
    <Code>SignatureDoesNotMatch</Code>
    <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

The canonical string for this request should have been 'GET / Action=ListGroupsForUser&MaxItems=100&UserName=Test&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential
=AKIAIOSFODNN7EXAMPLE%2F20120223%2Fus-east-1%2Fiam%2Faws4_request&X-Amz-Date=20120223T063000Z&X-Amz-SignedHeaders=host
host:iam.amazonaws.com

host
<hashed-value>'

The String-to-Sign should have been
'AWS4-HMAC-SHA256
20120223T063000Z
20120223/us-east-1/iam/aws4_request
<hashed-value>'
</Message>
  </Error>
  <RequestId>4ced6e96-5de8-11e1-aa78-a56908bdf8eb</RequestId>
</ErrorResponse>

참고: API gateway 헤더의 경우 hostx-amz-date 헤더만 필요합니다.

API 요청 헤더

SigV4 인증 헤더에 다음과 비슷한 올바른 보안 인증 키가 포함되어 있는지 확인하세요.

Authorization: AWS4-HMAC-SHA256 
Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, 
SignedHeaders=host;range;x-amz-date,
Signature=example-generated-signature

자격 증명 키가 없거나 잘못된 경우 다음과 같은 오류 메시지가 표시될 수 있습니다. "Authorization header requires 'Credential' parameter(인증 헤더에는 'Credential' 매개 변수가 필요합니다.) Authorization header requires 'Signature' parameter.(인증 헤더에는 'Signature' 매개 변수가 필요합니다.)"

HTTP Date 또는 x-amz-date 헤더를 사용하여 SigV4 권한 부여 요청에 요청 날짜도 포함해야 합니다.

자세한 내용은 키 서명 오류 문제 해결AWS Signature Version 4 오류 문제 해결을 참조하세요.