웹소켓(websocket)에 대한 개념을 익히고 특징을 살펴본다.
웹소켓?

두 프로그램 간에 메세지(데이터)를 교환하기 위한 통신 방법 중 하나이다
- W3C와 IETF에 의해 자리잡은 표준 프로토콜 중 하나
- 현재 인터넷 환경(HTML5)에서 많이 사용된다.
- 웹 소켓을 지원하는 브라우저의 경우 웹 소켓 프로토콜을 지원
웹소켓 특징
- 양방향 통신 (Full-Duplex)
- 데이터 송수신을 동시에 처리할 수 있는 통신 방법
- 클라이언트와 서버가 서로 원할 때 데이터를 주고 받을 수 있다.
- 통상적인 http통신은 client가 요청 보내는 경우에만 server가 응답하는 단방향 방식이다.
- 실시간 네트워킹 (Real Time-Networking)
- 웹 환경에서 연속된 데이터를 빠르게 노출
- ex) 채팅, 주식차트, 비디오 데이터
웹 소켓 이전의 실시간 통신은 어떻게 했냐?
- Polling
: 서버로 일정 주기로 요청을 송신한다.
: 송신할 필요가 없는 경우에도 불필요한 송신 발생
: 실시간 통신이라고 하기엔 애매함
- Long Polling
: 서버에 요청을 보낸 후 응답을 받을 때까지 연결을 종료하지 않는 방식
: 응답을 받으면 연결이 종료되고 다시 재요청
: 많은 양의 메세지가 쏟아질 경우 polling과 같다.
- Streaming
: 서버에 요청 보내고 연결이 끊기지 않은 상태에서 계속 데이터 수신
: 클라이언트에서 서버로의 테이터 송신이 어렵다

결과적으로 위 3가지 방식 모두 HTTP를 통해 통신하기 때문에 요청,응답시에 header가 불필요하게 크다.
웹 소켓 동작 방법

1) 핸드 쉐이킹
-
웹소켓 클라이언트에서 핸드 쉐이크 요청(HTTP Upgrade)을 전송하고 이에 대한 응답으로 핸드 쉐이크 응답을 받는다.
-
이 때 응답 코드는 101이다. (status conde - 101 : 프로토콜 전환)
이 과정에서 발생하는 요청과 응답의 헤더에 대해 살펴보자.
1-1) 요청(request) 헤더
GET /chat HTTP/1.1 //반드시 get메서드로 요청한다.
Host: localhost:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://localhost:9000
- Host : 웹소켓 서버의 주소
- Upgrade : 프로토콜을 전환하기 위해 사용하는 헤더. 웹소켓 요청 시에는 반드시 websocket이라는 값을 가지며, 이 값이 없거나 다른 값이면 cross-protocol attack이라고 간주하여 웹소켓 접속을 중지시킨다.
- Connection : 현재의 전송이 완료된 후 네트워크 접속을 유지할 것인가에 대한 정보. 웹소켓 요청 시에는 반드시 Upgrade라는 값을 가지며, Upgrade와 마찬가지로 이 값이 없거나 다른 값이면 웹소켓 접속을 중지시킨다.
- Sec-WebSocket-Key : 이 key값을 통해 클라이언트-서버간 신원을 인증한다..
Sec-WebSocket-Protocol : 사용하고자 하는 하나 이상의 웹 소켓 프로토콜 지정. 필요한 경우에만 사용.
- Sec-WebSocket-Version : 클라이언트가 사용하고자 하는 웹소켓 프로토콜 버전.
- Origin : 클라이언트의 주소
1-2) 응답(response) 헤더
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
- Upgrade와 Connection은 요청과 동일.
- Sec-WebSocket-Accept : 요청 헤더의 Sec-WebSocket-Key에 유니크 아이디를 더해서 SHA-1로 해싱한 후, base64로 인코딩한 결과.
2) 데이터 전송
- 핸드 쉐이크를 통해 웹소켓 연결이 수립되면 데이터 전송 파트가 시작된다.
- 프로토콜이 ws로 변경.
- ws : 80 (port)
- wss : 443 (port)
- 메세지를 통해 양방향 데이터 전송한다.
- 메세지(message) : 여러 frame이 모여 구성하는 하나의 논리적 메세지(데이터) 단위
- 프레임(frame) :
- 통신에서 가장 작은 단위의 데이터
- 작은 헤더 + payload 로 구성
- 웹소켓 통신에 상용되는 데이터는 UTF8로 인코딩을 통해서만 지원된다.
3) 연결 종료
- 데이터의 양방향 전송이 모두 완료 되었다면 이제는 연결을 종료한다.
- 연결 종료 할 때는 Close Frame을 주고 받으며 종료한다.
- 연결 종료 이후에 수신되는 모든 추가적인 데이터는 버려진다.
reference :
https://blogs.oracle.com/theaquarium/post/entry/slideshow_example_using_comet_dojo
https://kellis.tistory.com/65
https://codecoco.tistory.com/117
https://www.youtube.com/watch?v=MPQHvwPxDUw