HTTP의 Stateless, Connectionless한 특징 때문에 양방향 통신을 위해 제안되는 프로토콜
OSI 7계층의 Application Layer에 존재하며, TCP에 의존한다.

출처. Hudi.blog
Request
GET ws://{주소}:{포트번호}/ HTTP/1.1
Host: {서버 주소}
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: b6gjhT32u488lpuRwKaOWs==
Connection: Upgrade / Upgrade: websocket 값이 없으면 cross-protocol attack이라고 간주하고 Websocket 접속과정을 중지한다.
Response
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: rG8wsswmHTJ85lJgAE3M5RTmcCE=
HTTP 요청 -> 웹소켓 업그레이드의 과정으로 인해 80번(HTTP), 443(HTTPS) 포트를 그대로 써서 방화벽 문제를 피할 수 있다.
과정
WebSocket에서 클라이언트가 서버로 보내는 모든 데이터는 마스킹되어야 한다.
프록시 서버가 WebSocket 프로토콜을 이해하지 못할 때, 마스킹 없이 클라이언트가 웹소켓으로 GET /script.js HTTP/1.1 같은 텍스트를 담아 보내면 중간에 있는 프록시 서버가 이를 새로운 HTTP 요청으로 착각하고 프록시 서버의 캐시를 오염시키거나 요청을 가로채는 공격이 가능해진다. 데이터를 마스킹해서 보내면, 프록시 서버 입장에서 의미를 알 수 없는 바이너리 쓰레기 값으로 보이게 만들어 이런 오해를 원천 차단할 수 있다.
따라서 WebSocket이 Http 표준 스펙이 아니기 때문에 추가적으로 발생되는 오버헤드이며, 서버가 클라이언트가 보낸 메시지를 받을 때마다 모든 바이트에 대해 O(N)의 XOR 연산을 수행하며 이러한 복호화 과정때문에 CPU를 더 사용하게 된다.
Simple Text Oriented Messaging Protocol
TCP, Websocket과 같은 신뢰할 수 있는 양방향 스트리밍 네트워크 프로토콜을 통해 사용 가능
SSE는 HTTP 스트리밍 방식으로, 서버가 클라이언트에게 지속적으로 데이터를 푸시하는 단방향 통신
클라이언트는 EventSource 객체를 통해 서버에 연결하며, 서버는 text/event-stream MIME 타입으로 데이터를 전송한다.
자동 재연결을 제공한다.
writer는 키보드 입력이 reviewer에게 전달되어야 하기 때문에 writer 측에서 websocket이라는 기술을 사용한다는 것을 어렵지 않게 선택할 수 있었다. 문제는 reviewer인데, reviewer는 서버로 보낼 데이터가 첨삭 댓글 작성이기 때문에, 어찌보면 단방향 통신인 SSE를 사용하고 댓글 작성은 API로 처리하는 것이 효율적일 수 있다.
reviewer는 WebSocket, SSE 중 어떤 기술을 사용하는 것이 좋고 어떤 트레이드 오프가 존재할까?
WebSocket과 SSE 성능비교에 따르면 성능은 둘 다 거의 비슷하다고 한다. 단방향 통신은 SSE를 써야한다라고 보통 말을 하던데, 그건 성능보다는 구조적 단순함에 기인한 것으로 보인다.
writer / reviewer 역할 구분 없이 동일한 인프라를 사용한다.
추후 Reviewer가 Writer에게 실시간 데이터 전송을 할 상황이 생길 경우 WebSocket을 사용하면 향후 기능 확장에 유리하다.
HTTP 표준 스펙이기 때문에 별도의 에러처리 및 ping pong을 하지 않아도 된다.
SSE의 EventSource는 연결이 끊어지면 자동으로 다시 연결된다.
이미 알림을 SSE로 연결하기 때문에 reviewer 측에서 추가적인 websocket 연결 수립을 하지 않고 사용 가능하다.
웹소켓보다 연결 오버헤드가 적다.
HTTP/1.1 환경에서는 브라우저에서 최대 6개의 연결만 허용한다. (HTTP2는 기본으로 100개를 허용한다.)
SSE에 비해 비교했을 때, WebSocket의 단점은 구현의 복잡성 및 별도의 에러처리와 ping pong 로직, 재연결 로직을 짜야한다는 문제이다. STOMP를 사용하게 된다면 이러한 단점을 해결할 수 있을 것이라고 생각했다.
또한, writer가 websocket을 사용하고 있기에 동일한 인프라를 사용할 수 있는 장점이 있다고 판단하였고, 추후 확장성에 있어서도 유리한 결정이라고 생각했다. websocket에 비해 SSE가 가지는 명확한 장점이 존재하지 않으므로 구현복잡성이 더 낮을 것이라고 판단되는 websocket으로 writer와 reviewer의 로직을 통일하기로 결정했다.