WebSocket 하위 프로토콜이 필요한 $connect 라우팅 설정 - Amazon API Gateway

WebSocket 하위 프로토콜이 필요한 $connect 라우팅 설정

클라이언트는 WebSocket API에 연결하는 동안 WebSocket 서브프로토콜을 요청하기 위해 Sec-WebSocket-Protocol 필드를 사용할 수 있습니다. 클라이언트가 API가 지원하는 서브프로토콜을 요청하는 경우에만 연결을 허용하도록 $connect 라우팅에 대한 통합을 설정할 수 있습니다.

다음 예제 Lambda 함수는 Sec-WebSocket-Protocol 헤더를 클라이언트에 반환합니다. 이 함수는 클라이언트가 myprotocol 서브프로토콜을 지정하는 경우에만 API에 대한 연결을 설정합니다.

이 예제 API 및 Lambda 프록시 통합을 생성하는 AWS CloudFormation 템플릿에 대해서는 ws-subprotocol.yaml 단원을 참조하세요.

export const handler = async (event) => { if (event.headers != undefined) { const headers = toLowerCaseProperties(event.headers); if (headers['sec-websocket-protocol'] != undefined) { const subprotocolHeader = headers['sec-websocket-protocol']; const subprotocols = subprotocolHeader.split(','); if (subprotocols.indexOf('myprotocol') >= 0) { const response = { statusCode: 200, headers: { "Sec-WebSocket-Protocol" : "myprotocol" } }; return response; } } } const response = { statusCode: 400 }; return response; }; function toLowerCaseProperties(obj) { var wrapper = {}; for (var key in obj) { wrapper[key.toLowerCase()] = obj[key]; } return wrapper; }

wscat를 사용하면 클라이언트가 API가 지원하는 서브프로토콜을 요청하는 경우에만 API가 연결을 허용하는지 테스트할 수 있습니다. 다음 명령은 -s 플래그를 사용하여 연결 중에 서브프로토콜을 지정합니다.

다음 명령은 지원되지 않는 서브프로토콜을 사용하여 연결을 시도합니다. 클라이언트가 chat1 서브프로토콜을 지정했기 때문에 Lambda 통합에서 400 오류를 반환하고 연결이 실패합니다.

wscat -c wss://api-id.execute-api.region.amazonaws.com/beta -s chat1 error: Unexpected server response: 400

다음 명령은 연결 요청에 지원되는 서브프로토콜을 포함합니다. Lambda 통합은 연결을 허용합니다.

wscat -c wss://api-id.execute-api.region.amazonaws.com/beta -s chat1,myprotocol connected (press CTRL+C to quit)

WebSocket API 호출에 대한 자세한 내용은 WebSocket API 간접 호출 단원을 참조하세요.