WebSocket이란?
WebSocket은 클라이언트와 서버를 연결하고, 실시간으로 통신이 가능하도록 하는 통신 프로토콜이다.
Socket Connection을 유지한 채로 실시간 양방향 통신이 가능하다.
SNS, 실시간 채팅, 화상 회의, 증권, 거래소에서 웹소켓을 많이 사용한다.
WebSocket vs HTTP
WebSocket과 HTTP의 차이를 크게 State, Protocol, Uri 측면에서 다루어 볼것이다.
1.State
- HTTP
- 단방향 통신(클라이언트가 서버로 요청을 보내면 응답을 받는 구조로 동작, 어떠한 상태도 보관하지 않는다.(Stateless)
- 서버는 클라이언트에게 일방적으로 데이터 전달을 할수없다.
- WebSocket
- HTTP와 다르게 상태를 가진다.(Stateful)
- 클라이언트와 서버가 한번 연결되면 해당 커넥션을 계속 사용해서 서로 간 자유롭게 통신 가능
2.Protocol
WebSocket의 경우 최초 접속 시 HTTP프로토콜을 이용하지만, 그 이후에는 자체적인 WebSocket프로토콜로 통신한다.
3.Uri
HTTP로 통신 시 주소가 http://www.abc.com 이면, WebSocket 통신에서는 ws://www.abc.com이다.
WebSocket의 동작

WebSocket의 동작은 크게 핸드쉐이킹, 데이터 전송, 연결종료로 이루어짐
1.핸드쉐이킹
요청
GET /chat HTTP/1.1
Host: localhost:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://localhost:9000
-
연결 수립
- ws/wss 프로토콜이 아닌 http/https 프로토콜 사용
- GET
- HTTP는 1.1 이상
-
Host
-
Upgrade
- 프로토콜 전환을 위한 헤더
- 웹 소켓 요청 시에는 반드시 websocket값을 부여
-
Connection
- 요청 완료 후 네트워크 접속 유지 여부에 대한 정보
-
Sec-WebSocket-Key
- 16byte 길이의 임의의 숫자를 base64 인코딩한 값
- 클라이언트와 서버 간 인증에 사용
-
Sec-WebSocket-Protocol
- 클라이언트가 요청하는 프로토콜들로, 하나 이상의 웹 소켓 프로토콜들을 지정
- 공백 문자로 구분, 순서에 따라 우선권을 부여
- 서버에서 각 프로토콜이나 프로토콜 버전에 따라 서비스를 나눌 경우 필요
-
Origin
- 클라이언트의 주소
- 해당 헤더가 없는 경우 요청이 거부될 수 있다
응답
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
- 101 Switching Protocols
- Upgrade, Connection : 요청과 동일
- sec-WebSocket-Accept
- Sec-WebSocket-Key 값을 unique id 값을 더해 SHA-1로 해싱한 값을 base64로 인코딩한 결과값
- 해당 값이 클라이언트에서 계산된 값과 일치해야 연결 수립
2.데이터 전송
- 프로토콜이 http/https에서 ws/wss로 변경
- port는 http와 같은 port를 사용(ws:80, wss:443)
- 클라이언트와 서버는 Message단위로 데이터를 주고 받으며, Message는 한개 이상의 Frame으로 구성됨
- Message
- 여러 Frame들이 모여 구성되는 논리적 단위
- Message에는 텍스트 데이터와 이진 데이터만이 담길 수 있음
- Frame
- 데이터 전송에 사용되는 가장 작은 단위의 데이터
- 헤더 + payload로 구성
- 텍스트 데이터(UTF-8), 이진 데이터, 컨트롤 프레임(프로토콜 레벨 신호) 등이 있음
- WebSocket 통신에는 UTF-8 인코딩을 사용
- [0x00][UTF-8 Payload][0xff]
3.연결종료
- 클라이언트 혹은 서버가 상대방에게 연결 종료를 위한 Close Frame을 전송
- 요청을 받은 쪽에서 응답으로 Close Frame을 전송하여 WebSocket연결 종료