Upgrade
요청·응답 General

개요

Upgrade는 이미 열린 연결에서 다른 프로토콜로 전환하자고 제안하는 헤더입니다. 요청에서는 클라이언트가 원하는 프로토콜을 나열하고, 응답에서는 서버가 선택한 전환 프로토콜을 알립니다.

가장 대표적인 용도는 HTTP 연결을 WebSocket으로 승격하는 것이며, `Connection: Upgrade`와 항상 함께 사용됩니다.

자세히

핸드셰이크는 이렇게 진행됩니다. 클라이언트가 `Upgrade: websocket`과 `Connection: Upgrade`를 보내면, 서버가 수락 시 `101 Switching Protocols`로 응답하고 같은 TCP 연결을 그 시점부터 WebSocket 프레임 통신으로 전환합니다. Upgrade는 홉 단위 헤더라 반드시 Connection 헤더에 나열되어야 하며, 프록시가 이를 이해해야 승격이 성립합니다.

WebSocket 외에도 평문 HTTP/1.1을 암호화 없는 HTTP/2로 올리는 `h2c`(HTTP/2 cleartext) 승격에 쓰였습니다. 다만 브라우저는 h2c Upgrade를 지원하지 않고 HTTP/2는 사실상 TLS(ALPN)로 협상되므로, 오늘날 Upgrade의 실사용은 대부분 WebSocket입니다. TLS로의 전환을 뜻하던 `Upgrade: TLS/1.0`(RFC 2817)도 거의 쓰이지 않습니다.

서버가 특정 프로토콜(예: HTTPS)로의 업그레이드를 요구할 때는 `426 Upgrade Required`로 응답하며, 이때 응답에 Upgrade 헤더로 요구 프로토콜을 명시합니다. 보안상 프록시·게이트웨이가 Upgrade 처리를 잘못하면 요청 스머글링·연결 혼선의 원인이 될 수 있어, 리버스 프록시의 WebSocket 패스스루 설정(Upgrade/Connection 헤더 전달)이 정확해야 합니다.

문법

Upgrade: <protocol>[/<version>][, ...]

e.g. Upgrade: websocket

실무 참고

관련 헤더

ConnectionSec-WebSocket-KeySec-WebSocket-Accept

관련 상태코드

스펙 근거