101 Switching Protocols는 서버가 클라이언트의 Upgrade 요청 헤더를 수락했다는 뜻입니다. 101 응답을 끝내는 빈 줄 바로 다음부터 양쪽은 이 연결에서 다른 프로토콜로 통신합니다. 응답에는 새 프로토콜을 지정하는 Upgrade 헤더가 반드시 있어야 합니다.
오늘날 이 코드는 거의 항상 WebSocket 핸드셰이크에 쓰입니다. 브라우저가 Upgrade: websocket, Connection: Upgrade, Sec-WebSocket-Key를 담아 GET을 보내면, 서버는 그에 맞는 Sec-WebSocket-Accept와 함께 101로 응답하고, 그때부터 양쪽은 WebSocket 프레임을 주고받습니다. 101은 평문 HTTP/1.1에서 HTTP/2로 전환하는 h2c 업그레이드에도 쓰였지만, 이 방식은 현재 사용 중단되었습니다. 브라우저는 그 대신 TLS 핸드셰이크 중에(ALPN) HTTP/2와 HTTP/3을 협상합니다.
Upgrade 메커니즘은 HTTP/1.1에만 있습니다. HTTP/2와 HTTP/3은 101을 보내지 않으며, 이들 프로토콜 위의 WebSocket은 확장 CONNECT(RFC 8441, RFC 9220)를 사용합니다.
응답 예시
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= SEO 및 리디렉션 검사
101은 일반적인 페이지 요청의 결과로 나오지 않습니다. 브라우저와 크롤러는 연결 업그레이드를 명시적으로 요청할 때만 101을 받으므로 색인 생성에는 아무런 영향이 없습니다. 리디렉션 검사 도구는 일반 GET, HEAD, POST 요청을 보내므로 101을 볼 일이 없습니다. WebSocket 엔드포인트를 일반 URL처럼 검사하면 보통 426 Upgrade Required나 400 Bad Request 같은 4xx 코드가 돌아옵니다.
주요 원인과 사용 사례
- 브라우저가 WebSocket을 열고(
new WebSocket('wss://...')) 서버가 핸드셰이크를 수락합니다. - 클라이언트가 사용 중단된 평문 HTTP/2용
h2c업그레이드를 요청하고, 서버가 이를 지원합니다. - 리버스 프록시가
Upgrade와Connection헤더를 전달하지 않아 프록시 뒤에서 WebSocket이 실패합니다. nginx에서는proxy_http_version 1.1을 설정하고 두 헤더를 모두 백엔드로 전달하세요.