HTTPQUERY
한국어

101 Switching Protocols

사용법

Upgrade 요청 헤더를 포함하는 클라이언트는 남은 HTTP 세션 동안 서버가 다른 프로토콜을 사용하기를 원합니다. 여러 프로토콜은 한 줄에 쉼표로 구분하여 선호도가 높은 순서대로 나열합니다. 프로토콜 버전은 선택 사항입니다.

Connection: upgrade
Upgrade: protocol-name[/protocol-version]

이러한 요청은 더 최신 프로토콜 버전이 제공하는 기능을 활용하는 등 그렇게 할 이점이 있을 때 이루어집니다. 이 업그레이드는 HTTP/1.1에서만 지원되며, 클라이언트가 서버에 프로토콜 변경을 강제할 방법은 없습니다. 업그레이드는 선택 사항이며, Upgrade 헤더가 무시되면 서버는 200을 반환합니다.

서버 측 요구

서버 역시 클라이언트에게 프로토콜 업그레이드를 강제할 수 없지만, 클라이언트가 요구 사항을 충족하지 못하면 요청을 거부합니다. 클라이언트가 서버에서 지원하지 않는 프로토콜로 요청을 보내면 서버는 426을 반환합니다. 서버가 지시한 프로토콜을 사용하면 클라이언트의 이후 요청이 수락되고 처리됩니다.

예시

클라이언트가 HTTP/1.1에서 WebSocket 프로토콜로의 업그레이드를 요청합니다. 서버는 이를 수락하고 프로토콜을 전환합니다.

요청

GET /chat HTTP/1.1
Host: example.com
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

응답

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

WebSocket과 프로토콜 계층

WebSocket 연결은 HTTP 요청으로 시작하여 101 핸드셰이크를 거쳐 업그레이드됩니다. 업그레이드가 완료되면 연결은 애플리케이션 계층(7계층)에서 지속적인 전이중 TCP 채널로 동작합니다. HTTP 프레이밍은 WebSocket 프레임 형식으로 대체됩니다. 서버에서 클라이언트로의 스트리밍을 프로토콜 업그레이드 없이 구현하려면 Server-Sent Events(SSE)가 대안입니다.

코드 참고

.NET

HttpStatusCode.SwitchingProtocols

Rust

http::StatusCode::SWITCHING_PROTOCOLS

Rails

:switching_protocols

Go

http.StatusSwitchingProtocols

Symfony

Response::HTTP_SWITCHING_PROTOCOLS

Python3.5+

http.HTTPStatus.SWITCHING_PROTOCOLS

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_SWITCHING_PROTOCOLS

Angular

@angular/common/http/HttpStatusCode.SwitchingProtocols