

# WebSocket 라이브러리를 사용하여 미리 서명된 요청 생성
<a name="network-analyzer-generate-request"></a>

다음은 WebSocket 라이브러리를 사용하여 서비스에 요청을 전송할 수 있도록 미리 서명된 요청을 생성하는 방법을 보여줍니다.

## IAM 역할에 WebSocket 요청에 대한 정책 추가
<a name="network-analyzer-iam"></a>

WebSocket 프로토콜을 사용하여 네트워크 분석기를 호출하려면 이 요청을 하는 AWS Identity and Access Management(IAM) 역할에 다음 정책을 연결합니다.

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iotwireless:StartNetworkAnalyzerStream",
            "Resource": "*"
        }
    ]
}
```

## 미리 서명된 URL 생성
<a name="network-analyzer-presigned-url"></a>

애플리케이션과 네트워크 분석기 간에 통신을 설정하는 데 필요한 정보가 포함되어 있는 WebSocket 요청에 대한 URL을 생성합니다. 요청의 자격 증명을 확인하려면 WebSocket 스트리밍에서는 Amazon 서명 버전 4 프로세스를 사용하여 요청에 서명합니다. 서명 버전 4에 대한 자세한 내용은 *Amazon Web Services 일반 참조*의 [AWS API 요청에 서명](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)을 참조하세요.

네트워크 분석기를 호출하려면 `StartNetworkAnalyzerStream` 요청 URL을 사용합니다. 요청은 앞에서 언급한 IAM 역할의 자격 증명을 사용하여 서명됩니다. URL은 가독성을 위해 줄 바꿈이 추가된 다음 형식입니다.

```
GET wss://api.iotwireless.<region>.amazonaws.com/start-network-analyzer-stream?X-Amz-Algorithm=AWS4-HMAC-SHA256
   &X-Amz-Credential=Signature Version 4 credential scope
   &X-Amz-Date=date
   &X-Amz-Expires=time in seconds until expiration
   &X-Amz-Security-Token=security-token
   &X-Amz-Signature=Signature Version 4 signature 
   &X-Amz-SignedHeaders=host
```

서명 버전 4 파라미터에 대해 다음 값을 사용합니다.
+ **X-Amz-Algorithm** – 서명 프로세스에서 사용하는 알고리즘입니다. 유일한 유효 값은 `AWS4-HMAC-SHA256`입니다.
+ **X-Amz-Credential** – 사용자의 액세스 키 ID와 자격 증명 범위 구성 요소를 연결해 형성한, 슬래시('/')로 구분한 문자열입니다. 자격 증명 범위에는 YYYYMMDD 형식의 날짜, AWS 리전, 서비스 이름, 종료 문자열(aws4\$1request)이 포함됩니다.
+ **X-Amz-Date** – 서명이 생성된 날짜 및 시간입니다. *Amazon Web Services 일반 참조*의 [서명 버전 4에서 날짜 처리](https://docs.aws.amazon.com/general/latest/gr/sigv4-date-handling.html)의 지침에 따라 날짜와 시간을 생성합니다.
+ **X-Amz-Expires** – 자격 증명이 만료될 때까지의 기간(초)입니다. 최대값은 300초(5분)입니다.
+ **X-Amz-Security-Token** – (선택 사항) 임시 자격 증명을 위한 서명 버전 4 토큰입니다. 이 파라미터를 지정하는 경우 표준 요청에 포함합니다. 자세한 내용은 [AWS Identity and Access Management 사용 설명서](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)의 *임시 보안 자격 증명 요청* 섹션을 참조하세요.
+ **X-Amz-Signature** – 요청에 대해 생성한 서명 버전 4 서명입니다.
+ **X-Amz-SignedHeaders** – 요청에 대한 서명을 생성할 때 서명한 헤더입니다. 유일한 유효 값은 `host`입니다.

## 요청 URL 구성 및 서명 버전 4 서명 생성
<a name="connect-iot-network-analyzer-construct-url-sign"></a>

요청에 대한 URL과 서명 버전 4 서명을 생성하려면 다음 단계를 따르십시오. 유사 코드의 예제입니다.

### 작업 1: 표준 요청 생성
<a name="canonical-request"></a>

요청의 정보가 포함된 문자열을 표준화된 형식으로 생성합니다. 그러면 AWS에서 요청을 수신할 때 사용자가 [작업 3: 서명 계산](#calculate-signature)에서 계산한 것과 동일한 서명을 계산할 수 있습니다. 자세한 내용은 *Amazon Web Services 일반 참조*의 [서명 버전 4에 대한 표준 요청 생성](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html)을 참조하세요.

1. 애플리케이션의 요청에 대한 변수를 정의합니다.

   ```
   # HTTP verb
   method = "GET"
   # Service name
   service = "iotwireless"
   # AWS 리전
   region = "AWS 리전"
   # Service streaming endpoint
   endpoint = "wss://api.iotwireless.region.amazonaws.com"
   # Host
   host = "api.iotwireless.<region>.amazonaws.com"
   # Date and time of request
   amz-date = YYYYMMDD'T'HHMMSS'Z'
   # Date without time for credential scope
   datestamp = YYYYMMDD
   ```

1. 정식 URI(Uniform Resource Identifier)를 생성합니다. 표준 URI는 도메인과 쿼리 문자열 간의 URI 부분입니다.

   ```
   canonical_uri = "/start-network-analyzer-stream"
   ```

1. 표준 헤더 및 서명된 헤더를 생성합니다. 표준 헤더의 후행 `\n`에 유의하세요.
   + 소문자 헤더 이름과 콜론을 차례대로 추가합니다.
   + 헤더에 대한 쉼표로 구분된 값 목록을 추가합니다. 여러 값을 가진 헤더에서 값을 정렬하지 마세요.
   + 새 줄(`\n`)을 추가합니다.

   ```
   canonical_headers = "host:" + host + "\n"
   signed_headers = "host"
   ```

1. 이 알고리즘을 해싱 알고리즘과 일치시킵니다. 이때 SHA-256을 사용해야 합니다.

   ```
   algorithm = "AWS4-HMAC-SHA256"
   ```

1. 생성된 키의 범위를 요청이 수행된 날짜, 리전 및 서비스로 지정하는 자격 증명 범위를 생성합니다.

   ```
   credential_scope = datestamp + "/" + region + "/" + service + "/" + "aws4_request"
   ```

1. 표준 쿼리 문자열을 생성합니다. 쿼리 문자열 값은 URL로 인코딩되어야 하며 이름을 기준으로 정렬되어야 합니다.
   + 문자 코드 포인트를 기준으로 파라미터 이름을 오름차순으로 정렬합니다. ​중복된 이름을 가진 파라미터는 값별로 정렬해야 합니다. 예를 들어 대문자 F로 시작하는 파라미터 이름 앞에 소문자 b로 시작하는 파라미터 이름이 옵니다.
   + 예약되지 않은 문자는 URI로 인코딩하지 않습니다. [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986)에 정의된 예약되지 않은 문자는 A-Z, a-z, 0-9, 하이픈( - ), 밑줄( \$1 ), 마침표( . ) 및 물결표( \$1 )입니다.
   + %XY와 같이 모든 기타 문자를 퍼센트 인코딩합니다. 여기서 X 및 Y는 16진 문자(0 \$1 9 및 대문자 A \$1 F)입니다. 예를 들어 공백 문자는 %20(일부 인코딩 구조인 \$1가 아님)로 인코딩되고, 확장 UTF-8 문자는 %XY%ZA%BC 형식이어야 합니다.
   + 매개변수 값에서 등호(=) 문자를 두 번 인코딩합니다.

   ```
   canonical_querystring  = "X-Amz-Algorithm=" + algorithm
   canonical_querystring += "&X-Amz-Credential="+ URI-encode(access key + "/" + credential_scope)
   canonical_querystring += "&X-Amz-Date=" + amz_date 
   canonical_querystring += "&X-Amz-Expires=300"
   canonical_querystring += "&X-Amz-Security-Token=" + token
   canonical_querystring += "&X-Amz-SignedHeaders=" + signed_headers
   canonical_querystring += "&language-code=en-US&media-encoding=pcm&sample-rate=16000"
   ```

1. 페이로드의 해시를 생성합니다. GET 요청의 경우 페이로드는 빈 문자열입니다.

   ```
   payload_hash = HashSHA256(("").Encode("utf-8")).HexDigest()
   ```

1. 모든 요소를 결합하여 표준 요청을 생성합니다.

   ```
   canonical_request = method + '\n' 
      + canonical_uri + '\n' 
      + canonical_querystring + '\n' 
      + canonical_headers + '\n' 
      + signed_headers + '\n' 
      + payload_hash
   ```

### 작업 2: 서명할 문자열 생성
<a name="create-urlsign"></a>

서명할 문자열에는 요청에 대한 메타 정보가 포함되어 있습니다. 요청 서명을 계산할 때 다음 단계의 서명할 문자열을 사용합니다. 자세한 내용은 *Amazon Web Services 일반 참조*의 [서명 버전 4에 대한 서명할 문자열 생성](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html)을 참조하세요.

```
string_to_sign=algorithm + "\n"
   + amz_date + "\n"
   + credential_scope + "\n"
   + HashSHA256(canonical_request.Encode("utf-8")).HexDigest()
```

### 작업 3: 서명 계산
<a name="calculate-signature"></a>

AWS 보안 액세스 키에서 서명 키를 생성합니다. 생성된 키는 더 높은 수준의 보호를 위해 날짜, 서비스 및 AWS 리전에 고유합니다. 생성된 키를 사용하여 요청에 서명합니다. 자세한 내용은 *Amazon Web Services 일반 참조*의 [AWS 서명 버전 4에 대한 서명 계산](https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html)을 참조하세요.

이 코드는 `GetSignatureKey` 함수를 구현하여 서명 키를 생성했다고 가정합니다. 자세한 내용과 예제 함수는 [Amazon Web Services 일반 참조](https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html)의 *서명 버전 4에 대한 서명 키 생성 방법을 보여주는 예*를 참조하세요.

`HMAC(key, data)` 함수는 결과를 이진 형식으로 반환하는 HMAC-SHA256 함수를 나타냅니다.

```
#Create the signing key
signing_key = GetSignatureKey(secret_key, datestamp, region, service)
                
# Sign the string_to_sign using the signing key
signature = HMAC.new(signing_key, (string_to_sign).Encode("utf-8"), Sha256()).HexDigest
```

### 작업 4: 요청에 서명 정보 추가 및 요청 URL 생성
<a name="sign-request"></a>

서명을 계산한 후 쿼리 문자열에 추가합니다. 자세한 내용은 [Amazon Web Services 일반 참조](https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html)의 *요청에 서명 추가*를 참조하세요.

```
#Add the authentication information to the query string
canonical_querystring += "&X-Amz-Signature=" + signature
                
# Sign the string_to_sign using the signing key
request_url = endpoint + canonical_uri + "?" + canonical_querystring
```

## 다음 단계
<a name="network-analyzer-request-next"></a>

이제 WebSocket 라이브러리와 함께 요청 URL을 사용하여 서비스에 요청하고 메시지를 관찰할 수 있습니다. 자세한 내용은 [WebSocket 메시지 및 상태 코드](network-analyer-messages-status.md) 단원을 참조하십시오.