

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon SWF에 대한 HTTP 요청 만들기
<a name="UsingJSON-swf"></a>

 AWS SDKs 중 하나를 사용하지 않는 경우 POST 요청 방법을 사용하여 HTTP를 통해 Amazon Simple Workflow Service(Amazon SWF) 작업을 수행할 수 있습니다. POST 메서드를 사용하는 경우, 요청의 헤더에 작업을 지정하고 요청 본문에 JSON 형식으로 작업 데이터를 입력해야 합니다.

## HTTP 헤더 콘텐츠
<a name="HTTPHeader"></a>

Amazon SWF는 HTTP 요청의 헤더에 다음 정보를 제공해야 합니다.
+ `host` Amazon SWF 엔드포인트 
+ `x-amz-date` HTTP `Date` 헤더 또는 AWS `x-amz-date header`에 타임스탬프를 제공해야 합니다(일부 HTTP 클라이언트 라이브러리에서는 `Date` 헤더를 설정할 수 없음). `x-amz-date` 헤더가 있으면 요청 인증 시 모든 `Date` 헤더가 무시됩니다.

  HTTP/1.1 RFC에 지정된 다음 3개 형식 중 하나로 날짜를 지정해야 합니다.
  + Sun, 06 Nov 1994 08:49:37 GMT (RFC 822, RFC 1123 이후)
  + Sunday, 06-Nov-94 08:49:37 GMT(RFC 1036에 의해 폐기된 RFC 850)
  + Sun Nov 6 08:49:37 1994 (ANSI C's asctime() 형식)
+ `x-amzn-authorization`: 다음 형식의 서명된 요청 파라미터입니다.

  ```
  AWS3 AWSAccessKeyId=####,Algorithm=HmacSHA256, [,SignedHeaders=Header1;Header2;...]
  Signature=S(StringToSign)
  ```

  `AWS3` - 요청에 서명하는 데 사용되는 인증 버전을 나타내는 AWS 구현별 태그입니다(현재 Amazon SWF의 경우이 값은 항상 임`AWS3`).

  `AWSAccessKeyId` - AWS 액세스 키 ID입니다.

  `Algorithm` – 서명할 문자열의 HMAC-SHA 값(예: `HmacSHA256` 또는 `HmacSHA1`)을 생성하는 데 사용되는 알고리즘입니다.

  `Signature` – Base64[알고리즘(StringToSign, SigningKey)]. 자세한 내용은 [Amazon SWF에 대한 HMAC-SHA 서명 계산](HMACAuth-swf.md) 단원을 참조하십시오.

  `SignedHeaders` – (선택)이 헤더가 있는 경우, 규정화된 HttpHeaders 계산에 사용되는 모든 HTTP 헤더 목록을 포함해야 합니다. 세미콜론 문자(;)(ASCII 문자 59) 하나를 목록 값의 구분 기호로 사용해야 합니다.
+  `x-amz-target` – 요청 및 데이터 작업의 대상 서비스로 다음과 같은 형식을 띱니다.

  ` com.amazonaws.swf.service.model.SimpleWorkflowService. + <action> `

   예: `com.amazonaws.swf.service.model.SimpleWorkflowService.RegisterDomain` 
+ `content-type` – JSON 및 `application/json; charset=UTF-8` 같은 문자 세트를 지정하는 데 필요한 유형입니다.

 다음은 도메인을 만들기 위한 HTTP 요청의 예제 헤더입니다.

```
POST http://swf.us-east-1.amazonaws.com/ HTTP/1.1
Host: swf.us-east-1.amazonaws.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.25) Gecko/20111212 Firefox/3.6.25 ( .NET CLR 3.5.30729; .NET4.0E)
Accept: application/json, text/javascript, */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/json; charset=UTF-8
X-Requested-With: XMLHttpRequest
X-Amz-Date: Fri, 13 Jan 2012 18:42:12 GMT
X-Amz-Target: com.amazonaws.swf.service.model.SimpleWorkflowService.RegisterDomain
Content-Encoding: amz-1.0
X-Amzn-Authorization: AWS3 AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE,Algorithm=HmacSHA256,SignedHeaders=Host;X-Amz-Date;X-Amz-Target;Content-Encoding,Signature=tzjkF55lxAxPhzp/BRGFYQRQRq6CqrM254dTDE/EncI=
Referer: http://swf.us-east-1.amazonaws.com/explorer/index.html
Content-Length: 91
Pragma: no-cache
Cache-Control: no-cache

{"name": "867530902",
 "description": "music",
 "workflowExecutionRetentionPeriodInDays": "60"}
```

다음은 해당하는 HTTP 응답의 예입니다.

```
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: application/json
x-amzn-RequestId: 4ec4ac3f-3e16-11e1-9b11-7182192d0b57
```

## HTTP 본문
<a name="JSONschema"></a>

HTTP 요청의 본문에는 HTTP 요청의 헤더에 지정한 작업의 데이터가 포함되며, JSON 데이터 형식을 사용하여 데이터 값과 데이터 구조를 동시에 표현합니다. 괄호 표기를 사용하여 요소를 다른 요소 안에 중첩할 수 있습니다. 예를 들어, 다음은 Unix Time 표기법을 사용하여 지정된 두 시점 사이에 시작된 모든 워크플로 실행을 나열하라는 요청을 보여줍니다.

```
{
 "domain": "867530901",
 "startTimeFilter":
 {
   "oldestDate": 1325376070,
	 "latestDate": 1356998399
 },
 "tagFilter":
 {
   "tag": "music purchase"
 }
}
```

## 예제 Amazon SWF JSON 요청 및 응답
<a name="JSONMajorExample"></a>

다음 예제는 이전에 생성한 도메인을 설명하기 위한 Amazon SWF에 대한 요청을 보여줍니다. 그런 다음에는 Amazon SWF 응답을 보여줍니다.

### HTTP POST 요청
<a name="http-post-request"></a>

```
POST http://swf.us-east-1.amazonaws.com/ HTTP/1.1
Host: swf.us-east-1.amazonaws.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.25) Gecko/20111212 Firefox/3.6.25 ( .NET CLR 3.5.30729; .NET4.0E)
Accept: application/json, text/javascript, */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/json; charset=UTF-8
X-Requested-With: XMLHttpRequest
X-Amz-Date: Sun, 15 Jan 2012 03:13:33 GMT
X-Amz-Target: com.amazonaws.swf.service.model.SimpleWorkflowService.DescribeDomain
Content-Encoding: amz-1.0
X-Amzn-Authorization: AWS3 AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE,Algorithm=HmacSHA256,SignedHeaders=Host;X-Amz-Date;X-Amz-Target;Content-Encoding,Signature=IFJtq3M366CHqMlTpyqYqd9z0ChCoKDC5SCJBsLifu4=
Referer: http://swf.us-east-1.amazonaws.com/explorer/index.html
Content-Length: 21
Pragma: no-cache
Cache-Control: no-cache

{"name": "867530901"}
```

### Amazon SWF 응답
<a name="swf-response"></a>

```
HTTP/1.1 200 OK
Content-Length: 137
Content-Type: application/json
x-amzn-RequestId: e86a6779-3f26-11e1-9a27-0760db01a4a8

{"configuration":
  {"workflowExecutionRetentionPeriodInDays": "60"},
 "domainInfo":
  {"description": "music",
   "name": "867530901",
   "status": "REGISTERED"}
}
```

프로토콜(`HTTP/1.1`) 다음에는 상태 코드(`200`)가 따라 옵니다. 코드 값 `200`은 작업 성공을 나타냅니다.

Amazon SWF는 null 값을 직렬화하지 않습니다. JSON 구문 분석기가 요청에 대한 null 값을 직렬화하도록 설정된 경우 Amazon SWF에서는 이러한 값을 무시합니다.

# Amazon SWF에 대한 HMAC-SHA 서명 계산
<a name="HMACAuth-swf"></a>

Amazon SWF에 대한 모든 요청은 인증해야 합니다. AWS SDKs는 요청에 자동으로 서명하고 토큰 기반 인증을 관리합니다. 그러나 자체 HTTP `POST` 요청을 작성하려는 경우 요청 인증의 일부로 HTTP `POST Header` 콘텐츠에 대한 `x-amzn-authorization` 값을 생성해야 합니다.

헤더 형식 지정에 대한 자세한 내용은 [HTTP 헤더 콘텐츠](UsingJSON-swf.md#HTTPHeader) 단원을 참조하십시오. AWS 버전 3 서명 AWS SDK for Java 구현은 [ AWSSigner.java](https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/auth/AWS3Signer.java) 클래스를 참조하세요.

## 요청 서명 생성
<a name="AuthProcess"></a>

HMAC-SHA 요청 서명을 생성하려면 AWS 자격 증명(액세스 키 ID 및 보안 키)을 얻어야 합니다.

**중요**  
SHA1 또는 SHA256을 사용하여 요청에 서명할 수 있습니다. 그러나 서명 프로세스 전체에서 동일한 방법을 사용해야 합니다. 선택한 메서드는 HTTP 헤더의 `Algorithm` 이름 값과 일치해야 합니다.

### 요청 서명을 생성하려면
<a name="swf-create-request-signature-steps"></a>

1. HTTP 요청 헤더의 표준 양식을 생성합니다. HTTP 헤더의 표준 양식에는 다음이 포함됩니다.
   + `host`
   + `x-amz-`로 시작되는 모든 헤더 요소

   포함된 헤더에 대한 자세한 내용은 [HTTP 헤더 콘텐츠](UsingJSON-swf.md#HTTPHeader) 단원을 참조하십시오.

   1. 각 헤더 이름-값 페어의 경우 헤더 이름(헤더 값 아님)을 소문자로 변환합니다.

   1. 헤더 이름 맵을 쉼표로 구분된 헤더 값으로 작성합니다.

      ```
      x-amz-example: value1
      x-amz-example: value2  =>  x-amz-example:value1,value2
      ```

      자세한 내용은 [RFC 2616의 섹션 4.2](http://tools.ietf.org/html/rfc2616)를 참조하십시오.

   1. 각 헤더 이름-값 페어의 경우 이름-값 페어를 `headerName:headerValue` 형식의 문자열로 변환합니다. 콜론 양쪽에 공백이 없도록 하고, `headerName` 및 `headerValue` 모두 시작 및 끝부분에서 공백을 잘라냅니다.

      ```
      x-amz-example1:value1,value2
      x-amz-example2:value3
      ```

   1. 마지막 문자열을 포함하여 변환된 각 문자열 뒤에 새 줄(`U+000A`)을 삽입합니다.

   1. 변환된 문자열 컬렉션을 헤더 이름에 따라 영문자순으로 정렬합니다.

1. 다음 항목이 포함된 서명할 문자열 값을 생성합니다.
   + 줄 `1`: HTTP 메서드(`POST`), 뒤에서 줄바꿈합니다.
   + 줄 `2`: 요청 URI(`/`), 뒤에서 줄바꿈합니다.
   + 줄 `3`: 빈 문자열, 뒤에서 줄바꿈합니다.
**참고**  
일반적으로 여기에 쿼리 문자열이 나타나지만 Amazon SWF는 쿼리 문자열을 사용하지 않습니다.
   + 줄 `4–n`: 1단계에서 계산한 정규화된 요청 헤더를 나타내는 문자열로, 뒤에서 줄바꿈합니다. 이 새 줄 때문에 HTTP 요청의 헤더와 본문 사이에 빈 줄이 생깁니다. 자세한 내용은 [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html)를 참조하십시오.
   + 요청 본문 뒤에는 줄바꿈하지 *않습니다*.

1. 서명할 문자열 값의 SHA256 또는 SHA1 다이제스트를 계산합니다. 프로세스 전체에서 동일한 SHA 메서드를 사용합니다.

1. 이전 단계에서 생성된 값의 SHA256 또는 SHA1 다이제스트(사용한 방법에 따라 다름)를 사용하고 `[GetSessionToken](https://docs.aws.amazon.com/STS/latest/UsingSTS/CreatingSessionTokens.html)` API 작업을 사용하여 AWS Security Token Service의 임시 보안 액세스 키를 사용하여 HMAC-SHA를 계산하고 Base64-encode합니다.
**참고**  
Amazon SWF는 Base64로 인코딩된 HMAC-SHA 값 끝에 등호(`=`)가 있어야 합니다. Base64 인코딩 루틴에 등호가 추가되어 있지 않으면 값의 끝에 등호를 추가합니다.

   Amazon SWF 및 기타 AWS 서비스에서 임시 보안 자격 증명을 사용하는 방법에 대한 자세한 내용은 [AWS IAM 사용 설명서의 IAM으로 작업하는 서비스를](https://docs.aws.amazon.com/STS/latest/UsingSTS/UsingTokens.html) 참조하세요. ** 

1. Amazon SWF에 대한 HTTP 요청의 `x-amzn-authorization` 헤더에 `Signature` 이름에 대한 값으로 결과 값을 배치합니다.

1. Amazon SWF는 요청을 확인하고 지정된 작업을 수행합니다.