이 값들은 하나의 모드에 대한 경쟁적인 표기가 아닙니다.

Connection: Upgrade
Connection: keep-alive, Upgrade

두 번째 값은 두 개의 연결 옵션을 나열합니다. HTTP는 Connection을 쉼표로 구분된 목록으로 정의하며, 옵션 이름은 대소문자를 구분하지 않습니다. 전체 값을 정확한 문자열 Upgrade와 비교하는 코드는 그 옵션을 포함하는 유효한 목록을 놓칩니다.

일반적인 전달에서 HTTP 중개자는 들어오는 필드를 파싱하고, 그 옵션이 지목한 필드를 제거한 뒤, Connection 자체를 제거하거나 다음 연결을 위해 중개자 자신의 제어 옵션으로 대체합니다.

하드코딩된 Keep-Alive 필드만 제거하는 것으로는 충분하지 않습니다. 메시지는 목록에서 다른 연결 전용 필드를 지목할 수 있으며, 그 필드는 일반 전달로 새어 나가서는 안 됩니다.

프로토콜 업그레이드를 지원하려면 두 연결과 새 프로토콜을 의도적으로 다루어야 합니다. 들어오는 Upgrade 헤더를 무작정 복사하는 것은 그 인계의 구현이 아닙니다.

한 브라우저는 동작하고 다른 브라우저는 실패할 때, 중개자 양쪽의 실제 필드 값을 비교하십시오. 단일 토큰과 두 토큰 목록의 차이는 브라우저가 다른 브라우저의 정확한 형식을 흉내 내지 않고도 파서 오류를 드러낼 수 있습니다.

이는 프록시가 파싱하는 HTTP 메시지에 관한 것입니다. 일반적인 HTTPS CONNECT 터널은 암호화된 웹사이트의 Connection 필드를 그 프록시에 노출하지 않습니다.

관련 글