프로토콜 업그레이드 메커니즘
HTTP/1.1 프로토콜은 Upgrade 헤더 필드를 사용하여 이미 설정된 연결을 다른 프로토콜로 업그레이드하는 데 사용할 수 있는 특수 메커니즘을 제공한다.
이 메커니즘은 선택사항이며, 프로토콜 변경을 강요하는 데 사용할 수 없다.
구현체는 새로운 프로토콜을 지원하더라도 업그레이드를 선택하지 않을 수 있으며, 실제로 이 메커니즘은 주로 WebSocket 연결을 시작할 때 사용한다.
또한 HTTP/2에서는 이 메커니즘의 사용을 명시적으로 허용하지 않는다는 점에 유의해야 한다.
이 메커니즘은 HTTP/1.1에만 해당된다.
HTTP/1.1 연결 업그레이드 Upgrading HTTP/1.1 Connections
Upgrade 헤더 필드는 클라이언트가 서버를 선호도에 따라 내림차순으로 나열된 프로토콜 중 하나로 전환하도록 요청하기 위해 사용된다.
Upgrade는 hop-by-hop 헤더이므로 Connection 헤더 필드에도 나열되어야 한다.
즉, Upgrade를 포함하는 일반적인 요청은 다음과 같다.
GET /index.html HTTP/1.1
Host: www.example.com
Connection: upgrade
Upgrade: example/1, foo/2
요청된 프로토콜에 따라 다른 헤더가 필요할 수 있다.
예를 들어, WebSocket 업그레이드를 통해 WebSocket 연결에 대한 세부 정보를 구성하기 위한 추가 헤더를 사용할 수 있고, 연결을 열 때 일정 수준의 보안을 제공할 수도 있다.
자세한 내용은 WebSocket 연결로 업그레이드를 참조한다.
서버가 연결을 업그레이드하기로 결정하면, 전환되는 프로토콜을 지정하는 업그레이드 헤더와 함께 101 Switching Protocols 응답 상태를 보낸다.
연결을 업그레이드하지 않거나 업그레이드할 수 없는 경우, 업그레이드 헤더를 무시하고 일반 응답(예 : 200 OK)을 보낸다.
101 상태 코드를 보낸 직후, 서버는 새로운 프로토콜을 사용할 수 있으며, 필요에 따라 추가적인 프로토콜별 핸드셰이크를 수행할 수 있다.
업그레이드된 응답이 완료되는 즉시 연결이 양방향 파이프가 되고, 업그레이드를 시작한 요청(프로토콜이 바뀌기 전, 맨 처음 요청)은 새로운 프로토콜을 통해 완료될 수 있다.
업그레이드 한 후, 프로토콜이 바뀌기 전의 요청을 처리하고 보낸 응답과 업그레이드하기 전에 처리된 요청의 응답은 서로 다른 공간에 있으며 서로 간섭하지 않는다.
이 메커니즘의 일반적인 사용 사례 Common uses for this mechanism
여기에서 Upgrade 헤더의 가장 일반적인 사용 사례를 살펴볼 수 있다.
WebSocket 연결로 업그레이드하기 Upgrading to a WebSocket Connection
지금까지 HTTP 연결을 업그레이드하는 가장 일반적인 사용 사례는 WebSocket을 사용하는 것인데, 이 WebSocket은 항상 HTTP 또는 HTTPS 연결을 업그레이드하여 구현된다.
WebSocket API나 WebSocket을 처리하는 라이브러리를 사용하여 새로운 연결을 여는 경우, 대부분 또는 모든 작업이 자동으로 처리된다는 점을 명심해야 한다.
예를 들어, WebSocket 연결을 여는 것은 다음과 같이 간단하다.
webSocket = new WebSocket("ws://destination.server.ext", "optionalProtocol");
WebSocket() 생성자는 초기 HTTP/1.1 연결을 만드는 모든 작업을 수행하고, 그다음 핸드셰이킹과 업그레이드 프로세스를 처리한다.
참고 : "wss://" URL 체계를 사용하여 보안 WebSocket 연결을 열 수도 있다.
WebSocket 연결을 처음부터 만들어야 하는 경우, 핸드셰이킹 과정을 직접 처리해야 한다.
초기 HTTP/1.1 세션을 생성한 후, 다음과 같이 표준 요청에 Upgrade 및 Connection 헤더를 추가하여 업그레이드를 요청해야 한다.
Connection: Upgrade
Upgrade: websocket
WebSocket 전용 헤더 WebSocket-specific headers
다음 헤더들은 WebSocket 업그레이드 프로세스와 관련이 있다.
Upgrade 및 Connection 헤더를 제외한 나머지는 일반적으로 선택 사항이거나 브라우저와 서버가 서로 통신할 때 처리된다.
1. Sec-WebSocket-Extensions
서버에 사용할 프로토콜 수준 WebSocket 확장을 하나 이상 지정한다.
요청에서 두 개 이상의 Sec-WebSocket-Extension 헤더를 사용하는 것이 허용된다.
결과는 나열된 모든 확장자를 하나의 헤더에 포함한 것과 같다.
Sec-WebSocket-Extensions: extensions
extensions : 요청하거나 지원에 동의할 확장 프로그램을 쉼표로 구분한 목록이다.
이 목록은 IANA WebSocket Extension Name Registry에서 선택해야 한다.
매개변수를 사용하는 확장은 세미콜론으로 구분하여 매개변수를 지정한다.
아래는 예시이다.
Sec-WebSocket-Extensions: superspeed, colormode; depth=16
2. Sec-WebSocket-Key
클라이언트가 WebSocket으로 업그레이드를 요청할 자격이 있는지 확인하기 위해 필요한 정보를 서버에 제공한다.
이 헤더는 안전하지 않은 클라이언트가 업그레이드를 원할 때 사용되어 남용으로부터 일정 수준의 보호를 제공할 수 있다.
키 값은 WebSocket 사양에 정의된 알고리즘을 사용하여 계산되므로 보안을 제공하지 않는다.
대신, WebSocket이 아닌 클라이언트가 실수로 또는 잘못된 사용으로 WebSocket 연결을 요청하는 것을 방지하는 데 도움이 된다.
따라서 본질적으로 이 키는 "정말로 WebSocket 연결을 열려고 한다."라는 것을 확인한다.
이 헤더는 클라이언트가 사용하기로 선택하면 자동으로 추가된다.
fetch() 또는 XMLHttpRequest.setRequestHeader() 메서드를 사용하여 추가할 수 없다.
Sec-WebSocket-key:key
key : 업그레이드 요청에 대한 키다.
클라이언트가 원하면 이것을 추가하고, 서버는 응답에 자체 키를 포함시킨다.
클라이언트는 서버가 보낸 업그레이드 응답을 애플리케이션에 전달하기 전에 이를 검증한다.
서버가 보낸 업그레이드 응답 전달 순서 : 서버 > 클라이언트 > 애플리케이션
서버 응답의 Sec-WebSocket-Accept 헤더에는 지정된 키를 기반으로 계산된 값이 있다.
3. Sec-WebSocket-Protocol
Sec-WebSocket-Protocol 헤더는 사용자가 사용하고자 하는 하나 이상의 WebSocket 프로토콜을 지정하며, 우선 순위에 따라 나열된다.
서버가 지원하는 첫 번째 프로토콜이 선택되어 서버의 응답에 포함된 Sec-WebSocket-Protocol 헤더에 반환된다.
이 헤더는 여러 번 사용할 수 있으며, 이는 하나의 헤더에 subprotocol 식별자를 쉼표로 구분하여 나열한 것과 동일한 결과를 가져온다.
Sec-WebSocket-Protocol: subprotocols
subprotocols : 쉼표로 구분된 하위 프로토콜(subprotocols) 이름의 목록으로, 선호하는 순서대로 나열한다.
하위 프로토콜은 IANA WebSocket Subprotocol 이름 레지스트리에서 선택하거나 클라이언트와 서버가 공동으로 이해하는 사용자 지정 이름일 수 있다.
4. Sec-WebSocket-Version
- REQUEST HEADER
클라이언트가 사용하려는 WebSocket 프로토콜 버전을 지정하여, 서버에서 해당 버전이 지원되는지 여부를 확인할 수 있다.
Sec-WebSocket-Version: version
version : 클라이언트가 서버와 통신할 때 사용하고자 하는 WebSocket 프로토콜 버전이다.
이 번호는 IANA WebSocket Version Number Registry에 나열된 가장 최신 버전이어야 한다.
WebSocket 프로토콜의 최신 최종 버전은 버전 13이다.
- RESPONSE HEADER
서버가 지정된 버전의 WebSocket 프로토콜을 사용하여 통신할 수 없는 경우, 헤더에 Sec-WebSocket-Version 헤더와 함께 지원되는 프로토콜의 버전을 쉼표로 구분한 목록을 포함하는 오류(예 : 426 Upgrade Required)로 응답한다.
서버가 요청된 프로토콜 버전을 지원하는 경우, 응답에 Sec-WebSocket-Version 헤더가 포함되지 않는다.
Sec-WebSocket-Version: supportedVersions
supportedVersions : 서버에서 지원하는 WebSocket 프로토콜 버전을 쉼표로 구분하여 나열한 목록이다.
응답 전용 헤더 Response-only header
서버의 응답에는 다음이 포함될 수 있다.
1. Sec-WebSocket-Accept
서버가 WebSocket 연결을 시작하려고 할 때, 초기 핸드셰이크 과정에서 서버의 응답 메시지에 포함된다.
응답 헤더에 한 번만 나타난다.
Sec-WebSocket-Accept: hash
hash : Sec-WebSocket-key 헤더가 제공된 경우, 이 헤더의 값은 해당 키 값에 문자열 "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"을 연결한 후, 그 연결된 문자열의 SHA-1 해시(알고리즘)를 계산하여 20바이트 값을 생성한다.
그런 다음, 이 값을 base64로 인코딩하여 이 속성의 값을 얻는다.
Protocol upgrade mechanism - HTTP | MDN
The HTTP/1.1 protocol provides a special mechanism that can be used to upgrade an already established connection to a different protocol, using the Upgrade header field.
developer.mozilla.org
'프론트엔드 > HTTP - 전' 카테고리의 다른 글
Content Security Policy (CSP) (0) | 2024.09.27 |
---|---|
Connection management in HTTP/1.x (0) | 2024.08.24 |
Evolution of HTTP (0) | 2024.07.15 |
Basics of HTTP (0) | 2024.07.15 |
Choosing Between www and non-www URLs (0) | 2024.06.23 |