> For the complete documentation index, see [llms.txt](https://real-dev.gitbook.io/real-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://real-dev.gitbook.io/real-library/backend-mastre-courese-udemy/10.-websockets.md).

# 10. WebSockets

<br>

* HTTP를 이용한 연결성 양방향 통신
* TCP를 직접 웹에서 사용하지 않는 이유는 TCP로 할 수 있는 것이 너무 많기 때문에, 보안상 취약점이 너무 많이 드러남

\ <br>

#### 핸드 셰이크

* 웹 소켓 핸드셰이크는 기본적으로 특별한 요청을 처리하는 평범한 HTTP Reqest일뿐이다.
* ws\://, wss\:// 로 시작하는 프로토콜이다
* handshake request가 정상적으로 처리되면 서버는 101 응답을 보낸다. 이는 Switching Protocols 응답으로 이 때부터 Websocket이 사용됨을 의미한다.

<br>

#### 주요 사용처

* 채팅, Twitch, 치지직 등
* Live Feed
* Multiplayer gaming
* Showing client progress/logging
* 등 지속적인 연결과 빠른 서비스가 필요한 곳에 적합하다.

<br>

#### 장점

* 전이중 통신
* HTTP 친화적
* 방화벽 친화적 - 방화벽이 port 자체를 막아버리지 않음

<br>

#### 단점

* 프록시 처리하기가 너무 어려움.
* HTTP 기반이기 때문에 Timeout에 취약하다. 메시지 전송이 없을 때 연결이 꺼질 수 있기 때문에 중간중간 Ping-Pong이 필요함.
* 상태기반이기 때문에 수평적 확장이 어려움 (하나의 서버에 종속적) Layer 4 Load Balancing을 통해서 확장할 수 있지만, 백엔드 자원을 많이 사용하고 비효율적이다.

<br>

#### 결론

* 때문에 롱폴링이나 SSE 같은 방식들이 차라리 더 적합할 수도 있다. 애초에 쓰기가 어렵고 힘드니까. 꼭 필요하다면 써야겠지만
*
