요청에 서명하기 - Amazon S3 Glacier

요청에 서명하기

S3 Glacier는 보내는 모든 요청에 서명하여 요청을 인증하도록 요구합니다. 요청에 서명하려면 암호화 해시 함수를 이용해 디지털 서명을 계산해야 합니다. 암호화 해시는 입력을 근거로 하여 고유 해시 값을 반환하는 함수입니다. 해시 함수에 대한 입력에는 요청 텍스트와 보안 액세스 키가 포함됩니다. 해시 함수는 요청에 서명으로 포함하는 해시 값을 반환합니다. 서명은 요청에서 Authorization 헤더의 일부입니다.

S3 Glacier는 요청을 수신한 후 사용자가 요청에 서명할 때와 동일한 해시 함수 및 입력을 사용하여 서명을 재계산합니다. 결과 서명이 요청 서명과 일치할 경우 S3 Glacier가 요청을 처리합니다. 그렇지 않으면 요청이 거부됩니다.

S3 Glacier는 AWS 서명 버전 4를 이용한 인증을 지원합니다. 서명을 계산하기 위한 프로세스는 다음 세 작업으로 나뉠 수 있습니다.

  • 작업 1: 정식 요청 생성

    HTTP 요청을 정규 형식으로 재배열합니다. 정규 형식을 사용해야 하는 이유는 S3 Glacier가 서명을 재계산하여 본인이 전송한 서명과 비교할 때 동일한 정규 형식을 사용하기 때문입니다.

  • 작업 2: 서명할 문자열 생성

    암호화 해시 함수에 대한 입력 값 중 하나로 사용할 문자열을 만듭니다. 서명할 문자열이라는 문자열은 해시 알고리즘의 이름, 요청 날짜, 자격 증명 범위 문자열, 이전 작업에서 정규화된 요청을 연결한 것입니다. 자격 증명 범위 문자열 자체는 날짜, AWS 리전 및 서비스 정보를 연결한 것입니다.

  • 작업 3: 서명 생성

    서명할 문자열파생된 의 두 입력 문자열을 허용하는 암호화 해시 함수를 사용하여 요청에 대한 서명을 만듭니다. 파생된 키는 보안 액세스 키로 시작해서 자격 증명 범위 문자열을 사용하여 일련의 해시 기반 메시지 인증 코드(HMAC)를 만들어 계산됩니다. 단, 이번 서명 단계에서 사용하는 해시 함수는 데이터 업로드를 위한 S3 Glacier API에서 사용하는 트리-해시 알고리즘이 아닙니다.

서명 계산 예시

다음 예시에서는 볼트 만들기(PUT 값)에 대해 서명을 생성하는 세부 과정을 안내합니다. 이 예시는 서명 계산 방법을 점검하기 위한 참조로 사용할 수 있습니다. 다른 참조 계산은 Amazon Web Services 글로서리의 서명 버전 4 테스트 제품군에 포함되어 있습니다.

이 예시에서는 다음과 같이 가정합니다.

  • 요청 타임스탬프는 Fri, 25 May 2012 00:24:53 GMT입니다.

  • 엔드포인트는 미국 동부(버지니아 북부) 지역 us-east-1입니다.

일반 요청 구문(JSON 본문 포함)은 다음과 같습니다.

PUT /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Fri, 25 May 2012 00:24:53 GMT Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

작업 1: 정식 요청 생성에서 계산되는 요청의 정식 양식은 다음과 같습니다.

PUT /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-date:20120525T002453Z x-amz-glacier-version:2012-06-01 host;x-amz-date;x-amz-glacier-version e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

정규 요청의 마지막 줄은 요청 본문의 해시입니다. 또한 정규 요청에서 비어 있는 세 번째 줄에 주의해야 합니다. 비어 있는 이유는 이 API에 대해 쿼리 파라미터가 없기 때문입니다.

작업 2: 서명할 문자열 생성에서 사용할 서명할 문자열은 다음과 같습니다.

AWS4-HMAC-SHA256 20120525T002453Z 20120525/us-east-1/glacier/aws4_request 5f1da1a2d0feb614dd03d71e87928b8e449ac87614479332aced3a701f916743

서명할 문자열의 첫째 줄은 알고리즘, 둘째 줄은 타임스탬프, 셋째 줄은 자격 증명 범위, 마지막 줄은 작업 1 정규 요청의 해시입니다. 자격 증명 범위에서 사용하는 서비스 이름은 glacier입니다.

작업 3: 서명 생성에서 파생된 키는 다음과 같이 표현할 수 있습니다.

derived key = HMAC(HMAC(HMAC(HMAC("AWS4" + YourSecretAccessKey,"20120525"),"us-east-1"),"glacier"),"aws4_request")

보안 액세스 키인 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY를 사용하는 경우, 계산된 서명은 다음과 같습니다.

3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

마지막 단계는 Authorization 헤더를 생성하는 것입니다. 데모용 액세스 키 &;에 대한 헤더는 다음과 같습니다(가독성을 높이기 위해 줄 바꿈을 추가함).AKIAIOSFODNN7EXAMPLE

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120525/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-date;x-amz-glacier-version, Signature=3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

스트리밍 작업을 위한 서명 계산

아카이브 업로드(POST archive)파트 업로드(PUT uploadID)는 서명과 함께 요청을 전송할 때 x-amz-content-sha256 헤더를 추가해야 하는 스트리밍 작업입니다. 스트리밍 작업의 서명 단계는 스트리밍 헤더를 추가하는 것만 제외하고 다른 작업의 서명 단계와 정확히 일치합니다.

스트리밍 헤더인 x-amz-content-sha256의 계산은 업로드할 전체 내용(페이로드)의 SHA256 해시에 따라 달라집니다. 단, 이 계산은 SHA256 트리-해시(체크섬 계산)와 다릅니다. 일반적인 경우 외에도 페이로드 데이터의 SHA256 해시 값은 페이로드 데이터의 SHA256 트리-해시와 다릅니다.

페이로드 데이터가 바이트 배열로 지정되면 다음 Java 코드 조각을 사용하여 SHA256 해시를 계산할 수 있습니다.

public static byte[] computePayloadSHA256Hash2(byte[] payload) throws NoSuchAlgorithmException, IOException { BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(payload)); MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); byte[] buffer = new byte[4096]; int bytesRead = -1; while ( (bytesRead = bis.read(buffer, 0, buffer.length)) != -1 ) { messageDigest.update(buffer, 0, bytesRead); } return messageDigest.digest(); }

마찬가지로 C#에서도 다음 코드 조각과 같이 페이로드 데이터의 SHA256 해시를 계산할 수 있습니다.

public static byte[] CalculateSHA256Hash(byte[] payload) { SHA256 sha256 = System.Security.Cryptography.SHA256.Create(); byte[] hash = sha256.ComputeHash(payload); return hash; }

스트리밍 API의 서명 계산 예제

다음은 S3 Glacier의 두 스트리밍 API 중 하나인 아카이브 업로드(POST archive) 작업에 사용할 서명을 생성하기 위한 세부 정보에 대해서 설명한 예제입니다. 이 예시에서는 다음과 같이 가정합니다.

  • 요청 타임스탬프는 Mon, 07 May 2012 00:00:00 GMT입니다.

  • 엔드포인트는 미국 동부(버지니아 북부) 지역, us-east-1입니다.

  • 내용 페이로드는 "Welcome to S3 Glacier" 문자열입니다.

일반 요청 구문(JSON 본문 포함)은 아래 예제와 같습니다. 예제를 보면 x-amz-content-sha256 헤더가 포함되어 있습니다. 또한 x-amz-sha256-tree-hashx-amz-content-sha256의 값이 동일합니다. 하지만 크기가 1MB를 넘는 아카이브를 업로드할 때는 그렇지 않습니다.

POST /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Mon, 07 May 2012 00:00:00 GMT x-amz-archive-description: my archive x-amz-sha256-tree-hash: SHA256 tree hash x-amz-content-sha256: SHA256 payload hash Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

작업 1: 정식 요청 생성에서 계산되는 요청의 정식 형식은 아래와 같습니다. 예제를 보면 스트리밍 헤더인 x-amz-content-sha256에 값이 포함되어 있습니다. 이 말은 페이로드를 읽고 SHA256 해시를 먼저 계산한 후에 서명을 계산해야 한다는 것을 의미합니다.

POST /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-content-sha256:726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628 x-amz-date:20120507T000000Z x-amz-glacier-version:2012-06-01 host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version 726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628

남아있는 서명 계산은 서명 계산 예시에 간략하게 설명되어 있는 단계를 따릅니다. 보안 액세스 키인 Authorization과 액세스 키인 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY을 사용하는 AKIAIOSFODNN7EXAMPLE 헤더는 아래와 같습니다(가독성을 위해 줄바꿈이 추가됨).

Authorization=AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120507/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version, Signature=b092397439375d59119072764a1e9a144677c43d9906fd98a5742c57a2855de6