Upgrade
사용법
Upgrade 헤더는 기존 HTTP/1.1 커넥션에서 프로토콜 협상을 가능하게 합니다. 클라이언트가 다른 프로토콜로의 전환을 제안하기 위해 이 헤더를 보내면, 서버는 101 Switching Protocols로 응답하여 수락하거나 요청을 무시하고 현재 프로토콜을 유지합니다.
흔한 업그레이드 대상으로는 WebSocket(websocket), TLS(TLS/1.2, TLS/1.3), 평문 HTTP/2(h2c)가 있습니다. WebSocket 업그레이드는 현대적인 배포 환경에서 가장 널리 쓰이는 형태로, 브라우저와 서버 사이의 전이중 통신을 가능하게 합니다.
Upgrade와 함께 Connection 헤더가 필요합니다. 송신 측은 Connection: upgrade를 설정하여 중간 노드가 커넥션을 직접 소비하지 말고 업그레이드 요청을 전달하도록 알립니다.
서버는 426 Upgrade Required 응답의 일부로도 Upgrade를 보냅니다. 이는 서버가 현재 프로토콜로는 요청 처리를 거부한다는 사실을 클라이언트에 알리고, 필요한 프로토콜을 Upgrade 값에 나열합니다.
참고
Upgrade 헤더는 HTTP/1.1에만 적용됩니다. HTTP/2와 HTTP/3은 프로토콜 선택을 위해 TLS 핸드셰이크 중에 ALPN(Application-Layer Protocol Negotiation)을 사용합니다.
websocket
전이중 통신을 위해 커넥션을 WebSocket 프로토콜로 업그레이드합니다. 클라이언트는 업그레이드 요청과 함께 Sec-WebSocket-Key와 Sec-WebSocket-Version 헤더를 포함시킵니다.
h2c
커넥션을 평문(TLS 없이) HTTP/2로 업그레이드합니다. 클라이언트는 base64url로 인코딩된 HTTP/2 커넥션 매개변수를 담은 HTTP2-Settings 헤더를 포함시킵니다.
TLS/1.2, TLS/1.3
암호화되지 않은 HTTP 커넥션을 TLS로 보호되는 커넥션으로 업그레이드합니다. 이 메커니즘은 TLS를 직접 수립하는 방식보다 덜 흔합니다.
예시
클라이언트가 WebSocket 업그레이드를 요청합니다. 서버는 101 Switching Protocols로 응답하며 새 프로토콜을 확인해 수락합니다.
GET /chat HTTP/1.1
Host: example.re
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
클라이언트가 평문 HTTP/2로의 업그레이드를 제안합니다. HTTP2-Settings 헤더는 base64url 형식으로 인코딩된 초기 HTTP/2 매개변수를 담고 있습니다.
GET / HTTP/1.1
Host: example.re
Connection: upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA
서버가 클라이언트에게 다른 프로토콜을 쓰라고 요구합니다. 426 Upgrade Required 응답은 허용 가능한 프로토콜을 나열한 Upgrade 헤더를 포함합니다.
HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.3
Connection: upgrade