RFC6455에 명시된 WebSocket은 클라이언트와 서버 간의 양방향 통신을 가능하게 합니다. 기존의 HTTP 또는 HTTPS 요청과 달리 WebSocket을 사용하면 브라우저가 원격 서버를 계속 끌어오거나 양방향(클라이언트 대 서버 및 서버 대 클라이언트)으로 여러 연결을 설정할 필요 없이 연결을 설정하고 서버로부터 지속적인 데이터를 수신할 수 있습니다.
WebSocket의 이점
WebSocket 프로토콜은 기존 HTTP 요청에 비해 다음과 같은 여러 가지 이점을 제공합니다.
- 브라우저 호환성: 거의 모든 최신 웹 브라우저가 WebSocket을 지원합니다.
- 실시간 데이터: WebSocket을 사용하면 클라이언트와 서버 간에 실시간 데이터 전송이 가능합니다.
- 효율성: WebSocket을 사용하면 업데이트를 확인하기 위해 서버를 지속적으로 폴링할 필요가 없습니다.
- 보안: WebSocket은 TLS를 사용하여 암호화될 수 있으며 80, 443과 같은 표준 HTTP 포트를 사용할 수 있습니다.
- 유연성: WebSocket은 채팅, 게임, 재무 거래 플랫폼을 포함한 다양한 애플리케이션에 사용될 수 있습니다.
WebSocket 프로토콜의 작동 방식
WebSocket 연결을 설정하기 위해 특정 HTTP 기반 핸드셰이크가 클라이언트와 서버 간에 교환됩니다. 성공하면 애플리케이션 계층 프로토콜은 이전에 설정된 TCP 연결을 사용하여 HTTP에서 WebSocket으로 "업그레이드"됩니다. 이런 일이 발생하면 프로토콜은 WebSocket으로 변경되고 트래픽은 더 이상 HTTP를 통해 흐르지 않습니다. 데이터는 WebSocket 연결이 닫힐 때까지 두 엔드포인트 모두에서 WebSocket 프로토콜을 사용하여 보내거나 받습니다.
참고
연결이 WebSocket으로 업그레이드되면 중개/종료 프록시로서 컨테이너용 Application Gateway는 어떠한 검사나 조작 기능 없이 프런트 엔드에서 수신한 데이터를 백 엔드로 전송하고 그 반대의 작업도 수행합니다. 따라서 헤더 다시 쓰기, URL 다시 쓰기, 호스트 이름 재정의와 같은 모든 조작은 WebSocket 연결이 설정된 후에는 적용되지 않습니다.
WebSocket 연결은 일반 텍스트 형식이거나 TLS를 통해 암호화될 수 있습니다. 일반 텍스트를 통해 연결이 설정되면 연결은 ws://<fqdn>/path 형식으로 설정됩니다. TLS를 통해 연결이 설정되면 연결은 wss://<fqdn>/path 형식으로 설정됩니다.
상태 프로브
컨테이너용 Application Gateway에서 WebSocket 요청을 활용하는 데는 아무런 구성이 필요하지 않지만 백 엔드가 정상으로 반영되도록 하려면 상태 프로브를 올바르게 구성해야 합니다.
기본적으로 컨테이너용 Application Gateway는 WebSocket 서비스를 실행하는 백 엔드 포트로 HTTP 핸드셰이크를 시작하려고 시도합니다. 많은 경우, 이는 백 엔드를 잘못 비정상으로 표시하므로 HealthCheckPolicy를 정의하여 상태 프로브가 TCP 프로브 사용을 고려하도록 해야 합니다.
다음은 WebSocket 백 엔드에 대한 HealthCheckPolicy의 예입니다.
kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: HealthCheckPolicy
metadata:
name: websockets-health-check-policy
namespace: test-infra
spec:
targetRef:
group: ""
kind: Service
name: websockets-backend
namespace: test-infra
default:
interval: 5s
timeout: 3s
healthyThreshold: 1
unhealthyThreshold: 1
http:
path: /health
EOF
참고
WebSocket은 컨테이너용 Application Gateway에 게이트웨이 API를 사용할 때만 지원됩니다.
메트릭 및 모니터링
진단 로그:
WebSocket 연결은 고유한 프로토콜을 사용하여 작동합니다. 연결을 시작하면 브라우저는 HTTP 101 상태 코드를 수신하는데, 이는 HTTP에서 WebSocket으로 전환되었음을 나타내며 액세스 로그에 반영됩니다.
WebSocket 연결의 세부 정보는 연결이 닫힐 때만 기록됩니다. 이를 통해 각 연결의 지속 시간을 정확하게 측정할 수 있습니다.
다음 단계
WebSocket 및 게이트웨이 API에 대해 자세히 알아봅니다.