HTTPQUERY
한국어

426 Upgrade Required

사용법

426 Upgrade Required 상태 코드를 받으면 응답에는 요구되는 프로토콜을 나타내는 Upgrade 응답 헤더 필드가 포함됩니다.

이 메시지는 클라이언트가 Upgrade 헤더로 보낸 프로토콜 업그레이드 요청에 대한 응답으로 전송되는 101 Switching Protocols 메시지와 관련이 있습니다.

SEO 영향

Google 같은 검색 엔진은 426 응답 상태를 가진 URL을 색인하지 않습니다. 이전에 색인되었다가 이 상태 코드를 반환하는 URL은 검색 결과에서 제거됩니다.

예시

클라이언트가 평문 HTTP로 리소스를 요청하지만, TLS가 필수이므로 서버는 426 Upgrade Required로 응답합니다. 클라이언트가 HTTPS로 전환하면 요청이 성공합니다.

HTTP/2와 HTTP/3

HTTP/2와 HTTP/3은 Upgrade 헤더가 아니라 TLS 핸드셰이크 중의 ALPN을 통해 협상됩니다. 평문 HTTP/2 업그레이드 메커니즘(h2c)은 명세에서 제거되었습니다. Upgrade 헤더는 TLS나 WebSocket 같은 프로토콜 전환에 적용됩니다.

최초 요청

GET /tech-news HTTP/1.1
Host: example.com

최초 응답

HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.2
Connection: upgrade
Content-Type: text/html
Content-Length: 140

<html>
  <head>
    <title>TLS Required</title>
  </head>
  <body>
   <p>This service requires TLS.</p>
  </body>
</html>

HTTPS를 통한 후속 요청

GET /tech-news HTTP/1.1
Host: example.com

응답

HTTP/1.1 200 OK
Content-Type: text/html

해결 방법

응답의 Upgrade 헤더를 읽어 요구되는 프로토콜을 확인하세요. 서버는 TLS/1.2, HTTP/2, HTTP/3, websocket 등 수용 가능한 프로토콜을 하나 이상 나열합니다.

프로토콜 버전 업그레이드의 경우, 클라이언트를 지정된 프로토콜로 전환한 뒤 요청을 다시 보내세요. HTTP/2와 HTTP/3은 Upgrade 헤더가 아니라 TLS 핸드셰이크 중의 ALPN을 사용합니다. WebSocket 같은 다른 프로토콜에서는 Connection: upgrade와 그에 맞는 Upgrade 헤더를 포함하세요. 서버는 101 Switching Protocols로 응답하고 연결은 새 프로토콜 아래에서 진행됩니다.

nginx를 통한 WebSocket 연결의 경우, 프록시가 업그레이드 헤더를 전달하도록 설정하세요.

이 지시문들이 없으면 nginx는 업스트림 연결에 기본적으로 HTTP/1.0을 사용하고 업그레이드 헤더를 제거하므로, WebSocket 핸드셰이크를 시도할 때마다 426이 발생합니다.

서버가 HTTPS를 강제하는 경우, 요청 URL의 스킴을 http://에서 https://로 바꾸세요. 클라이언트나 런타임 환경에서 TLS 1.2 또는 TLS 1.3이 활성화되어 있는지 확인하세요. 구형 TLS 버전은 흔히 거부됩니다.

클라이언트 라이브러리와 SDK가 요구되는 프로토콜을 지원하지 않는다면 업데이트하세요. 오래된 HTTP 라이브러리는 기본적으로 HTTP/1.1을 사용하며 HTTP/2나 HTTP/3 협상 기능이 없습니다.

프로토콜 전환을 의도하지 않은 요청에서는 불필요한 Upgrade 헤더를 제거하세요. 일부 프록시는 엉뚱하게 남은 Upgrade 헤더를 프로토콜 협상 시도로 해석해 426을 반환합니다.

코드 참고

.NET

HttpStatusCode.UpgradeRequired

Rust

http::StatusCode::UPGRADE_REQUIRED

Rails

:upgrade_required

Go

http.StatusUpgradeRequired

Symfony

Response::HTTP_UPGRADE_REQUIRED

Python3.5+

http.HTTPStatus.UPGRADE_REQUIRED

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_UPGRADE_REQUIRED

Angular

@angular/common/http/HttpStatusCode.UpgradeRequired