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