ACC라는 동아리에서 인프라 중심의 해커톤에 참여하게 되었다. 우리 팀은 채팅 시스템을 구현하는 주제를 맡았는데 이제까지 개발해오던 거랑은 달라서 생각보다 공부해야 할 부분이 많다. 그중에 채팅시스템을 구현하기 위해서는 웹소켓이라는 프로토콜을 사용한다.
서버와 클라이언트 간의 메시지 교환을 위한 통신 규약(프로토콜)
Polling: 일정한 주기로 서버에 요청(Request)을 보내는 방법.
Long Polling: 요청을 보냈을 때, 서버가 응답을 바로 보내지 않고 특정 이벤트나 타임아웃이 발생했을 때 응답을 전달하는 방식
Streaming: 이벤트가 발생했을 때 응답을 내려주되, 응답을 완료시키지 않고 계속 연결을 유지하는 방식.
지속적인 연결을 유지하여 실시간 채팅을 구현⇒ socket통신을 선택
서버에서 연결된 소켓(사용자)들을 세밀하게 관리해야하는 서비스인 경우에는 Broadcasting 기능이 있는 socket.io을 쓰는게 유지보수 측면에서 훨씬 이점이 많습니다.
데이터 전송이 많은 경우는 빠르고 비용이 적은 표준 WebSocket을 이용하는 게 바람직하다고 한다.
Opening Handshake 와 Closing Handshake 는 일반적인 HTTP TCP 통신의 과정 중 하나이다.
접속 요청은 HTTP 로 한 뒤, 웹소켓 프로토콜로 변경된다. (WS)
웹소켓 프로토콜로 변경되기 위한 HTTP 헤더는 아래처럼 구성되어 있다.
[요청]
GET /spring-websocket-portfolio/portfolio HTTP/1.1
Host: localhost:8080
Upgrade: websocket ---- 1
Connection: Upgrade ---- 2
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: http://localhost:8080
위와 같은 요청을 받은 웹 소켓을 지원하는 서버는 일반적으로 200 상태 코드 대신에 101 상태코드를 반환한다
[응답]
HTTP/1.1 101 Switching Protocols ---- 1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp
Opening HandShake에서 승인이 나고나면,
웹 소켓 프로토콜로 노란색 박스 부분인 Data transfer 이 진행된다.
여기서 데이터는 메시지라는 단위로 전달된다.