

# AWS API 요청에 대한 Signature Version 4 서명 문제 해결
<a name="reference_sigv-troubleshooting"></a>

**중요**  
AWS SDK 또는 CLI를 사용하지 않는 한 요청에 인증 정보를 제공하는 서명을 계산하는 코드를 작성해야 합니다. SigV4 서명 계산은 복잡한 작업일 수 있으므로 가능한 경우 AWS SDK 또는 CLI를 사용하는 것이 좋습니다.

서명된 요청을 생성하는 코드를 개발할 때, AWS 서비스에서 HTTP 403 `SignatureDoesNotMatch`가 발생할 수 있습니다. 이 오류는 AWS에 대한 HTTP 요청의 서명 값이 AWS 서비스에서 계산한 서명과 일치하지 않음을 의미합니다. 권한에서 호출자의 요청을 허용하지 않는 경우 HTTP 401 `Unauthorized` 오류가 반환됩니다.

다음과 같은 경우 API 요청에서 오류가 반환될 수 있습니다.
+ API 요청이 서명되지 않았으며 API 요청이 IAM 인증을 사용합니다.
+ 요청에 서명하는 데 사용된 IAM 보안 인증이 잘못되었거나 API를 간접적으로 호출할 권한이 없습니다.
+ 서명된 API 요청의 서명이 AWS 서비스에서 계산한 서명과 일치하지 않습니다.
+ API 요청 헤더가 잘못되었습니다.

**참고**  
다른 오류 해결 방법을 살펴보기 전에 AWS Signature Version 2(SigV2)에서 AWS Signature Version 4(SigV4)로 서명 프로토콜을 업데이트합니다. Amazon S3 등의 서비스와 리전은 더 이상 SIGv2 서명을 지원하지 않습니다.

**Topics**
+ [보안 인증 오류](#signature-v4-troubleshooting-credential)
+ [표준 요청 및 서명 문자열 오류](#signature-v4-troubleshooting-canonical-errors)
+ [보안 인증 범위 오류](#signature-v4-troubleshooting-credential-scope)
+ [키 서명 오류](#signature-v4-troubleshooting-key-signing)

## 보안 인증 오류
<a name="signature-v4-troubleshooting-credential"></a>

API 요청이 SigV4로 서명되었는지 확인합니다. API 요청이 서명되지 않은 경우 다음과 같은 오류가 발생할 수 있습니다. `Missing Authentication Token`. [누락된 서명을 추가](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html#add-signature-to-request)하고 요청을 다시 전송합니다.

액세스 키 및 비밀 키의 보안 인증이 올바른지 확인합니다. 액세스 키가 잘못된 경우 다음과 같은 오류가 발생할 수 있습니다. `Unauthorized`. 요청에 서명하는 데 사용된 엔터티에 요청을 할 권한이 있는지 확인합니다. 자세한 내용은 [액세스 거부 오류 메시지 문제 해결](troubleshoot_access-denied.md)을 참조하세요.

## 표준 요청 및 서명 문자열 오류
<a name="signature-v4-troubleshooting-canonical-errors"></a>

[표준 요청의 해시 생성](reference_sigv-create-signed-request.md#create-canonical-request-hash) 또는 [서명할 문자열 생성](reference_sigv-create-signed-request.md#create-string-to-sign)에서 표준 요청을 잘못 계산한 경우 서비스에서 수행되는 서명 검증 단계가 실패하고 다음 오류 메시지가 표시됩니다.

```
The request signature we calculated does not match the signature you provided
```

AWS 서비스에서 서명된 요청을 수신하면 서명을 다시 계산합니다. 값에 차이가 있으면 서명이 일치하지 않는 것입니다. 표준 요청 및 서명된 요청의 문자열을 오류 메시지의 값과 비교합니다. 차이가 있는 경우 서명 프로세스를 수정합니다.

**참고**  
헤더 또는 요청을 수정하는 프록시를 통해 요청을 전송하지 않았는지 확인할 수도 있습니다.

**Example 정식 요청 예**  

```
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 a 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-date are required headers for all signed requests.                       
x-amz-date:20220806T024003Z                              

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

비밀 키가 액세스 키 ID와 일치하는지 확인하려면, 정상적으로 작동하는 것으로 알려진 구현을 사용하여 비밀 키를 테스트합니다. 예를 들어 AWS SDK 또는 AWS CLI를 사용하여 AWS에 대한 요청을 보냅니다.

### API 요청 헤더
<a name="signature-v4-troubleshooting-credential-header"></a>

인증 헤더가 비어 있거나, 자격 증명 키 또는 서명이 없거나 올바르지 않거나, 헤더가 알고리즘 이름으로 시작하지 않거나, 키 값 쌍에 등호가 포함되지 않은 경우 다음 오류 중 하나가 발생합니다.
+ 인증 헤더는 비워 둘 수 없습니다.
+ 인증 헤더에는 '자격 증명' 매개변수가 필요합니다.
+ 인증 헤더에는 '서명' 매개변수가 필요합니다.
+ 인증 헤더에서 잘못된 키=값 쌍(등호 누락)이 서명에 포함되어 있습니다.

[서명 계산](reference_sigv-create-signed-request.md#calculate-signature)에서 추가한 SigV4 인증 헤더에 올바른 자격 증명 키가 포함되어 있는지 및 HTTP 날짜 또는 `x-amz-date` 헤더를 사용하는 요청 날짜도 포함되어 있는지 확인합니다.

IncompleteSignatureException 오류가 발생했고 서명의 구성이 올바른 경우 클라이언트측 요청에서 권한 부여 헤더의 SHA-256 해시 및 B64 인코딩을 계산하여 AWS 서비스로 전송되는 동안 인증 헤더가 수정되지 않았는지 확인할 수 있습니다.

1. 요청에서 전송한 [인증 헤더](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv-authentication-methods.html)를 가져옵니다. 인증 헤더는 다음 예제와 유사합니다.

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

1. 인증 헤더의 SHA-256 해시를 계산합니다.

   ```
   hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader
   ```

1. 해시된 인증 헤더를 Base64 형식으로 인코딩합니다.

   ```
   base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader
   ```

1. 방금 계산한 해시 및 인코딩된 문자열을 오류 메시지로 받은 문자열과 비교합니다. 오류 메시지는 다음 예와 유사해야 합니다.

   ```
   com.amazon.coral.service#IncompleteSignatureException: 
   The signature contains an in-valid key=value pair (missing equal-sign) 
   in Authorization header (hashed with SHA-256 and encoded with Base64): 
   '9c574f83b4b950926da4a99c2b43418b3db8d97d571b5e18dd0e4f3c3ed1ed2c'.
   ```
+ 두 해시가 다른 경우 전송 중에 인증 헤더의 일부가 변경된 것입니다. 이는 네트워크 또는 클라이언트 핸들러가 서명된 헤더를 연결하거나 인증 헤더를 어떤 식으로든 변경했기 때문일 수 있습니다.
+ 두 해시가 일치하면 요청에서 보낸 인증 헤더가 AWS에서 받은 것과 일치합니다. 수신된 오류 메시지를 검토하여 문제가 잘못된 자격 증명이나 서명으로 인한 것인지 확인합니다. 이러한 오류는 이 페이지의 다른 섹션에서 다룹니다.

## 보안 인증 범위 오류
<a name="signature-v4-troubleshooting-credential-scope"></a>

[서명할 문자열 생성](reference_sigv-create-signed-request.md#create-string-to-sign)에서 생성한 보안 인증 범위는 서명을 특정 날짜, 리전 및 서비스로 제한합니다. 이 문자열의 형식은 다음과 같습니다.

```
YYYYMMDD/region/service/aws4_request
```

**참고**  
SigV4a를 사용하는 경우 해당 리전은 보안 인증 범위에 포함되지 않습니다.

**날짜**  
보안 인증 범위에 x-amz-date 헤더와 동일한 날짜가 지정되어 있지 않은 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

```
Date in Credential scope does not match YYYYMMDD from ISO-8601 version of date from HTTP
```

요청에 미래의 시간이 지정되어 있는 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

```
Signature not yet current: date is still later than date
```

요청이 만료된 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

```
Signature expired: date is now earlier than date
```

**리전**  
보안 인증 범위가 요청과 동일한 리전을 지정하지 않는 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

```
Credential should be scoped to a valid Region, not region-code
```

**서비스**  
보안 인증 범위에 host 헤더와 동일한 서비스가 지정되어 있지 않은 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

```
Credential should be scoped to correct service: 'service'
```

**종료 문자열**  
보안 인증 범위가 aws4\$1request로 끝나지 않는 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

```
Credential should be scoped with a valid terminator: 'aws4_request'
```

## 키 서명 오류
<a name="signature-v4-troubleshooting-key-signing"></a>

잘못된 서명 키 추출 또는 잘못된 암호화 사용으로 인해 발생하는 오류는 해결하는 데 어려움이 있습니다. 표준 문자열과 서명할 문자열이 올바른지 확인한 후, 다음 문제 중 하나를 확인할 수도 있습니다.
+ 비밀 액세스 키가 지정된 액세스 키 ID와 일치하지 않습니다.
+ 키 추출 코드에 문제가 있습니다.

비밀 키가 액세스 키 ID와 일치하는지 확인하려면, 정상적으로 작동하는 것으로 알려진 구현을 사용하여 비밀 키를 테스트합니다. 예를 들어 AWS SDK 또는 AWS CLI를 사용하여 AWS에 대한 요청을 보냅니다. 예제는 [서명 요청 예](reference_sigv-examples.md) 단원을 참조하십시오.