웹 소켓 이란
웹소켓은 실시간, 양방향 통신을 가능하게 하는 웹 통신 프로토콜이다.
기존 HTTP 프로토콜은 Client 가 Server 에 요청을 보내고, Server 가 응답을 반환하는 단방향 통신만 가능했다.
예를들어, 채팅 앱의 경우 Server 가 새로운 메세지를 즉시 Client 에게 알려야 하는데 HTTP 만으로는 어려움이 존재한다.
웹소켓을 이용하면 Server 와 Client 가 하나의 오픈된 연결을 유지하게 되어 데이터를 즉시 전송할 수 있다.
통신 과정
1. HTTP 요청 (HandShake 시작) : 클라이언트가 서버에 HTTP 요청을 보낸다. 이 때, 헤더에 Upgrade: websocket 정보가 포함되어 있다.
2. HTTP 응답 (HandShake 완료) : 서버가 이 요청을 받아 Connection: Upgrade 와 같은 헤더로 응답한다. 이로써 둘 사이의 연결이 웹소켓으로 업그레이드 된다.
3. Websocket Connection : 이 단계에서 실제 웹소켓 연결이 열린다. 클라이언트와 서버는 이 연결 통해 양방향으로 데이터를 주고 받을 수 있다.
4. Data Transfer (Frame 전송) : 웹소켓 연결이 열린 상태에서는 양방향으로 '프레임' 단위로 데이터를 주고 받는다.
5. Websocket Close : 클라이언트나 서버 중 하나가 연결을 닫으면 상대방에게 연결을 닫을 것임을 알리고 연결이 종료된다.
장단점
장점
- 실시간 업데이트가 필요한 웹 앱에 최적화
- 헤더 오버헤드가 작아 효율적인 통신 가능
- 양방향 통신을 지원
단점
- 전통적인 방화벽과 프록시 설정에 의해 차단될 가능성 있음
- 웹소켓을 지원하지 않는 서버나 브라우저의 한계
- 웹소켓은 HTTP 와 다르게 상태를 유지(stateful) 하기 때문에 서버와 클라이언트는 연결을 항상 유지해야한다.
- 부하 발생
- 비정상적으로 연결이 끊어졌을 때 적절한 대응 필요
- 프로그램 구현에 보다 많은 복잡성을 초래할 가능성이 있다.