Home Connection: Upgrade의 의미
Post
Cancel

Connection: Upgrade의 의미

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 부분을 보고 “아 이걸로 바꿔달라는 거구나” 알 수 있습니다.

  1. Upgrade에 한개 이상의 프로토콜이 들어오는 경우가 있는데 이는 클라이언트가 전환해주길 원하는 프로토콜 목록의 선호도를 내림차순으로 리스팅하여 보낸것이다.
  2. 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
This post is licensed under CC BY 4.0 by the author.

슈도코드로 이해하는 소켓 프로그래밍

QnA로 기록하는 2022 GDSC KR Winter Hack 후기