서명 버전 2 서명 과정 - AWS 일반 참조

서명 버전 2 서명 과정

서명 버전 2를 사용하여 API 요청에 서명할 수 있습니다. 하지만 서명 버전 4를 사용하여 요청에 서명하는 것이 좋습니다. 자세한 내용은 서명 버전 4 서명 프로세스 단원을 참조하십시오.

지원되는 리전 및 서비스

서명 버전 2를 사용하여 일부 AWS 지역의 일부 AWS 서비스에 대한 API 요청에 서명할 수 있습니다. 또는 API 요청에 서명하려면 서명 버전 4를 사용해야 합니다.

서명 버전 2를 지원하는 리전

  • 미국 동부(버지니아 북부) 지역

  • 미국 서부(캘리포니아 북부) 리전

  • 미국 서부(오레곤) 지역

  • 유럽(아일랜드) 리전

  • 아시아 태평양(도쿄) 리전

  • 아시아 태평양(싱가포르) 리전

  • 아시아 태평양(시드니) 리전

  • 남아메리카(상파울루) 리전

서명 버전 2를 지원하는 서비스

  • Amazon EC2 Auto Scaling

  • AWS CloudFormation

  • Amazon CloudWatch

  • AWS Elastic Beanstalk

  • Amazon Elastic Compute Cloud (Amazon EC2)

  • Elastic Load Balancing

  • Amazon EMR

  • Amazon ElastiCache

  • AWS Identity and Access Management (IAM)

  • AWS Import/Export

  • Amazon Relational Database Service (Amazon RDS)

  • Amazon Simple Notification Service (Amazon SNS)

  • Amazon Simple Queue Service (Amazon SQS)

  • Amazon SimpleDB

서명 버전 2를 사용 중지하는 서비스

서명 버전 2에 대한 쿼리 요청 구성 요소

AWS에서는 서명 버전 2 형식의 각 HTTP 또는 HTTPS 쿼리 요청에 다음을 포함하도록 요구합니다.

엔드포인트

HTTP 요청의 호스트 부분이라고도 합니다. 쿼리 요청을 보내는 컴퓨터의 DNS 이름이며, 이는 각 AWS 리전마다 다릅니다. 각 서비스에 대한 엔드포인트 목록은 AWS 서비스 엔드포인트 단원을 참조하십시오.

Action

웹 서비스에서 수행할 작업입니다. 이 값은 요청에 사용되는 파라미터를 결정합니다.

AWSAccessKeyId

AWS 계정에 가입할 때 AWS에서 배포하는 값입니다.

SignatureMethod

서명을 계산하는 데 사용되는 해시 기반 프로토콜입니다. 서명 버전 2의 경우 HMAC-SHA1 또는 HMAC-SHA256입니다.

SignatureVersion

AWS 서명 프로토콜의 버전입니다.

타임스탬프

요청을 생성한 시간입니다. 쿼리 요청에 이 값을 포함하면 제3자가 요청을 가로채지 못하도록 차단할 수 있습니다.

필수 및 선택적 파라미터

각 작업에는 API 호출을 정의하는 필수 및 선택적 파라미터 세트가 있습니다.

Signature

서명이 유효하고 변조되지 않았는지 확인하는 계산된 값입니다.

다음은 HTTPS GET 요청 형식의 Amazon EMR 쿼리 요청 예입니다.

  • elasticmapreduce.amazonaws.com 엔드포인트는 기본 엔드포인트이며 us-east-1 리전에 매핑됩니다.

  • 이 작업은 하나 이상의 작업 흐름에 대한 정보를 요청하는 DescribeJobFlows입니다.

참고

실제 쿼리 요청에는 공백이나 줄 바꿈 문자가 없습니다. 요청은 연속하는 텍스트 행입니다. 아래 버전은 사용자가 이해하기 쉽게 서식 지정되었습니다.

https://elasticmapreduce.amazonaws.com? &AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE &Action=DescribeJobFlows &SignatureMethod=HmacSHA256 &SignatureVersion=2 &Timestamp=2011-10-03T15%3A19%3A30 &Version=2009-03-31 &Signature=calculated value

쿼리 요청에 대한 서명을 생성하는 방법

웹 서비스 요청은 인터넷을 통해 전송되므로 변조에 취약합니다. 요청이 변경되지 않았는지 확인하기 위해 AWS에서는 서명을 계산하여 파라미터 또는 파라미터 값이 중간에 변경되었는지 확인합니다. AWS에서는 모든 요청의 일부로 서명을 요구합니다.

요청을 URI로 인코딩해야 합니다. 예를 들어, 요청의 공백은 %20으로 인코딩되어야 합니다. 인코딩되지 않은 공백은 일반적으로 HTTP 프로토콜 사양에서 허용되지만 인코딩되지 않은 문자는 쿼리 요청에서 잘못된 서명을 생성합니다. 공백을 더하기 기호(+)로 인코딩하지 마십시오. 그러면 오류가 발생합니다.

다음 주제에서는 AWS 서명 버전 2를 사용하여 서명을 계산하는 데 필요한 단계를 설명합니다.

작업 1: 쿼리 요청 서식 지정

쿼리 요청에 서명하려면 표준화된(표준) 형식으로 요청의 서식을 지정합니다. 쿼리 요청의 서식을 지정하는 방법에 따라 다른 HMAC 서명이 생성됩니다. 서명하기 전에 표준 형식으로 요청의 서식을 지정합니다. 그러면 애플리케이션과 AWS에서 요청에 대해 동일한 서명을 계산합니다.

서명할 문자열을 생성하려면 쿼리 요청 구성 요소를 연결합니다. 다음 예에서는 Amazon EMR API에 대한 다음 호출에 대해 서명할 문자열을 생성합니다.

https://elasticmapreduce.amazonaws.com? Action=DescribeJobFlows &Version=2009-03-31 &AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2011-10-03T15:19:30
참고

이전 요청에서 AWSAccessKeyID부터 타임스탬프까지의 마지막 네 파라미터를 인증 파라미터라고 합니다. 인증 파라미터는 모든 서명 버전 2 요청에 필요합니다. AWS에서는 인증 파라미터를 사용하여 요청을 전송 중인 사용자와 요청된 액세스를 허용할지 여부를 식별합니다.

서명할 문자열을 생성하려면

  1. 요청 메서드(GET 또는 POST)로 시작하고 줄 바꿈 문자가 뒤에 옵니다. 사용자가 이해하기 쉽도록 줄 바꿈 문자는 \n으로 표시됩니다.

    GET\n
  2. HTTP 호스트 헤더(엔드포인트)를 소문자로 추가하고 줄 바꿈 문자를 그 뒤에 입력합니다. 포트 정보는 프로토콜에 대한 표준 포트(HTTP의 경우 포트 80, HTTPS의 경우 포트 443)인 경우 생략되고, 비표준 포트인 경우 포함됩니다.

    elasticmapreduce.amazonaws.com\n
  3. URI의 각 경로 세그먼트, 즉 HTTP 호스트 헤더부터 쿼리 문자열 파라미터를 시작하고 줄 바꿈 문자가 뒤에 오는 물음표 문자(?) 사이에 오는 모든 내용을 URL로 인코딩한 버전을 추가합니다. 각 경로 세그먼트를 구분하는 슬래시(/)는 인코딩하지 마십시오.

    이 예에서 절대 경로가 비어 있는 경우 슬래시(/)를 사용합니다.

    /\n
    1. 쿼리 문자열 구성 요소를, URL로 인코딩된 UTF-8 문자로 추가합니다(16진수 문자는 대문자로 표시해야 함). 요청의 초기 물음표 문자(?)는 인코딩하지 않습니다. 자세한 내용은 RFC 3986를 참조하십시오.

    2. 쿼리 문자열 구성 요소를 바이트 순서로 정렬합니다. 바이트 순서에서는 대/소문자를 구분합니다. AWS에서는 원시 바이트를 기준으로 이러한 구성 요소를 정렬합니다.

      예를 들어, 쿼리 문자열 구성 요소에 대한 원래 순서입니다.

      Action=DescribeJobFlows Version=2009-03-31 AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE SignatureVersion=2 SignatureMethod=HmacSHA256 Timestamp=2011-10-03T15%3A19%3A30

      쿼리 문자열 구성 요소를 다음과 같이 재구성합니다.

      AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE Action=DescribeJobFlows SignatureMethod=HmacSHA256 SignatureVersion=2 Timestamp=2011-10-03T15%3A19%3A30 Version=2009-03-31
    3. 등호(=)를 사용하여 파라미터 이름을 값과 구분합니다. 값이 비어 있는 경우에도 마찬가지입니다. 파라미터 및 값 쌍을 앰퍼샌드 문자(&)로 구분합니다. 파라미터와 해당 값을 연결하여 공백이 없는 하나의 긴 문자열을 생성합니다. 파라미터 값 내의 공백은 허용되지만 %20로 URL로 인코딩해야 합니다. 연결된 문자열에서 마침표 문자(.)는 이스케이프되지 않습니다. RFC 3986에서는 마침표 문자를 예약되지 않은 문자로 간주하므로 URL로 인코딩되지 않습니다.

      참고

      RFC 3986에서는 ASCII 제어 문자, 확장된 UTF-8 문자, RFC 1738에 의해 예약된 기타 문자에 대해 지정하지 않습니다. 모든 값은 문자열 값으로 전달될 수 있으므로 다른 문자를 %XY로 퍼센트 인코딩해야 합니다. 여기서 X 및 Y는 대문자 16진수 문자입니다. 확장된 UTF-8 문자는 %XY%ZA... 형식입니다. 이 형식은 멀티바이트를 처리합니다.

    다음 예에서는 파라미터가 앰퍼샌드 문자(&)와 연결되고 바이트 순서로 정렬된 쿼리 문자열 구성 요소를 보여줍니다.

    AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-3
  4. 완성된 표준 요청을 구성하려면 각 단계의 모든 구성 요소를 결합합니다. 표시된 대로 각 구성 요소는 줄 바꿈 문자로 끝납니다.

    GET\n elasticmapreduce.amazonaws.com\n /\n AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31

작업 2: 서명 계산

작업 1: 쿼리 요청 서식 지정에 설명한 대로 표준 문자열을 생성한 후 HMAC-SHA1 또는 HMAC-SHA256 프로토콜을 사용하는 해시 기반 메시지 인증 코드(HMAC)를 생성하여 서명을 계산합니다. HMAC-SHA256은 기본 설정됩니다.

이 예에서는 다음 표준 문자열과 보안 키를 키가 지정된 해시 함수에 대한 입력으로 사용하여 서명을 계산합니다.

  • 표준 쿼리 문자열:

    GET\n elasticmapreduce.amazonaws.com\n /\n AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31
  • 샘플 보안 키:

    wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

결과 서명은 base-64로 인코딩되어야 합니다.

i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf%2FMj6vPxyYIs%3D

결과 값을 쿼리 요청에 Signature 파라미터로 추가합니다. 이 파라미터를 요청에 추가할 때 다른 파라미터와 마찬가지로 URI로 인코딩해야 합니다. HTTP 또는 HTTPS 호출에서 서명된 요청을 사용할 수 있습니다.

https://elasticmapreduce.amazonaws.com?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31&Signature=i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf%2FMj6vPxyYIs%3D
참고

AWS Security Token Service(AWS STS)에 제공되는 임시 보안 자격 증명을 사용하여 요청에 서명할 수 있습니다. 프로세스는 장기 자격 증명을 사용하는 것과 동일하지만 요청에서 보안 토큰에 대한 추가 파라미터를 요구합니다.

다음 요청에서는 임시 액세스 키 ID와 SecurityToken 파라미터를 사용합니다.

예 임시 보안 자격 증명을 사용하는 요청 예

https://sdb.amazonaws.com/ ?Action=GetAttributes &AWSAccessKeyId=access-key-from-AWS Security Token Service &DomainName=MyDomain &ItemName=MyItem &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2010-01-25T15%3A03%3A07-07%3A00 &Version=2009-04-15 &Signature=signature-calculated-using-the-temporary-access-key &SecurityToken=session-token

자세한 내용은 다음 자료를 참조하십시오.

  • Amazon EMR 개발자 안내서에는 Amazon EMR API 호출에 대한 정보가 있습니다.

  • 각 서비스에 대한 API 문서에는 작업의 요구 사항 및 특정 파라미터에 대한 정보가 있습니다.

  • AWS SDK는 쿼리 요청 서명을 생성하는 기능을 제공합니다. AWS SDK for Java 사용 예제를 보려면 Java SDK를 사용하여 쿼리 요청에 서명 단원을 참조하십시오.

요청 서명 문제 해결

이 단원에서는 쿼리 요청에 서명하기 위해 서명을 생성하는 코드를 처음으로 개발할 때 표시될 수 있는 몇 가지 오류 코드에 대해 설명합니다.

웹 서비스의 SignatureDoesNotMatch 서명 오류

웹 서비스에서 서명 값을 다시 계산하여 요청 서명을 검증하려고 시도하고 요청에 연결된 서명과 일치하지 않는 값을 생성하면 다음과 같은 오류 응답이 반환됩니다. 이 오류는 요청을 전송한 시간과 웹 서비스 엔드포인트(감지하도록 설계된 서명)에 도달한 시간 사이에 요청이 변경되었거나 서명이 잘못 계산되었기 때문에 발생할 수 있습니다. 다음 오류 메시지의 일반적인 원인은 서명할 문자열이 올바르게 생성되지 않았기 때문입니다(예: Amazon S3 버킷 이름에서 콜론(;), 슬래시(/) 등과 같은 문자를 URL로 인코딩하지 않은 경우).

<ErrorResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31"> <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.</Message> </Error> <RequestId>7589637b-e4b0-11e0-95d9-639f87241c66</RequestId> </ErrorResponse>

웹 서비스의 IncompleteSignature 서명 오류

다음 오류는 서명에 누락된 정보가 있거나 형식이 잘못 지정되었음을 나타냅니다.

<ErrorResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31"> <Error> <Type>Sender</Type> <Code>IncompleteSignature</Code> <Message>Request must contain a signature that conforms to AWS standards</Message> </Error> <RequestId>7146d0dd-e48e-11e0-a276-bd10ea0cbb74</RequestId> </ErrorResponse>

Java SDK를 사용하여 쿼리 요청에 서명

다음 예에서는 Java용 AWS SDK의 amazon.webservices.common 패키지를 사용하여 AWS 서명 버전 2 쿼리 요청 서명을 생성합니다. 이렇게 하려면 RFC 2104-compliant HMAC 서명을 생성합니다. HMAC에 대한 자세한 내용은 HMAC: 메시지 인증에 대한 키 해싱을 참조하십시오.

참고

Java는 구현 예로 사용됩니다. 선택한 프로그래밍 언어를 사용하여 쿼리 요청에 서명하는 HMAC 알고리즘을 구현할 수 있습니다.

import java.security.SignatureException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import com.amazonaws.util.*; /** * This class defines common routines for generating * authentication signatures for AWS Platform requests. */ public class Signature { private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256"; /** * Computes RFC 2104-compliant HMAC signature. * * @param data * The signed data. * @param key * The signing key. * @return * The Base64-encoded RFC 2104-compliant HMAC signature. * @throws * java.security.SignatureException when signature generation fails */ public static String calculateRFC2104HMAC(String data, String key) throws java.security.SignatureException { String result; try { // Get an hmac_sha256 key from the raw key bytes. SecretKeySpec signingKey = new SecretKeySpec(key.getBytes("UTF-8"), HMAC_SHA256_ALGORITHM); // Get an hmac_sha256 Mac instance and initialize with the signing key. Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM); mac.init(signingKey); // Compute the hmac on input data bytes. byte[] rawHmac = mac.doFinal(data.getBytes("UTF-8")); // Base64-encode the hmac by using the utility in the SDK result = BinaryUtils.toBase64(rawHmac); } catch (Exception e) { throw new SignatureException("Failed to generate HMAC : " + e.getMessage()); } return result; } }