REST API

S3 service 에 명령을 요청하기 위한 핵심 개념은 REST API 다.

REST는 Representational State Transfer라는 용어의 약자로 웹에서의 통신방법을 어느정도 정형화시킨 개념이다.


자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)로 표현한다.

DELETE /members/1

1번 회원을 삭제하는 명령은 위와 같이 나타낼 수 있다.
회원정보를 가져올 때는 GET, 회원 추가 시의 행위를 표현하고자 할 때는 POST METHOD를 사용하여 표현한다.

curl 을 이용하여 s3 를 이용해야 하기 때문에 rest api 를 참고했다.

S3 에 request 를 보내기 위해서는 몇가지 해더에 내용을 담아 보내야한다. 이 과정은 몇가지 연산을 필요로 한다.

http://docs.aws.amazon.com/ko_kr/general/latest/gr/signing_aws_api_requests.html

에 보면 signature 생성 과정이 나타나 있다.

전체 signature 스텝은

Task 1: Create a Canonical Request for Signature Version 4

Task 2: Create a String to Sign for Signature Version 4

Task 3: Calculate the Signature for AWS Signature Version 4

Task 4: Add the Signing Information to the Request

이렇게 4가지로 구분되어있다.

아래 그림은 위 Tasks 를 도식화한 것이다.

Task 1: Create a Canonical Request for Signature Version 4

Task 1 에서는 Canonical Request 를 생성하고 Task 2 에서는 Task 1 에서 만들어진 Canonical Request 를 이용하여 StringToSign 을 생성한다.

Canonical Request 는 다음과 같은 정보를 포함한다.

CanonicalRequest =
  HTTPRequestMethod + '\n' +
  CanonicalURI + '\n' +
  CanonicalQueryString + '\n' +
  CanonicalHeaders + '\n' +
  SignedHeaders + '\n' +
  HexEncode(Hash(RequestPayload))

Example request method

GET

Example canonical URI with encoding

/documents%20and%20settings/2010-05-08&

Example authentication parameters in a query string

Action=ListUsers&
Version=2010-05-08&
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fiam%2Faws4_request&X-Amz-Date=20150830T123600Z&
X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-date

Example canonical headers

content-type:application/x-www-form-urlencoded; charset=utf-8\n
host:iam.amazonaws.com\n
x-amz-date:20150830T123600Z\n

Example canonical headers

content-type:application/x-www-form-urlencoded; charset=utf-8\n
host:iam.amazonaws.com\n
x-amz-date:20150830T123600Z\n

Example signed headers

content-type;host;x-amz-date\n

Example structure of payload

HashedPayload = Lowercase(HexEncode(Hash(
requestPayload
)))

이를 종합한 예제는 다음과 같다.

Example canonical request

GET                                                                 # HTTPRequestMethod
/                                                                   # CanonicalURI
Action=ListUsers&Version=2010-05-08                                 # CanonicalQueryString
content-type:application/x-www-form-urlencoded; charset=utf-8       # CanonicalHeaders
host:iam.amazonaws.com                                              # 
x-amz-date:20150830T123600Z                                         # 

content-type;host;x-amz-date                                        # SignedHeaders
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    # HexEncode(Hash(RequestPayload))

Task 2: Create a String to Sign for Signature Version 4

다음은 stringtosign을 생성해야 한다.

Structure of string to sign

StringToSign=
Algorithm + \n +    
RequestDateTime + \n +
CredentialScope + \n +
HashedCanonicalRequest

Algorithm : signature 를 생성할 알고리즘 정의

RequestDateTime : signature 를 생성할 때의 시간(expired time 관련해서 쓰이게 됨.)

CredentialScope : signature 가 쓰이게 되는 구역(날짜/구역/서비스/aws4_request)

HashedCanonicalRequest : Task1 에서 구했던 값의 hex string

각 필드별로 들어가는 예제를 살펴보면, 다음과 같은식으로 차례대로 들어가게 된다.

To create the string to sign

AWS4-HMAC-SHA256\n
20150830T123600Z\n
20150830/us-east-1/iam/aws4_request\n

Example string to sign

AWS4-HMAC-SHA256
20150830T123600Z
20150830/us-east-1/iam/aws4_request
f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59

여기서 hashed hex 는 Task1 에서 구했던 hex 값을 쓰면 된다.

이까지 상황을 간단히 도식화 하면

Task 3: Calculate the Signature for AWS Signature Version 4

먼저 알아둬야할 것은 HMAC 은 키 기반의 MAC 이다.

서명값은

signature = HexEncode(HMAC(signing key, stringtosign))

으로 구해지는데 signing key 는 다음과 같다.

Pseudocode for deriving a signing key

kSecret=your secret access key

kDate = HMAC("AWS4" + kSecret, Date)
kRegion = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService, "aws4_request")

stringtosign 은 task2 에서 구한 값을 쓴다.

여기서 구해진 signature 는 aws 에서 사용자 인증을 위해 쓰인다.

Task 4: Add the Signing Information to the Request

이제 모든 서명과정을 마쳤다면, request 를 보낼 수 있다.

Authorization라는 HTTP 헤더에 실어서 서명 정보를 포함할 수 있다.

그 구조는 다음과 같다.

Authorization: algorithm Credential=access key ID/credential scope, SignedHeaders=SignedHeaders, Signature=signature

실례를 보면

Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7

자세한 내용은 http://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html

results matching ""

    No results matching ""