기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS AppSync의 실시간 WebSocket 클라이언트는 다단계 프로세스를 통해 GraphQL 구독을 활성화합니다. 클라이언트는 먼저 AWS AppSync 실시간 엔드포인트와 WebSocket 연결을 설정하고 연결 초기화 메시지를 전송한 다음, 확인을 기다립니다. 연결에 성공하면 클라이언트는 고유한 IDs 및 GraphQL 쿼리로 시작 메시지를 전송하여 구독을 등록합니다. AWS AppSync는 승인 메시지로 성공적인 구독을 확인합니다. 그런 다음, 클라이언트는 해당 변형에서 트리거된 구독 이벤트를 수신합니다. 연결을 유지하기 위해 AWS AppSync는 주기적 연결 유지 메시지를 전송합니다. 기간이 종료되면 클라이언트는 중지 메시지를 전송하여 구독 등록을 취소합니다. 이 시스템은 단일 WebSocket 연결에서 여러 구독을 지원하며 API 키, Amazon Cognito 사용자 풀, IAM 및 Lambda를 비롯한 다양한 권한 부여 모드를 수용합니다.
GraphQL 구독을 위한 실시간 WebSocket 클라이언트 구현
다음 시퀀스 다이어그램 및 단계는 WebSocket 클라이언트, HTTP 클라이언트 및 AWS AppSync 간의 실시간 구독 워크플로를 보여줍니다.

-
클라이언트는 AWS AppSync 실시간 엔드포인트와 WebSocket 연결을 설정합니다. 네트워크 오류가 있는 경우 클라이언트는 지터 지수 백오프를 수행해야 합니다. 자세한 내용은 AWS 아키텍처 블로그의 지수 백오프 및 지터
를 참조하세요. -
(선택 사항) WebSocket 연결을 성공적으로 설정하면 클라이언트가
connection_init
메시지를 보냅니다. -
connection_init
가 전송되면 클라이언트는 AWS AppSync의connection_ack
메시지를 기다립니다. 이 메시지에는"ka"
(연결 유지) 메시지의 최대 대기 시간(밀리초)인connectionTimeoutMs
파라미터가 포함됩니다. -
AWS AppSync는 주기적으로
"ka"
메시지를 전송합니다. 클라이언트는 각"ka"
메시지를 수신한 시간을 추적합니다. 클라이언트가connectionTimeoutMs
밀리초 이내에"ka"
메시지를 수신하지 못하면 클라이언트는 연결을 종료해야 합니다. -
클라이언트는
start
구독 메시지를 전송하여 구독을 등록합니다. 단일 WebSocket 연결은 서로 다른 인증 모드에 있더라도 여러 구독을 지원합니다. -
클라이언트는 AWS AppSync가 성공적인 구독을 확인하는
start_ack
메시지를 보낼 때까지 기다립니다. 오류가 있는 경우 AWS AppSync는"type": "error"
메시지를 반환합니다. -
클라이언트는 해당 변형이 직접적으로 호출된 후 전송되는 구독 이벤트를 수신합니다. 쿼리 및 변형은 일반적으로를 통해 AWS AppSync GraphQL 엔드포인트
https://
로 전송됩니다. 구독은 보안 WebSocket AWS AppSync 실시간 엔드포인트를 통해 흐릅니다wss://
. -
클라이언트는
stop
구독 메시지를 전송하여 구독을 등록 취소합니다. -
모든 구독을 등록 취소하고 WebSocket을 통해 전송되는 메시지가 없는지 확인한 후, 클라이언트는 WebSocket 연결에서 연결을 해제할 수 있습니다.
WebSocket 연결을 설정하기 위한 핸드셰이크 세부 정보
AWS AppSync를 사용하여 성공적인 핸드셰이크를 연결하고 시작하려면 WebSocket 클라이언트에 다음이 필요합니다.
-
AWS AppSync 실시간 엔드포인트
-
헤더 - 엔드포인트 및 권한 부여와 관련된 정보를 포함합니다.는 헤더를 제공하기 위해 다음과 같은 세 가지 방법을 지원합니다.
-
쿼리 문자열을 통한 헤더
-
헤더 정보는 문자열화된 JSON 객체에서 파생된 base64 문자열로 인코딩됩니다. 이 JSON 객체에는 엔드포인트 및 권한 부여와 관련된 세부 정보가 포함되어 있습니다. JSON 객체의 콘텐츠는 권한 부여 모드에 따라 달라집니다.
-
-
를 통한 헤더
Sec-WebSocket-Protocol
-
AWS AppSync 엔드포인트 및 권한 부여와 관련된 정보가 포함된 문자열화된 JSON 객체의 base64Url-encoded 문자열이
Sec-WebSocket-Protocol
헤더의 프로토콜로 전달됩니다. JSON 객체의 콘텐츠는 권한 부여 모드에 따라 달라집니다.
-
-
표준 HTTP 헤더를 통한 헤더:
-
헤더는 GraphQL 쿼리 및 변형에 대해 헤더가 AWS AppSync에 전달되는 방식과 마찬가지로 연결 요청에서 표준 HTTP 헤더로 전달될 수 있습니다. 그러나 표준 HTTP 헤더를 통해 헤더를 전달하는 것은 프라이빗 API 연결 요청에 지원되지 않습니다.
-
-
-
payload
Base64-encoded 문자열입니다payload
. 페이로드는 쿼리 문자열을 사용하여 헤더가 제공된 경우에만 필요합니다.
WebSocket 클라이언트는 이러한 요구 사항과 함께 graphql-ws
를 WebSocket 프로토콜로 사용하여 쿼리 문자열이 있는 API 실시간 엔드포인트가 포함된 URL에 연결할 수 있습니다.
GraphQL 엔드포인트에서 실시간 엔드포인트 검색
AWS AppSync GraphQL 엔드포인트와 AWS AppSync 실시간 엔드포인트는 프로토콜과 도메인이 약간 다릅니다. AWS Command Line Interface (AWS CLI) 명령를 사용하여 GraphQL 엔드포인트를 검색할 수 있습니다aws appsync get-graphql-api
.
- AWS AppSync GraphQL 엔드포인트:
-
https://example1234567890000.appsync-api.us-east-1.amazonaws.com/graphql
- AWS AppSync 실시간 엔드포인트:
-
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
애플리케이션은 쿼리 및 변형에 대해 모든 HTTP 클라이언트를 사용하여 AWS AppSync GraphQL 엔드포인트(https://
)에 연결할 수 있습니다. 애플리케이션은 구독을 위해 모든 WebSocket AWS 클라이언트를 사용하여 AppSync 실시간 엔드포인트(wss://
)에 연결할 수 있습니다.
사용자 지정 도메인 이름을 사용하면 하나의 도메인을 사용하여 두 엔드포인트와 모두 상호 작용할 수 있습니다. 예를 들어 api.example.com
을 사용자 지정 도메인으로 구성하면 다음 URL을 사용하여 GraphQL 및 실시간 엔드포인트와 상호 작용할 수 있습니다.
- AWS AppSync 사용자 지정 도메인 GraphQL 엔드포인트:
-
https://api.example.com/graphql
- AWS AppSync 사용자 지정 도메인 실시간 엔드포인트:
-
wss://api.example.com/graphql/realtime
AWS AppSync API 권한 부여 모드를 기반으로 하는 헤더 파라미터 형식
연결 쿼리 문자열에 사용되는 header
객체의 형식은 AWS AppSync API 권한 부여 모드에 따라 달라집니다. 객체의 host
필드는 실시간 엔드포인트에 대해 wss://
호출이 이루어진 경우에도 연결을 검증하는 데 사용되는 AWS AppSync GraphQL 엔드포인트를 나타냅니다. 핸드셰이크를 시작하고 인증된 연결을 설정하려면 payload
가 비어 있는 JSON 객체여야 합니다. 페이로드는 헤더가 쿼리 문자열을 통해 전달되는 경우에만 필요합니다.
다음 섹션에서는 각 권한 부여 모드의 헤더 형식을 보여줍니다.
API 키
API 키 헤더
헤더 콘텐츠
-
"host": <string>
: AWS AppSync GraphQL 엔드포인트의 호스트 또는 사용자 지정 도메인 이름입니다. -
"x-api-key": <string>
: AWS AppSync API에 대해 구성된 API 키입니다.
예제
{
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com",
"x-api-key":"da2-12345678901234567890123456"
}
쿼리 문자열을 통한 헤더
먼저 host
및를 포함하는 JSON 객체가 문자열로 변환x-api-key
됩니다. 다음으로이 문자열은 base64 인코딩을 사용하여 인코딩됩니다. 결과 base64 인코딩 문자열은 AWS AppSync 실시간 엔드포인트와의 연결을 설정header
하기 위해 WebSocket URL에 라는 쿼리 파라미터로 추가됩니다. WebSocket 결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJob3N0IjoiZXhhbXBsZTEyMzQ1Njc4OTAwMDAuYXBwc3luYy1hcGkudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20iLCJ4LWFtei1kYXRlIjoiMjAyMDA0MDFUMDAxMDEwWiIsIngtYXBpLWtleSI6ImRhMi16NHc0NHZoczV6Z2MzZHRqNXNranJsbGxqaSJ9&payload=e30=
base64로 인코딩된 헤더 객체 외에도 빈 JSON 객체 {}도 base64로 인코딩되어 WebSocket URLpayload
에 이름이 지정된 별도의 쿼리 파라미터로 포함됩니다.
를 통한 헤더 Sec-WebSocket-Protocol
host
및를 포함하는 JSON 객체x-api-key
는 문자열로 변환된 다음 base64Url 인코딩을 사용하여 인코딩됩니다. 결과 base64Url-encoded 문자열에는 접두사가 붙습니다header-
. 그런 다음 접두사가 붙은이 문자열은 AWS AppSync 실시간 엔드포인트와 WebSocket 연결을 설정할 때 Sec-WebSocket-Protocol
헤더graphql-ws
에 외에도 새 하위 프로토콜로 사용됩니다.
결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
Sec-WebSocket-Protocol
헤더에는 다음 값이 포함됩니다.
"sec-websocket-protocol" : ["graphql-ws", "header-ewogICAgImhvc3QiOiJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsCiAgICAieC1hcGkta2V5IjoiZGEyLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Igp9"]
표준 HTTP 헤더를 통한 헤더
이 메서드에서 호스트 및 API 키 정보는 AWS AppSync 실시간 엔드포인트와 WebSocket 연결을 설정할 때 표준 HTTP 헤더를 사용하여 전송됩니다. 결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
요청 헤더에는 다음이 포함됩니다.
"sec-websocket-protocol" : ["graphql-ws"]
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com",
"x-api-key":"da2-12345678901234567890123456"
Amazon Cognito 사용자 풀 및 OpenID Connect(OIDC)
Amazon Cognito 및 OIDCheader
헤더 콘텐츠:
-
"Authorization": <string>
: JWT ID 토큰입니다. 헤더는 보유자 체계를 사용할 수 있습니다. -
"host": <string>
: AWS AppSync GraphQL 엔드포인트의 호스트 또는 사용자 지정 도메인 이름입니다.
예시
{
"Authorization":"eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJHWEFLSXBieU5WNHhsQjEXAMPLEnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyEXAMPLEiJhNmNmMjcwNy0xNjgxLTQ1NDItOWYxOC1lNjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImVkMzM5MmNkLWNjYTMtNGM2OC1hNDYyLTJlZGI3ZTNmY2FjZiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk0NTc3MTgsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zb3V0aGVhc3QtMl83OHY0SVZibVAiLCJleHAiOjE1Njk0NjEzMjAsImlhdCI6MTU2OTQ1NzcyMCwianRpIjoiNTgzZjhmYmMtMzk2MS00YzA4LWJhZTAtYzQyY2IxMTM5NDY5IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1N3RoZWw0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3EXAMPLEn0.B4EXAMPLEFNpJ6ikVp7e6DRee95V6Qi-zEE2DJH7sHOl2zxYi7f-SmEGoh2AD8emxQRYajByz-rE4Jh0QOymN2Ys-ZIkMpVBTPgu-TMWDyOHhDUmUj2OP82yeZ3wlZAtr_gM4LzjXUXmI_K2yGjuXfXTaa1mvQEBG0mQfVd7SfwXB-jcv4RYVi6j25qgow9Ew52ufurPqaK-3WAKG32KpV8J4-Wejq8t0c-yA7sb8EnB551b7TU93uKRiVVK3E55Nk5ADPoam_WYE45i3s5qVAP_-InW75NUoOCGTsS8YWMfb6ecHYJ-1j-bzA27zaT9VjctXn9byNFZmEXAMPLExw",
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
}
쿼리 문자열을 통한 헤더
먼저 host
및를 포함하는 JSON 객체가 문자열로 변환Authorization
됩니다. 다음으로이 문자열은 base64 인코딩을 사용하여 인코딩됩니다. 결과 base64 인코딩 문자열은 AWS AppSync 실시간 엔드포인트와의 연결을 설정header
하기 위해 WebSocket URL에 라는 쿼리 파라미터로 추가됩니다. WebSocket 결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJBdXRob3JpemF0aW9uIjoiZXlKcmFXUWlPaUpqYkc1eGIzQTVlVzVNSzA5UVlYSXJNVEpIV0VGTFNYQmllVTVXTkhoc1FqaFBWVzlZTW5NMldsZHZQU0lzSW1Gc1p5STZJbEpUTWpVMkluMC5leUp6ZFdJaU9pSmhObU5tTWpjd055MHhOamd4TFRRMU5ESXRPV1l4T0MxbE5qWTBNVGcyTmpsa016WWlMQ0psZG1WdWRGOXBaQ0k2SW1Wa016TTVNbU5rTFdOallUTXROR00yT0MxaE5EWXlMVEpsWkdJM1pUTm1ZMkZqWmlJc0luUnZhMlZ1WDNWelpTSTZJbUZqWTJWemN5SXNJbk5qYjNCbElqb2lZWGR6TG1OdloyNXBkRzh1YzJsbmJtbHVMblZ6WlhJdVlXUnRhVzRpTENKaGRYUm9YM1JwYldVaU9qRTFOamswTlRjM01UZ3NJbWx6Y3lJNkltaDBkSEJ6T2x3dlhDOWpiMmR1YVhSdkxXbGtjQzVoY0MxemIzVjBhR1ZoYzNRdE1pNWhiV0Y2YjI1aGQzTXVZMjl0WEM5aGNDMXpiM1YwYUdWaGMzUXRNbDgzT0hZMFNWWmliVkFpTENKbGVIQWlPakUxTmprME5qRXpNakFzSW1saGRDSTZNVFUyT1RRMU56Y3lNQ3dpYW5ScElqb2lOVGd6WmpobVltTXRNemsyTVMwMFl6QTRMV0poWlRBdFl6UXlZMkl4TVRNNU5EWTVJaXdpWTJ4cFpXNTBYMmxrSWpvaU0zRmxhalZsTVhabU16ZDFOM1JvWld3MGRHOTFkREprTVd3aUxDSjFjMlZ5Ym1GdFpTSTZJbVZzYjNKNllXWmxJbjAuQjRjZEp0aDNLRk5wSjZpa1ZwN2U2RFJlZTk1VjZRaS16RUUyREpIN3NIT2wyenhZaTdmLVNtRUdvaDJBRDhlbXhRUllhakJ5ei1yRTRKaDBRT3ltTjJZcy1aSWtNcFZCVFBndS1UTVdEeU9IaERVbVVqMk9QODJ5ZVozd2xaQXRyX2dNNEx6alhVWG1JX0syeUdqdVhmWFRhYTFtdlFFQkcwbVFmVmQ3U2Z3WEItamN2NFJZVmk2ajI1cWdvdzlFdzUydWZ1clBxYUstM1dBS0czMktwVjhKNC1XZWpxOHQwYy15QTdzYjhFbkI1NTFiN1RVOTN1S1JpVlZLM0U1NU5rNUFEUG9hbV9XWUU0NWkzczVxVkFQXy1Jblc3NU5Vb09DR1RzUzhZV01mYjZlY0hZSi0xai1iekEyN3phVDlWamN0WG45YnlORlptS0xwQTJMY3h3IiwiaG9zdCI6ImV4YW1wbGUxMjM0NTY3ODkwMDAwLmFwcHN5bmMtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIn0=&payload=e30=
base64로 인코딩된 헤더 객체 외에도 빈 JSON 객체 {}도 base64로 인코딩되어 WebSocket URLpayload
에 이름이 지정된 별도의 쿼리 파라미터로 포함됩니다.
를 통한 헤더 Sec-WebSocket-Protocol
host
및를 포함하는 JSON 객체Authorization
는 문자열로 변환된 다음 base64Url 인코딩을 사용하여 인코딩됩니다. 결과 base64Url-encoded 문자열에는 접두사가 붙습니다header-
. 그런 다음 접두사가 붙은이 문자열은 AWS AppSync 실시간 엔드포인트와 WebSocket 연결을 설정할 때 Sec-WebSocket-Protocol
헤더graphql-ws
에 외에도 새 하위 프로토콜로 사용됩니다.
결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
Sec-WebSocket-Protocol
헤더에는 다음 값이 포함됩니다.
"sec-websocket-protocol" : ["graphql-ws", "header-ewogICAgImhvc3QiOiJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsCiAgICAieC1hcGkta2V5IjoiZGEyLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Igp9"]
표준 HTTP 헤더를 통한 헤더
이 방법에서 호스트 및 권한 부여 정보는 AWS AppSync 실시간 엔드포인트와 WebSocket 연결을 설정할 때 표준 HTTP 헤더를 사용하여 전송됩니다. 결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
요청 헤더에는 다음이 포함됩니다.
"sec-websocket-protocol" : ["graphql-ws"]
"Authorization":"eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJHWEFLSXBieU5WNHhsQjEXAMPLEnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyEXAMPLEiJhNmNmMjcwNy0xNjgxLTQ1NDItOWYxOC1lNjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImVkMzM5MmNkLWNjYTMtNGM2OC1hNDYyLTJlZGI3ZTNmY2FjZiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk0NTc3MTgsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zb3V0aGVhc3QtMl83OHY0SVZibVAiLCJleHAiOjE1Njk0NjEzMjAsImlhdCI6MTU2OTQ1NzcyMCwianRpIjoiNTgzZjhmYmMtMzk2MS00YzA4LWJhZTAtYzQyY2IxMTM5NDY5IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1N3RoZWw0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3EXAMPLEn0.B4EXAMPLEFNpJ6ikVp7e6DRee95V6Qi-zEE2DJH7sHOl2zxYi7f-SmEGoh2AD8emxQRYajByz-rE4Jh0QOymN2Ys-ZIkMpVBTPgu-TMWDyOHhDUmUj2OP82yeZ3wlZAtr_gM4LzjXUXmI_K2yGjuXfXTaa1mvQEBG0mQfVd7SfwXB-jcv4RYVi6j25qgow9Ew52ufurPqaK-3WAKG32KpV8J4-Wejq8t0c-yA7sb8EnB551b7TU93uKRiVVK3E55Nk5ADPoam_WYE45i3s5qVAP_-InW75NUoOCGTsS8YWMfb6ecHYJ-1j-bzA27zaT9VjctXn9byNFZmEXAMPLExw",
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
IAM
IAM 헤더
헤더 콘텐츠
-
"accept": "application/json, text/javascript"
: 상수<string>
파라미터입니다. -
"content-encoding": "amz-1.0"
: 상수<string>
파라미터입니다. -
"content-type": "application/json; charset=UTF-8"
: 상수<string>
파라미터입니다. -
"host": <string>
: AWS AppSync GraphQL 엔드포인트의 호스트입니다.-
"x-amz-date": <string>
: 타임스탬프는 협정 세계시(UTC)이고 YYYYMMDD'T'HHMMSS'Z' ISO 8601 형식이어야 합니다. 예를 들어, 20150830T123600Z는 유효한 타임스탬프입니다. 타임스탬프에 밀리초를 포함하지 마십시오. 자세한 정보는 AWS 일반 참조의 서명 버전 4에서 날짜 처리를 참조하세요. -
"X-Amz-Security-Token": <string>
: 임시 보안 자격 증명을 사용할 때 필요한 AWS 세션 토큰입니다. 자세한 내용은 IAM 사용 설명서의 AWS 리소스에서 임시 보안 인증 사용을 잠조하세요. -
"Authorization": <string>
: AWS AppSync 엔드포인트에 대한 Signature Version 4(SigV4) 서명 정보입니다. 서명 프로세스에 대한 자세한 내용은 AWS 일반 참조의 작업 4: HTTP 요청에 서명 추가를 참조하세요.
-
SigV4 서명 HTTP 요청에는 표준 URL이 포함되며, 이 URL은 /connect
가 추가된 AWS AppSync GraphQL 엔드포인트입니다. 서비스 엔드포인트 AWS 리전은 AWS AppSync API를 사용하는 리전과 동일하며 서비스 이름은 'appsync'입니다. 서명할 HTTP 요청은 다음과 같습니다.
{
url: "https://example1234567890000.appsync-api.us-east-1.amazonaws.com/graphql/connect",
data: "{}",
method: "POST",
headers: {
"accept": "application/json, text/javascript",
"content-encoding": "amz-1.0",
"content-type": "application/json; charset=UTF-8",
}
}
예제
{
"accept": "application/json, text/javascript",
"content-encoding": "amz-1.0",
"content-type": "application/json; charset=UTF-8",
"host": "example1234567890000.appsync-api.us-east-1.amazonaws.com",
"x-amz-date": "20200401T001010Z",
"X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
"Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=83EXAMPLEbcc1fe3ee69f75cd5ebbf4cb4f150e4f99cec869f149c5EXAMPLEdc"
}
쿼리 문자열을 통한 헤더
먼저 host
(AWS AppSync GraphQL 엔드포인트) 및 기타 권한 부여 헤더가 포함된 JSON 객체가 문자열로 변환됩니다. 다음으로이 문자열은 base64 인코딩을 사용하여 인코딩됩니다. 결과 base64로 인코딩된 문자열이 라는 쿼리 파라미터로 WebSocket URL에 추가됩니다header
. 결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJBdXRob3JpemF0aW9uIjoiZXlKcmFXUWlPaUpqYkc1eGIzQTVlVzVNSzA5UVlYSXJNVEpIV0VGTFNYQmllVTVXTkhoc1FqaFBWVzlZTW5NMldsZHZQU0lzSW1Gc1p5STZJbEpUTWpVMkluMC5leUp6ZFdJaU9pSmhObU5tTWpjd055MHhOamd4TFRRMU5ESXRPV1l4T0MxbE5qWTBNVGcyTmpsa016WWlMQ0psZG1WdWRGOXBaQ0k2SW1Wa016TTVNbU5rTFdOallUTXROR00yT0MxaE5EWXlMVEpsWkdJM1pUTm1ZMkZqWmlJc0luUnZhMlZ1WDNWelpTSTZJbUZqWTJWemN5SXNJbk5qYjNCbElqb2lZWGR6TG1OdloyNXBkRzh1YzJsbmJtbHVMblZ6WlhJdVlXUnRhVzRpTENKaGRYUm9YM1JwYldVaU9qRTFOamswTlRjM01UZ3NJbWx6Y3lJNkltaDBkSEJ6T2x3dlhDOWpiMmR1YVhSdkxXbGtjQzVoY0MxemIzVjBhR1ZoYzNRdE1pNWhiV0Y2YjI1aGQzTXVZMjl0WEM5aGNDMXpiM1YwYUdWaGMzUXRNbDgzT0hZMFNWWmliVkFpTENKbGVIQWlPakUxTmprME5qRXpNakFzSW1saGRDSTZNVFUyT1RRMU56Y3lNQ3dpYW5ScElqb2lOVGd6WmpobVltTXRNemsyTVMwMFl6QTRMV0poWlRBdFl6UXlZMkl4TVRNNU5EWTVJaXdpWTJ4cFpXNTBYMmxrSWpvaU0zRmxhalZsTVhabU16ZDFOM1JvWld3MGRHOTFkREprTVd3aUxDSjFjMlZ5Ym1GdFpTSTZJbVZzYjNKNllXWmxJbjAuQjRjZEp0aDNLRk5wSjZpa1ZwN2U2RFJlZTk1VjZRaS16RUUyREpIN3NIT2wyenhZaTdmLVNtRUdvaDJBRDhlbXhRUllhakJ5ei1yRTRKaDBRT3ltTjJZcy1aSWtNcFZCVFBndS1UTVdEeU9IaERVbVVqMk9QODJ5ZVozd2xaQXRyX2dNNEx6alhVWG1JX0syeUdqdVhmWFRhYTFtdlFFQkcwbVFmVmQ3U2Z3WEItamN2NFJZVmk2ajI1cWdvdzlFdzUydWZ1clBxYUstM1dBS0czMktwVjhKNC1XZWpxOHQwYy15QTdzYjhFbkI1NTFiN1RVOTN1S1JpVlZLM0U1NU5rNUFEUG9hbV9XWUU0NWkzczVxVkFQXy1Jblc3NU5Vb09DR1RzUzhZV01mYjZlY0hZSi0xai1iekEyN3phVDlWamN0WG45YnlORlptS0xwQTJMY3h3IiwiaG9zdCI6ImV4YW1wbGUxMjM0NTY3ODkwMDAwLmFwcHN5bmMtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIn0=&payload=e30=
base64로 인코딩된 헤더 객체 외에도 빈 JSON 객체 {}도 base64로 인코딩되어 WebSocket URLpayload
에 이름이 지정된 별도의 쿼리 파라미터로 포함됩니다.
를 통한 헤더 Sec-WebSocket-Protocol
host
및 기타 권한 부여 헤더가 포함된 JSON 객체는 문자열로 변환된 다음 base64Url 인코딩을 사용하여 인코딩됩니다. 결과 base64Url-encoded 문자열에는 접두사가 붙습니다header-
. 그런 다음 접두사가 붙은이 문자열은 AWS AppSync 실시간 엔드포인트와 WebSocket 연결을 설정할 때 Sec-WebSocket-Protocol
헤더graphql-ws
에 외에도 새 하위 프로토콜로 사용됩니다.
결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
Sec-WebSocket-Protocol
헤더에는 다음 값이 포함됩니다.
"sec-websocket-protocol" : ["graphql-ws", "header-ew0KICAiYWNjZXB0IjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsDQogICJjb250ZW50LWVuY29kaW5nIjogImFtei0xLjAiLA0KICAiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiLA0KICAiaG9zdCI6ICJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsDQogICJ4LWFtei1kYXRlIjogIjIwMjAwNDAxVDAwMTAxMFoiLA0KICAiWC1BbXotU2VjdXJpdHktVG9rZW4iOiAiQWdFWEFNUExFWjJsdVgyVmpFQW9hRG1Gd0xYTnZkWFJvWldGRVhBTVBMRWN3UlFJZ0FoOTdDbGpxN3dPUEw4S3N4UDNZdER1eWMvOWhBajhQaEo3RnZmMzhTZ29DSVFEaEpFWEFNUExFUHNwaW9PenRqKytwRWFnV0N2ZVpVaktFbjB6eVVoQkVYQU1QTEVqai8vLy8vLy8vLy84QkVYQU1QTEV4T0RrMk5EZ3lOemcxTlNJTW8xbVducEVTV1VvWXc0QmtLcUVGU3JtM0RYdUw4dytaYlZjNEpLakRQNHZVQ0tOUjZMZTlDOXBacDlQc1cwTm9GeTN2TEJVZEFYRVhBTVBMRU9WRzhmZVhmaUVFQSsxa2hnRksvd0V0d1IrOXpGN05hTU1Nc2UwN3dOMmdHMnRIMGVLTUVYQU1QTEVRWCtzTWJ5dFFvOGllcFA5UFpPemxac1NGYi9kUDVROGhrNllFWEFNUExFWWNLWnNUa0RBcTJ1S0ZROG1ZVVZBOUV0UW5OUmlGTEVZODNhS3ZHL3RxTFdObkdsU05WeDdTTWNmb3ZrRkRxUWFtbSs4OHkxT3d3QUVZSzdxY29jZVg2WjdHR2NhWXVJZkdwYVgyTUNDRUxlUXZaKzhXeEVnT25JZno3R1l2c1lOakxaU2FSblY0RytJTFkxRjBRTlc2NFM5TnZqK0J3RGczaHQyQ3JOdnB3alZZbGo5VTNubXhFMFVHNW5lODNMTDVoaHFNcG0yNWttTDdlblZndzJrUXptVTJpZDRJS3UwQy9XYW9EUnVPMkY1ekU2M3ZKYnhOOEFZczczMzgrNEI0SEJiNkJaNk9VZ2c5NlExNVJBNDEvZ0lxeGFWUHh5VHBEZlRVNUdmU0x4b2NkWWVuaXFxcEZNdFpHMm45ZDB1N0dzUU5jRmtOY0czcURabTR0RG84dFpidXltMGEyVmNGMkU1aEZFZ1hCYStYTEpDZlhpLzc3T3FBRWpQMHg3UWRrM0I0M3A4S0cvQmFpb1A1UnNWOHpCR3ZIMXpBZ3lQaGEyck43MC90VDEzeXJtUGQ1UVlFZnd6ZXhqS3JWNG1XSXVSZzhOVEhZU1pKVWFleUN3VG9tODBWRlVKWEcrR1lUVXl2NVcyMmFCY25vUkdpQ2lLRVlUTE9rZ1hlY2RLRlRIbWNJQWVqUTlXZWxyMGExOTZLcTg3dzVLTk1Da2NDR0Zud0JORkxtZm5icE5xVDZyVUJ4eHMzWDVudFg5ZDhIVnRTWUlOVHNHWFhNWkNKN2ZuYldhamhnL2FveDBGdEhYMjFlRjZxSUdUOGoxeitsMm9wVStnZ3dVZ2toVVVnQ0gyVGZxQmorTUxNVlZ2cGdxSnNQS3Q1ODJjYUZLQXJJRkl2Tys5UXVweExuRUgyaHowNFRNVGZuVTZiUUM2ejFidVZlN2grdE9MbmgxWVBGc0xRODhhbmliLzdUVEM4azlEc0JUcTBBU2U4UjJHYlNFc21POXFiYk13Z0VhWVVoT0t0R2V5UXNTSmRoU2s2WHhYVGhyV0w5RW53QkNYRGtJQ01xZG50QXh5eU05bldzWjRiTDlKSHFFeGdXVW1mV0NoelBGQXFuM0Y0eTg5NlVxSFRaeGxxM1dHeXBuNUhIY2VtMkhxZjNJVnhLSDFpbmhxZFZ0a3J5RWlUV3JJN1pkamJxbnFSYmwrV2d0UHRLT093ZURsQ2FSczNSMnFYY2JOZ1ZobGVNazRJV25GOEQxNjk1QWVuVTFMd0hqT0pMa0NqeGdORmlXQUZFUEg5YUVYQU1QTEV4QT09IiwNCiAgIkF1dGhvcml6YXRpb24iOiAiQVdTNC1ITUFDLVNIQTI1NiBDcmVkZW50aWFsPVhYWFhYWFhYWFhYWFhYWFhYWFgvMjAyMDA0MDEvdXMtZWFzdC0xL2FwcHN5bmMvYXdzNF9yZXF1ZXN0LCBTaWduZWRIZWFkZXJzPWFjY2VwdDtjb250ZW50LWVuY29kaW5nO2NvbnRlbnQtdHlwZTtob3N0O3gtYW16LWRhdGU7eC1hbXotc2VjdXJpdHktdG9rZW4sIFNpZ25hdHVyZT04M0VYQU1QTEViY2MxZmUzZWU2OWY3NWNkNWViYmY0Y2I0ZjE1MGU0Zjk5Y2VjODY5ZjE0OWM1RVhBTVBMRWRjIg0KfQ"]
표준 HTTP 헤더를 통한 헤더
이 방법에서 호스트 및 기타 권한 부여 정보는 AWS AppSync 실시간 엔드포인트와 WebSocket 연결을 설정할 때 표준 HTTP 헤더를 사용하여 전송됩니다. 결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
요청 헤더에는 다음이 포함됩니다.
"sec-websocket-protocol" : ["graphql-ws"]
"accept": "application/json, text/javascript",
"content-encoding": "amz-1.0",
"content-type": "application/json; charset=UTF-8",
"host": "example1234567890000.appsync-api.us-east-1.amazonaws.com",
"x-amz-date": "20200401T001010Z",
"X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
"Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=83EXAMPLEbcc1fe3ee69f75cd5ebbf4cb4f150e4f99cec869f149c5EXAMPLEdc"
사용자 지정 도메인을 사용하여 요청에 서명하려면 다음을 따르세요.
{
url: "https://api.example.com/graphql/connect",
data: "{}",
method: "POST",
headers: {
"accept": "application/json, text/javascript",
"content-encoding": "amz-1.0",
"content-type": "application/json; charset=UTF-8",
}
}
예제
{
"accept": "application/json, text/javascript",
"content-encoding": "amz-1.0",
"content-type": "application/json; charset=UTF-8",
"host": "api.example.com",
"x-amz-date": "20200401T001010Z",
"X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
"Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=83EXAMPLEbcc1fe3ee69f75cd5ebbf4cb4f150e4f99cec869f149c5EXAMPLEdc"
}
쿼리 문자열이 있는 요청 URL
wss://api.example.com/graphql?header=eyEXAMPLEHQiOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFEXAMPLEQiLCJjb250ZW50LWVuY29kaW5nIjoEXAMPLEEuMCIsImNvbnRlbnQtdHlwZSI6ImFwcGxpY2F0aW9EXAMPLE47IGNoYXJzZXQ9VVRGLTgiLCJob3N0IjoiZXhhbXBsZEXAMPLENjc4OTAwMDAuYXBwc3luYy1hcGkudXMtZWFzdC0xLmFtYEXAMPLEcy5jb20iLCJ4LWFtei1kYXRlIjoiMjAyMDA0MDFUMDAxMDEwWiIsIlgtEXAMPLElY3VyaXR5LVRva2VuIjoiQWdvSmIzSnBaMmx1WDJWakVBb2FEbUZ3TFhOdmRYUm9aV0Z6ZEMweUlrY3dSUUlnQWg5N0NsanE3d09QTDhLc3hQM1l0RHV5Yy85aEFqOFBoSjdGdmYzOFNnb0NJUURoSllKYkpsbmpQc3Bpb096dGorK3BFYWdXQ3ZlWlVqS0VuMHp5VWhCbXhpck5CUWpqLy8vLy8vLy8vLzhCRUFBYUREY3hPRGsyTkRneU56ZzFOU0lNbzFtV25wRVNXVW9ZdzRCa0txRUZTcm0zRFh1TDh3K1piVmM0SktqRFA0dlVDS05SNkxlOUM5cFpwOVBzVzBOb0Z5M3ZMQlVkQVh3dDZQSld1T1ZHOGZlWGZpRUVBKzFraGdGSy93RXR3Uis5ekY3TmFNTU1zZTA3d04yZ0cydEgwZUtNVFhuOEF3QVFYK3NNYnl0UW84aWVwUDlQWk96bFpzU0ZiL2RQNVE4aGs2WWpHVGFMMWVZY0tac1RrREFxMnVLRlE4bVlVVkE5RXRRbk5SaUZMRVk4M2FLdkcvdHFMV05uR2xTTlZ4N1NNY2ZvdmtGRHFRYW1tKzg4eTFPd3dBRVlLN3Fjb2NlWDZaN0dHY2FZdUlmR3BhWDJNQ0NFTGVRdlorOFd4RWdPbklmejdHWXZzWU5qTFpTYVJuVjRHK0lMWTFGMFFOVzY0UzlOdmorQndEZzNodDJDck52cHdqVllsajlVM25teEUwVUc1bmU4M0xMNWhocU1wbTI1a21MN2VuVmd3MmtRem1VMmlkNElLdTBDL1dhb0RSdU8yRjV6RTYzdkpieE44QVlzNzMzOCs0QjRIQmI2Qlo2T1VnZzk2UTE1UkE0MS9nSXF4YVZQeHlUcERmVFU1R2ZTTHhvY2RZZW5pcXFwRk10WkcybjlkMHU3R3NRTmNGa05jRzNxRFptNHREbzh0WmJ1eW0wYTJWY0YyRTVoRkVnWEJhK1hMSkNmWGkvNzdPcUFFalAweDdRZGszQjQzcDhLRy9CYWlvUDVSc1Y4ekJHdkgxekFneVBoYTJyTjcwL3RUMTN5cm1QZDVRWUVmd3pleGpLclY0bVdJdVJnOE5USFlTWkpVYWV5Q3dUb204MFZGVUpYRytHWVRVeXY1VzIyYUJjbm9SR2lDaUtFWVRMT2tnWGVjZEtGVEhtY0lBZWpROVdlbHIwYTE5NktxODd3NUtOTUNrY0NHRm53Qk5GTG1mbmJwTnFUNnJVQnh4czNYNW50WDlkOEhWdFNZSU5Uc0dYWE1aQ0o3Zm5iV2FqaGcvYW94MEZ0SFgyMWVGNnFJR1Q4ajF6K2wyb3BVK2dnd1Vna2hVVWdDSDJUZnFCaitNTE1WVnZwZ3FKc1BLdDU4MmNhRktBcklGSXZPKzlRdXB4TG5FSDJoejA0VE1UZm5VNmJRQzZ6MWJ1VmU3aCt0T0xuaDFZUEZzTFE4OGFuaWIvN1RUQzhrOURzQlRxMEFTZThSMkdiU0VzbU85cWJiTXdnRWFZVWhPS3RHZXlRc1NKZGhTazZYeFhUaHJXTDlFbndCQ1hEa0lDTXFkbnRBeHl5TTluV3NaNGJMOUpIcUV4Z1dVbWZXQ2h6UEZBcW4zRjR5ODk2VXFIVFp4bHEzV0d5cG41SEhjZW0ySHFmM0lWeEtIMWluaHFkVnRrcnlFaVRXckk3WmRqYnFucVJibCtXZ3RQdEtPT3dlRGxDYVJzM1IycVhjYk5nVmhsZU1rNElXbkY4RDE2OTVBZW5VMUx3SGpPSkxrQ2p4Z05GaVdBRkVQSDlhTklhcXMvWnhBPT0iLCJBdXRob3JpemF0aW9uIjoiQVdTNC1ITUFDLVNIQTI1NiBDcmVkZW50aWFsPVhYWFhYWFhYWFhYWFhYWFhYWFgvMjAxOTEwMDIvdXMtZWFzdC0xEXAMPLE5bmMvYXdzNF9yZXF1ZXN0LCBTaWduZWRIZWFkZXJzPWFjY2VwdDtjb250ZWEXAMPLE29kaW5nO2NvbnRlbnQtdHlwZTtob3EXAMPLEW16LWRhdGU7eC1hbXotc2VjdXJpdHktdG9rZW4sIFNpZ25hdHVyZT04MzE4EXAMPLEiY2MxZmUzZWU2OWY3NWNkEXAMPLE0Y2I0ZjE1MGU0Zjk5Y2VjODY5ZjE0OWM1ZDAzNDEXAMPLEn0=&payload=e30=
참고
하나의 WebSocket 연결에는 여러 개의 구독이 있을 수 있습니다(각 구독이 서로 다른 인증 모드를 사용하더라도 상관없음). 이 연결을 구현하는 한 가지 방법은 첫 번째 구독에 대한 WebSocket 연결을 만든 후 마지막 구독이 등록 취소되면 이 연결을 닫는 것입니다. 마지막 구독이 등록 취소된 직후에 앱이 구독되는 경우 WebSocket 연결을 닫기 전에 몇 초 동안 대기하여 이 연결을 최적화할 수 있습니다. 모바일 앱 예제의 경우, 한 화면에서 다른 화면으로 변경할 때 탑재 해제 이벤트에서 구독을 중지하고 탑재 이벤트에서 다른 구독을 시작합니다.
Lambda 권한 부여
Lambda 권한 부여 헤더
헤더 콘텐츠
-
"Authorization": <string>
:authorizationToken
으로 전달되는 값입니다. -
"host": <string>
: AWS AppSync GraphQL 엔드포인트의 호스트 또는 사용자 지정 도메인 이름입니다.
예제
{
"Authorization":"M0UzQzM1MkQtMkI0Ni00OTZCLUI1NkQtMUM0MTQ0QjVBRTczCkI1REEzRTIxLTk5NzItNDJENi1BQjMwLTFCNjRFNzQ2NzlCNQo=",
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
}
쿼리 문자열을 통한 헤더
먼저 host
및를 포함하는 JSON 객체가 문자열로 변환Authorization
됩니다. 다음으로이 문자열은 base64 인코딩을 사용하여 인코딩됩니다. 결과 base64 인코딩 문자열은 AWS AppSync 실시간 엔드포인트와의 연결을 설정header
하기 위해 WebSocket URL에 라는 쿼리 파라미터로 추가됩니다. WebSocket 결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJBdXRob3JpemF0aW9uIjoiZXlKcmFXUWlPaUpqYkc1eGIzQTVlVzVNSzA5UVlYSXJNVEpIV0VGTFNYQmllVTVXTkhoc1FqaFBWVzlZTW5NMldsZHZQU0lzSW1Gc1p5STZJbEpUTWpVMkluMC5leUp6ZFdJaU9pSmhObU5tTWpjd055MHhOamd4TFRRMU5ESXRPV1l4T0MxbE5qWTBNVGcyTmpsa016WWlMQ0psZG1WdWRGOXBaQ0k2SW1Wa016TTVNbU5rTFdOallUTXROR00yT0MxaE5EWXlMVEpsWkdJM1pUTm1ZMkZqWmlJc0luUnZhMlZ1WDNWelpTSTZJbUZqWTJWemN5SXNJbk5qYjNCbElqb2lZWGR6TG1OdloyNXBkRzh1YzJsbmJtbHVMblZ6WlhJdVlXUnRhVzRpTENKaGRYUm9YM1JwYldVaU9qRTFOamswTlRjM01UZ3NJbWx6Y3lJNkltaDBkSEJ6T2x3dlhDOWpiMmR1YVhSdkxXbGtjQzVoY0MxemIzVjBhR1ZoYzNRdE1pNWhiV0Y2YjI1aGQzTXVZMjl0WEM5aGNDMXpiM1YwYUdWaGMzUXRNbDgzT0hZMFNWWmliVkFpTENKbGVIQWlPakUxTmprME5qRXpNakFzSW1saGRDSTZNVFUyT1RRMU56Y3lNQ3dpYW5ScElqb2lOVGd6WmpobVltTXRNemsyTVMwMFl6QTRMV0poWlRBdFl6UXlZMkl4TVRNNU5EWTVJaXdpWTJ4cFpXNTBYMmxrSWpvaU0zRmxhalZsTVhabU16ZDFOM1JvWld3MGRHOTFkREprTVd3aUxDSjFjMlZ5Ym1GdFpTSTZJbVZzYjNKNllXWmxJbjAuQjRjZEp0aDNLRk5wSjZpa1ZwN2U2RFJlZTk1VjZRaS16RUUyREpIN3NIT2wyenhZaTdmLVNtRUdvaDJBRDhlbXhRUllhakJ5ei1yRTRKaDBRT3ltTjJZcy1aSWtNcFZCVFBndS1UTVdEeU9IaERVbVVqMk9QODJ5ZVozd2xaQXRyX2dNNEx6alhVWG1JX0syeUdqdVhmWFRhYTFtdlFFQkcwbVFmVmQ3U2Z3WEItamN2NFJZVmk2ajI1cWdvdzlFdzUydWZ1clBxYUstM1dBS0czMktwVjhKNC1XZWpxOHQwYy15QTdzYjhFbkI1NTFiN1RVOTN1S1JpVlZLM0U1NU5rNUFEUG9hbV9XWUU0NWkzczVxVkFQXy1Jblc3NU5Vb09DR1RzUzhZV01mYjZlY0hZSi0xai1iekEyN3phVDlWamN0WG45YnlORlptS0xwQTJMY3h3IiwiaG9zdCI6ImV4YW1wbGUxMjM0NTY3ODkwMDAwLmFwcHN5bmMtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIn0=&payload=e30=
base64로 인코딩된 헤더 객체 외에도 빈 JSON 객체 {}도 base64로 인코딩되어 WebSocket URLpayload
에 이름이 지정된 별도의 쿼리 파라미터로 포함됩니다.
를 통한 헤더 Sec-WebSocket-Protocol
host
및를 포함하는 JSON 객체Authorization
는 문자열로 변환된 다음 base64Url 인코딩을 사용하여 인코딩됩니다. 결과 base64Url-encoded 문자열에는 접두사가 붙습니다header-
. 그런 다음 접두사가 붙은이 문자열은 AWS AppSync 실시간 엔드포인트와 WebSocket 연결을 설정할 때 Sec-WebSocket-Protocol
헤더graphql-ws
에 외에도 새 하위 프로토콜로 사용됩니다.
결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
Sec-WebSocket-Protocol
헤더에는 다음 값이 포함됩니다.
"sec-websocket-protocol" : ["graphql-ws", "header-ewogICAgImhvc3QiOiJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsCiAgICAieC1hcGkta2V5IjoiZGEyLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Igp9"]
표준 HTTP 헤더를 통한 헤더
이 방법에서 호스트 및 권한 부여 정보는 AWS AppSync 실시간 엔드포인트와 WebSocket 연결을 설정할 때 표준 HTTP 헤더를 사용하여 전송됩니다. 결과 요청 URL의 형식은 다음과 같습니다.
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
요청 헤더에는 다음이 포함됩니다.
"sec-websocket-protocol" : ["graphql-ws"]
"Authorization":"eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJHWEFLSXBieU5WNHhsQjEXAMPLEnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyEXAMPLEiJhNmNmMjcwNy0xNjgxLTQ1NDItOWYxOC1lNjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImVkMzM5MmNkLWNjYTMtNGM2OC1hNDYyLTJlZGI3ZTNmY2FjZiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk0NTc3MTgsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zb3V0aGVhc3QtMl83OHY0SVZibVAiLCJleHAiOjE1Njk0NjEzMjAsImlhdCI6MTU2OTQ1NzcyMCwianRpIjoiNTgzZjhmYmMtMzk2MS00YzA4LWJhZTAtYzQyY2IxMTM5NDY5IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1N3RoZWw0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3EXAMPLEn0.B4EXAMPLEFNpJ6ikVp7e6DRee95V6Qi-zEE2DJH7sHOl2zxYi7f-SmEGoh2AD8emxQRYajByz-rE4Jh0QOymN2Ys-ZIkMpVBTPgu-TMWDyOHhDUmUj2OP82yeZ3wlZAtr_gM4LzjXUXmI_K2yGjuXfXTaa1mvQEBG0mQfVd7SfwXB-jcv4RYVi6j25qgow9Ew52ufurPqaK-3WAKG32KpV8J4-Wejq8t0c-yA7sb8EnB551b7TU93uKRiVVK3E55Nk5ADPoam_WYE45i3s5qVAP_-InW75NUoOCGTsS8YWMfb6ecHYJ-1j-bzA27zaT9VjctXn9byNFZmEXAMPLExw",
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
실시간 WebSocket 작업
AWS AppSync를 사용하여 성공적인 WebSocket 핸드셰이크를 시작한 후 클라이언트는 후속 메시지를 전송하여 다양한 작업을 위해 AWS AppSync에 연결해야 합니다. 이러한 메시지에는 다음 데이터가 필요합니다.
-
type
: 작업의 유형입니다. -
id
: 구독의 고유 식별자입니다. UUID를 이러한 목적으로 사용하는 것이 좋습니다. -
payload
: 작업 유형에 따라 연결된 페이로드입니다.
type
필드만 필수 필드이며, id
및 payload
필드는 선택 사항입니다.
이벤트 순서
구독 요청을 성공적으로 시작, 설정, 등록 및 처리하려면 클라이언트는 다음 순서를 따라야 단계를 완료해야 합니다.
-
연결 초기화(
connection_init
) -
연결 승인(
connection_ack
) -
구독 등록(
start
) -
구독 승인(
start_ack
) -
구독 처리(
data
) -
구독 등록 취소(
stop
)
연결 초기화 메시지
(선택 사항) 핸드셰이크가 성공하면 클라이언트는 connection_init
메시지를 전송하여 AWS AppSync 실시간 엔드포인트와 통신을 시작할 수 있습니다. 메시지는 다음과 같이 JSON 객체를 문자열화하여 얻은 문자열입니다.
{ "type": "connection_init" }
연결 승인 메시지
connection_init
메시지를 전송한 후 클라이언트는 connection_ack
메시지를 대기해야 합니다. connection_ack
를 수신하기 전에 전송된 모든 메시지는 무시됩니다. 메시지는 다음과 같은 내용이어야 합니다.
{
"type": "connection_ack",
"payload": {
// Time in milliseconds waiting for ka message before the client should terminate the WebSocket connection
"connectionTimeoutMs": 300000
}
}
연결 유지 메시지
클라이언트는 연결 승인 메시지 외에도 연결 유지 메시지를 주기적으로 수신합니다. 클라이언트가 연결 제한 시간 내에 연결 유지 메시지를 수신하지 못하면 클라이언트는 연결을 종료해야 합니다. AWS AppSync는 연결을 자동으로 종료할 때까지(24시간 후) 이러한 메시지를 계속 전송하고 등록된 구독을 처리합니다. 연결 유지 메시지는 하트비트이며 클라이언트가 승인할 필요가 없습니다.
{ "type": "ka" }
구독 등록 메시지
클라이언트가 connection_ack
메시지를 수신한 후 클라이언트는 구독 등록 메시지를 AWS AppSync로 전송할 수 있습니다. 이 메시지 유형은 다음 필드가 포함된 문자열화된 JSON 객체입니다.
-
"id": <string>
: 구독의 ID입니다. 이 ID는 각 구독에 고유해야 합니다. 그렇지 않으면 서버에서 구독 ID가 중복됨을 나타내는 오류를 반환합니다. -
"type": "start"
: 상수<string>
파라미터입니다. -
"payload": <Object>
: 구독에 관련된 정보가 포함된 객체입니다.-
"data": <string>
: GraphQL 쿼리 및 변수를 포함하는 문자열화된 JSON 객체입니다.-
"query": <string>
: GraphQL 작업입니다. -
"variables": <Object>
: 쿼리에 대한 변수가 포함된 객체입니다.
-
-
"extensions": <Object>
: 권한 부여 객체가 포함된 객체입니다.
-
-
"authorization": <Object>
:권한 부여에 필요한 필드가 포함된 객체입니다.
구독 등록을 위한 권한 부여 개체
AWS AppSync API 권한 부여 모드를 기반으로 하는 헤더 파라미터 형식 섹션의 동일한 규칙이 권한 부여 객체에도 적용됩니다. 유일한 예외는 IAM입니다. 이 경우 SigV4 서명 정보가 약간 다릅니다. 자세한 내용은 IAM 예제를 참조하십시오.
Amazon Cognito 사용자 풀 사용 예:
{
"id": "ee849ef0-cf23-4cb8-9fcb-152ae4fd1e69",
"payload": {
"data": "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
"extensions": {
"authorization": {
"Authorization": "eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJEXAMPLEBieU5WNHhsQjhPVW9YMnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyJzdWIiOiJhNmNmMjcwNy0xNjgxLTQ1NDItEXAMPLENjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImU3YWVmMzEyLWUEXAMPLEY0Zi04YjlhLTRjMWY5M2Q5ZTQ2OCIsInRva2VuX3VzZSI6ImFjY2VzcyIsIEXAMPLEIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk2MTgzMzgsImlzcyI6Imh0dEXAMPLEXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zbEXAMPLEc3QtMl83OHY0SVZibVAiLCJleHAiOjE1NzAyNTQ3NTUsImlhdCI6MTU3MDI1MTE1NSwianRpIjoiMmIEXAMPLEktZTVkMi00ZDhkLWJiYjItNjA0YWI4MDEwOTg3IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1EXAMPLE0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3J6YWZlIn0.CT-qTCtrYeboUJ4luRSTPXaNewNeEXAMPLE14C6sfg05tO0fOMpiUwj9k19gtNCCMqoSsjtQoUweFnH4JYa5EXAMPLEVxOyQEQ4G7jQrt5Ks6STn53vuseR3zRW9snWgwz7t3ZmQU-RWvW7yQU3sNQRLEXAMPLEcd0yufBiCYs3dfQxTTdvR1B6Wz6CD78lfNeKqfzzUn2beMoup2h6EXAMPLE4ow8cUPUPvG0DzRtHNMbWskjPanu7OuoZ8iFO_Eot9kTtAlVKYoNbWkZhkD8dxutyoU4RSH5JoLAnrGF5c8iKgv0B2dfEXAMPLEIihxaZVJ9w9w48S4EXAMPLEcA",
"host": "example1234567890000.appsync-api.us-east-1.amazonaws.com"
}
}
},
"type": "start"
}
IAM 사용 예:
{
"id": "eEXAMPLE-cf23-1234-5678-152EXAMPLE69",
"payload": {
"data": "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
"extensions": {
"authorization": {
"accept": "application/json, text/javascript",
"content-type": "application/json; charset=UTF-8",
"X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
"Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=b90131a61a7c4318e1c35ead5dbfdeb46339a7585bbdbeceeaff51f4022eb1fd",
"content-encoding": "amz-1.0",
"host": "example1234567890000.appsync-api.us-east-1.amazonaws.com",
"x-amz-date": "20200401T001010Z"
}
}
},
"type": "start"
}
사용자 지정 도메인 이름을 사용하는 예:
{
"id": "key-cf23-4cb8-9fcb-152ae4fd1e69",
"payload": {
"data": "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
"extensions": {
"authorization": {
"x-api-key": "da2-12345678901234567890123456",
"host": "api.example.com"
}
}
},
"type": "start"
}
SigV4 서명은 URL에 /connect
를 추가할 필요가 없으며 JSON 문자열화된 GraphQL 작업은 data
를 대체합니다. 다음은 SigV4 서명 요청의 예입니다.
{
url: "https://example1234567890000.appsync-api.us-east-1.amazonaws.com/graphql",
data: "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
method: "POST",
headers: {
"accept": "application/json, text/javascript",
"content-encoding": "amz-1.0",
"content-type": "application/json; charset=UTF-8",
}
}
구독 승인 메시지
구독 시작 메시지를 전송한 후 클라이언트는 AWS AppSync가 start_ack
메시지를 전송할 때까지 기다려야 합니다. start_ack
메시지는 구독이 성공했음을 나타냅니다.
구독 승인 예:
{
"type": "start_ack",
"id": "eEXAMPLE-cf23-1234-5678-152EXAMPLE69"
}
오류 메시지
연결 시작 또는 구독 등록에 실패하거나 서버에서 구독이 종료되는 경우 서버는 클라이언트에 오류 메시지를 보냅니다. 연결 시작 시간 중에 오류가 발생하면 서버에서 연결이 종료됩니다.
-
"type": "error"
: 상수<string>
파라미터입니다. -
"id": <string>
: 관련된 경우 해당 등록 구독의 ID입니다. -
"payload" <Object>
: 해당 오류 정보가 포함된 객체입니다.
예시
{
"type": "error",
"payload": {
"errors": [
{
"errorType": "LimitExceededError",
"message": "Rate limit exceeded"
}
]
}
}
데이터 메시지 처리
클라이언트가 변형을 제출하면 AWS AppSync는 해당 변형에 관심이 있는 모든 구독자를 식별하고 "start"
구독 작업id
의 해당 구독을 사용하여 각 구독자에게 "type":"data"
메시지를 보냅니다. 클라이언트는 데이터 메시지를 수신할 때 클라이언트가 해당 구독과 일치시킬 수 있도록 전송하는 구독 id
를 추적해야 합니다.
-
"type": "data"
: 상수<string>
파라미터입니다. -
"id": <string>
: 해당 등록 구독의 ID입니다. -
"payload" <Object>
: 구독 정보가 포함된 객체입니다.
예시
{
"type": "data",
"id": "ee849ef0-cf23-4cb8-9fcb-152ae4fd1e69",
"payload": {
"data": {
"onCreateMessage": {
"__typename": "Message",
"message": "test"
}
}
}
}
구독 등록 취소 메시지
앱이 구독 이벤트 수신 대기를 중지하려는 경우 클라이언트는 다음과 같은 문자열화된 JSON 객체가 있는 메시지를 전송해야 합니다.
-
"type": "stop"
: 상수<string>
파라미터입니다. -
"id": <string>
: 등록 취소할 구독의 ID입니다.
예시
{
"type":"stop",
"id":"ee849ef0-cf23-4cb8-9fcb-152ae4fd1e69"
}
AWS AppSync는 다음과 같은 문자열화된 JSON 객체와 함께 확인 메시지를 다시 보냅니다.
-
"type": "complete"
: 상수<string>
파라미터입니다. -
"id": <string>
: 등록되지 않은 구독의 ID입니다.
클라이언트는 확인 메시지를 받은 후 이 특정 구독에 대한 메시지를 더 이상 받지 않습니다.
예시
{
"type":"complete",
"id":"eEXAMPLE-cf23-1234-5678-152EXAMPLE69"
}
WebSocket 연결 해제
연결을 해제하기 전에 클라이언트는 데이터 손실을 방지하기 위해 WebSocket 연결을 통해 현재 진행 중인 작업이 없는지 확인하는 데 필요한 논리를 갖춰야 합니다. WebSocket에서 연결 해제하기 전에 모든 구독을 등록 취소해야 합니다.