의미
서버가 클라이언트가 Upgrade 헤더로 요청한 프로토콜(대개 WebSocket)로 전환하는 데 동의했습니다. 이 응답 이후 연결은 새 프로토콜로 통신합니다.
흔한 원인
- WebSocket 핸드셰이크 성공
- 클라이언트가 h2c(평문 HTTP/2) 업그레이드를 요청함
- 사용자 정의 프로토콜 업그레이드가 수락됨
해결 방법
클라이언트 또는 방문자라면
WebSocket에서는 101이 성공입니다. 101을 기대했는데 200이나 400을 받았다면 URL이 WebSocket 엔드포인트를 가리키는지, 프록시가 Upgrade와 Connection 헤더를 전달하는지 확인하세요.
사이트나 API 운영자라면
nginx나 로드 밸런서 뒤에서는 Upgrade와 Connection을 명시적으로 전달하고(proxy_set_header Upgrade $http_upgrade; Connection "upgrade"), 오래 유지되는 소켓을 위해 유휴 타임아웃을 늘리세요.
응답 예시
HTTP/1.1
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 명세
자주 묻는 질문
› WebSocket이 101 대신 400을 반환하는 이유는?
핸드셰이크 헤더가 없거나 변경되었습니다. Upgrade/Connection을 제거하는 프록시나 잘못된 Sec-WebSocket-Key 또는 버전이 흔한 원인입니다.
› HTTP/2도 101을 사용하나요?
드문 평문 h2c 업그레이드에서만 씁니다. 브라우저는 TLS ALPN으로 HTTP/2를 협상하며, HTTP/2 자체에는 101 응답이 없습니다.