WebSocket 라이브러리를 사용하여 미리 서명된 요청 생성 - AWS IoT Wireless

WebSocket 라이브러리를 사용하여 미리 서명된 요청 생성

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

IAM 역할에 WebSocket 요청에 대한 정책 추가

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

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

미리 서명된 URL 생성

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

네트워크 분석기를 호출하려면 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_request)이 포함됩니다.

  • X-Amz-Date – 서명이 생성된 날짜 및 시간입니다. Amazon Web Services 일반 참조서명 버전 4에서 날짜 처리의 지침에 따라 날짜와 시간을 생성합니다.

  • X-Amz-Expires – 자격 증명이 만료될 때까지의 기간(초)입니다. 최대값은 300초(5분)입니다.

  • X-Amz-Security-Token – (선택 사항) 임시 자격 증명을 위한 서명 버전 4 토큰입니다. 이 파라미터를 지정하는 경우 표준 요청에 포함합니다. 자세한 내용은 AWS Identity and Access Management 사용 설명서임시 보안 자격 증명 요청 섹션을 참조하세요.

  • X-Amz-Signature – 요청에 대해 생성한 서명 버전 4 서명입니다.

  • X-Amz-SignedHeaders – 요청에 대한 서명을 생성할 때 서명한 헤더입니다. 유일한 유효 값은 host입니다.

요청 URL 구성 및 서명 버전 4 서명 생성

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

요청의 정보가 포함된 문자열을 표준화된 형식으로 생성합니다. 그러면 AWS에서 요청을 수신할 때 사용자가 작업 3: 서명 계산에서 계산한 것과 동일한 서명을 계산할 수 있습니다. 자세한 내용은 Amazon Web Services 일반 참조서명 버전 4에 대한 표준 요청 생성을 참조하세요.

  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
  2. 정식 URI(Uniform Resource Identifier)를 생성합니다. 표준 URI는 도메인과 쿼리 문자열 간의 URI 부분입니다.

    canonical_uri = "/start-network-analyzer-stream"
  3. 표준 헤더 및 서명된 헤더를 생성합니다. 표준 헤더의 후행 \n에 유의하세요.

    • 소문자 헤더 이름과 콜론을 차례대로 추가합니다.

    • 헤더에 대한 쉼표로 구분된 값 목록을 추가합니다. 여러 값을 가진 헤더에서 값을 정렬하지 마세요.

    • 새 줄(\n)을 추가합니다.

    canonical_headers = "host:" + host + "\n" signed_headers = "host"
  4. 이 알고리즘을 해싱 알고리즘과 일치시킵니다. 이때 SHA-256을 사용해야 합니다.

    algorithm = "AWS4-HMAC-SHA256"
  5. 생성된 키의 범위를 요청이 수행된 날짜, 리전 및 서비스로 지정하는 자격 증명 범위를 생성합니다.

    credential_scope = datestamp + "/" + region + "/" + service + "/" + "aws4_request"
  6. 표준 쿼리 문자열을 생성합니다. 쿼리 문자열 값은 URL로 인코딩되어야 하며 이름을 기준으로 정렬되어야 합니다.

    • 문자 코드 포인트를 기준으로 파라미터 이름을 오름차순으로 정렬합니다. ​중복된 이름을 가진 파라미터는 값별로 정렬해야 합니다. 예를 들어 대문자 F로 시작하는 파라미터 이름 앞에 소문자 b로 시작하는 파라미터 이름이 옵니다.

    • 예약되지 않은 문자는 URI로 인코딩하지 않습니다. RFC 3986에 정의된 예약되지 않은 문자는 A-Z, a-z, 0-9, 하이픈( - ), 밑줄( _ ), 마침표( . ) 및 물결표( ~ )입니다.

    • %XY와 같이 모든 기타 문자를 퍼센트 인코딩합니다. 여기서 X 및 Y는 16진 문자(0 ~ 9 및 대문자 A ~ F)입니다. 예를 들어 공백 문자는 %20(일부 인코딩 구조인 +가 아님)로 인코딩되고, 확장 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"
  7. 페이로드의 해시를 생성합니다. GET 요청의 경우 페이로드는 빈 문자열입니다.

    payload_hash = HashSHA256(("").Encode("utf-8")).HexDigest()
  8. 모든 요소를 결합하여 표준 요청을 생성합니다.

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

서명할 문자열에는 요청에 대한 메타 정보가 포함되어 있습니다. 요청 서명을 계산할 때 다음 단계의 서명할 문자열을 사용합니다. 자세한 내용은 Amazon Web Services 일반 참조서명 버전 4에 대한 서명할 문자열 생성을 참조하세요.

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

AWS 보안 액세스 키에서 서명 키를 생성합니다. 생성된 키는 더 높은 수준의 보호를 위해 날짜, 서비스 및 AWS 리전에 고유합니다. 생성된 키를 사용하여 요청에 서명합니다. 자세한 내용은 Amazon Web Services 일반 참조AWS 서명 버전 4에 대한 서명 계산을 참조하세요.

이 코드는 GetSignatureKey 함수를 구현하여 서명 키를 생성했다고 가정합니다. 자세한 내용과 예제 함수는 Amazon Web Services 일반 참조서명 버전 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

서명을 계산한 후 쿼리 문자열에 추가합니다. 자세한 내용은 Amazon Web Services 일반 참조요청에 서명 추가를 참조하세요.

#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

다음 단계

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