Upgrade?
웹소캣을 공부하다가 웹소캣 연결을 위해 서버로 요청을 보낼 때 Connection:Upgrade
를 헤더에 포함하여 보내는걸 보고 이게 무슨 뜻인가.. 해서 찾아봤어요.
결론은 바로 클라이언트가 서버에게 "현재 연결된 프로토콜을 다른 프로토콜로 바꿔줘!"
라고 요청하는 것이었습니다.
다른 프로토콜의 연결을 새로 만드는게 아니라 현재 연결의 프로토콜을 전환시키는 것임!
뭐 예를 들어 현재 HTTP 1.1
프로토콜에서 HTTP 2.0
, HTTPS
, Web socket
으로 전환하는 것입니다.
요청의 예시를 보면 아래와 같아요.
1
2
3
4
GET /hello HTTP/1.1
Host: localhost
Connection: upgrade
Upgrade: websocket, foo
upgrade
가 뭔지 아니까 처음 볼때보다 더 눈에 잘들어온다. Connection: upgrade
를 보고 다른 프로토콜로 전환해달라는 요청인 것을 알수 있게 되었습니다. 그러면 당연히 어떤 프로토콜로?
라는 질문이 따라오게 되는데 Upgrade: websocket, foo
부분을 보고 “아 이걸로 바꿔달라는 거구나” 알 수 있습니다.
Upgrade
에 한개 이상의 프로토콜이 들어오는 경우가 있는데 이는 클라이언트가 전환해주길 원하는 프로토콜 목록의 선호도를 내림차순으로 리스팅하여 보낸것이다.Upgrade
가 헤더에 포함되면Connection:upgrade
도 필수적으로 요청에 포함되어야 한다.
101: Switching Protocols
그렇게 프로토콜 전환 요청이 성공적으로 이루어 지면 서버측에서는 101 Switching Protocols
응답과 함께 아래와 같이 응답을 해줍니다.
1
2
3
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
426: Upgrade Required
위 내용과 살짝 별개의 내용이긴 한데 서버가 내가 보내는 요청의 프로토콜을 수행할 수 없으나 다른 프로토콜로 전환하면 수행할 수 있을 경우 426 Upgrade Required
상태코드를 반환합니다.
1
2
3
4
5
6
7
HTTP/1.1 426 Upgrade Required
Upgrade: HTTP/2.0
Connection: Upgrade
Content-Length: 53
Content-Type: text/plain
This service requires use of the HTTP/2.0 protocol