민스씨의 일취일장
rTcl | 처음 공부하는 WebSocket 본문
WebSocket에 대해 공부한 내용이다.
처음 공부하는 WebSocket
WebSocket이란?
WebSocket은 양방향 통신을 지원하는 프로토콜이다. 서버와 클라이언트 사이에서 실시간 데이터 교환이 필요한 경우 사용한다. 실시간 통신에 있어서 HTTP 보다 효율적이고, 지속적인 연결을 유지할 수 있다.
WebSoket를 잘 이해하기 위해서 핵심 개념 3가지를 알아야 한다.
- 핸드쉐이크 (Hand Shake)
- 지속 연결 (Persistent Connection)
- 이벤트 기반 통신 (실시간 제공 Real-Time Push)
1.핸드 쉐이크 (Hand Shake)
WebSockt 연결은 일반적인 HTTP 요청으로 시작되지만, 연결된 이후에는 지속적으로 연결을 유지한다. 처음 WebSocket 연결을 하기 위해선 여전히 HTTP 핸드쉐이크 과정을 거치게 된다.
1-1. 연결 요청 (클라이언트가 서버에 요청)
연결을 요청하는 쪽이 클라이언트가 된다. 연결 요청에는 아직 HTTP 프로토콜이 사용되며, 헤더 안에 upgrade와 connection를 반드시담아야 한다.
GET /chat HTTP/1.1
Host: ydmins.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: aifjiadjfaidjfiajfadijl
Sec-WebSocket-Version: 13
1-2. 서버가 응답하여 연결 업그레이드
서버는 클라이언트의 HTTP요청을 WebSocket 연결로 업그레이드를 하고, 해당 내용을 HTTP 응답으로 클라이언트로 보내준다. 이 때 헤더에는 101 Switching Protocols 코드가 담겨온다.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: dajfkldasjfdsajfioajdfild
1-3. WebSocket 연결 성립
위의 두 과정이 성공적으로 완료됐다면 WebSocket 연결이 성립된 것이다. 이제는 HTTP 프로토콜이 아닌 WS 프로토콜을 사용해야 한다. http:// 처럼 웹소켓도 ws://을 사용하는데, SSL 인증이 포함되어 있다면 https:// 처럼 wss://을 사용한다.
2. 지속 연결 (Persistent Connection)
한번의 요청과 응답이 끝난뒤 연결이 종료되는 HTTP에 반해, WebSocket은 한 번 연결이 성립된 후에 지속적으료 유지된다. 연결이 유지되는 동안에는 클라이언트와 서버는 별도의 추가 연결 작업없이 데이터를 양방향으로 주고 받을 수 있다. 이 때 연결이 정상인지 확인하기 위해 Ping/Pong 프레임을 사용하기도 한다. 이런 WebSocket의 특징으로, 매 요청시마다 발생했던 HTTP의 헤더를 사용하지 않아 오버헤드가 감소하는 효과가 있다.
3. 이벤트 기반 통신 (Real-Time Push)
WebSocket의 또 하나의 특징은 연결이 된 후에는 클라이언트 뿐만아니라 서버측에서도 데이터를 보낼 수 있다. 이 때 데이터를 Push한다고 한다. HTTP 통신에서는 서버의 데이터를 받기 위해서 주기적으로 요청(Polling)을 했어야 했지만 WebSocket에서는 그럴 필요가 없다.