Application Gateway의 WebSocket 지원 개요

Application Gateway는 모든 게이트웨이 크기에 WebSocket에 대한 네이티브 지원을 제공합니다. WebSocket 지원을 선택적으로 사용하거나 사용하지 않도록 설정하는 사용자 구성 가능 설정은 없습니다.

RFC6455에서 표준화된 WebSocket 프로토콜을 사용하면 장기 실행 TCP 연결을 통해 서버와 클라이언트 간의 전이중 통신을 수행할 수 있습니다. 이 기능을 사용하면 웹 서버와 클라이언트 간의 대화형 통신이 가능하며, HTTP 기반 구현에서 필요에 따라 폴링하지 않고도 양방향 통신을 수행할 수 있습니다. WebSocket은 HTTP와 달리 오버헤드가 낮고 여러 요청/응답에 동일한 TCP 연결을 다시 사용하므로 리소스를 더 효율적으로 활용할 수 있습니다. WebSocket 프로토콜은 기존의 HTTP 포트 80 및 443을 통해 작동하도록 디자인되었습니다. Application Gateway는 인스턴스당 최대 30,000개의 동시 WS 연결과 13,500개의 WSS 연결을 지원합니다.

80 또는 443 포트에서 표준 HTTP 수신기를 계속 사용하여 WebSocket 트래픽을 받을 수 있습니다. WebSocket 트래픽은 Application Gateway 규칙에 지정된 대로 적절한 백 엔드 풀을 사용하여 WebSocket 활성화된 백 엔드 서버로 지정됩니다. 백 엔드 서버는 상태 프로브 개요 섹션에서 설명한 대로 애플리케이션 게이트웨이 프로브에 응답해야 합니다. 애플리케이션 게이트웨이 상태 프로브는 HTTP/HTTPS 전용입니다. 각 백 엔드 서버는 WebSocket 트래픽을 서버로 라우팅하기 위해 애플리케이션 게이트웨이에 대한 HTTP 프로브에 응답해야 합니다.

채팅, 대시보드, 게임 앱 등 빠르고 실시간의 커뮤니케이션이 필요한 앱에서 사용됩니다.

WebSocket 작동 방식

WebSocket 연결을 설정하기 위해 특정 HTTP 기반 핸드셰이크가 클라이언트와 서버 간에 교환됩니다. 성공하면 애플리케이션 계층 프로토콜은 이전에 설정된 TCP 연결을 사용하여 HTTP에서 WebSocket으로 "업그레이드"됩니다. 이런 일이 발생하면 HTTP는 완전히 사라집니다. WebSocket 연결이 닫힐 때까지 두 엔드포인트 모두에서 WebSocket 프로토콜을 사용하여 데이터를 보내거나 받을 수 있습니다.

다이어그램은 클라이언트와 웹 서버의 상호 작용(두 번 연결하여 두 번 응답을 받음)과 WebSocket 상호 작용(서버에 한 번 연결하여 여러 번 응답을 받음)을 비교합니다.

참고

연결이 WebSocket으로 업그레이드된 후 중간/종료 프록시로 Application Gateway는 검사 또는 조작 기능 없이 프런트 엔드에서 받은 데이터를 백 엔드로 보내고 그 반대의 경우도 마찬가지입니다. 따라서 WAF(Web Application Firewall)는 콘텐츠를 구문 분석할 수 없으며 이러한 데이터에 대한 검사를 수행하지 않습니다. 마찬가지로, WebSocket 연결을 설정한 후에는 헤더 다시 쓰기, URL 다시 쓰기 또는 백 엔드 설정에서 호스트 이름 재정의와 같은 조작이 적용되지 않습니다.

수신기 구성 요소

기존 HTTP 수신기를 사용하여 WebSocket을 지원할 수 있습니다. 다음 코드 조각은 샘플 템플릿 파일의 요소를 보여줍니다 httpListeners . WebSocket 및 보안 WebSocket 트래픽을 지원하려면 HTTP 및 HTTPS 수신기가 모두 필요합니다. 마찬가지로 포털 또는 Azure PowerShell 사용하여 WebSocket 트래픽을 지원하기 위해 포트 80 및 443에서 수신기가 있는 애플리케이션 게이트웨이를 만들 수 있습니다.

"httpListeners": [
        {
            "name": "appGatewayHttpsListener",
            "properties": {
                "FrontendIPConfiguration": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendIPConfigurations/DefaultFrontendPublicIP"
                },
                "FrontendPort": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendPorts/appGatewayFrontendPort443'"
                },
                "Protocol": "Https",
                "SslCertificate": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/sslCertificates/appGatewaySslCert1'"
                },
            }
        },
        {
            "name": "appGatewayHttpListener",
            "properties": {
                "FrontendIPConfiguration": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendIPConfigurations/appGatewayFrontendIP'"
                },
                "FrontendPort": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendPorts/appGatewayFrontendPort80'"
                },
                "Protocol": "Http",
            }
        }
    ],

BackendAddressPool, BackendHttpSetting 및 라우팅 규칙 구성

BackendAddressPool을 사용하여 WebSocket 사용 서버를 사용하여 백 엔드 풀을 정의합니다. 백 엔드 포트 80 및 443을 사용하여 backendHttpSetting을 정의합니다. HTTP 설정의 요청 시간 제한 값은 WebSocket 세션에도 적용됩니다. 적절한 수신기를 해당 백 엔드 주소 풀에 연결하는 라우팅 규칙을 변경할 필요가 없습니다.

"requestRoutingRules": [{
    "name": "<ruleName1>",
    "properties": {
        "RuleType": "Basic",
        "httpListener": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/httpListeners/appGatewayHttpsListener')]"
        },
        "backendAddressPool": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/ContosoServerPool')]"
        },
        "backendHttpSettings": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]"
        }
    }

}, {
    "name": "<ruleName2>",
    "properties": {
        "RuleType": "Basic",
        "httpListener": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/httpListeners/appGatewayHttpListener')]"
        },
        "backendAddressPool": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/ContosoServerPool')]"
        },
        "backendHttpSettings": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]"
        }

    }
}]

참고

클라이언트에서 ping을 보내기 전에 시간 제한 오류가 발생하지 않도록 시간 제한 값이 서버 정의 ping/pong 간격보다 큰지 확인합니다. WebSocket의 일반적인 값은 20초이므로 예를 들어 시간 제한 값이 40초이면 클라이언트가 ping을 보내기 전에 게이트웨이가 시간 제한 오류를 보내지 않습니다. 그렇지 않으면 이 조건은 클라이언트 측에서 1006 오류를 발생시킵니다.

WebSocket 사용 백 엔드

WebSocket이 작동하려면 백 엔드에 구성된 포트(일반적으로 80 또는 443)에서 실행되는 HTTP/HTTPS 웹 서버가 있어야 합니다. 이러한 요구 사항이 있는 이유는 WebSocket 프로토콜에서 초기 핸드셰이크가 HTTP여야 하며, 헤더 필드를 통해 WebSocket 프로토콜로 업그레이드해야 하기 때문입니다. 다음 예제에서는 헤더를 보여줍니다.

    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Origin: https://example.com
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13

이 요구 사항의 또 다른 이유는 Application Gateway 백 엔드 상태 프로브가 HTTP 및 HTTPS 프로토콜만 지원하기 때문입니다. 백 엔드 서버가 HTTP 또는 HTTPS 프로브에 응답하지 않는 경우 게이트웨이는 백 엔드 풀에서 제거합니다.

다음 단계

WebSocket 지원에 대해 학습한 후 WebSocket 지원 웹 애플리케이션을 시작하는 애플리케이션 게이트웨이를 만듭니 다.