지난 프로젝트를 하면서 웹소켓을 이용한 양방향 통신을 많이 이용했다.
웹소켓은 무엇이고 어떻게 연결이 유지될까?
웹 소켓이란?
웹소켓(WebSocket)은 하나의 TCP 접속에 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜이다. 웹소켓 프로토콜은 2011년
IETF에 의해 RFC 6455로 표준화되었으며 웹 IDL의 웹소켓 API는 W3C에 의해 표준화되고 있다.
https://ko.wikipedia.org/wiki/%EC%9B%B9%EC%86%8C%EC%BC%93
위키백과를 통해서 통신 프로토콜이라는 것을 알 수 있다.
웹에서 가장 많이 이용하는 통신 프로토콜을 HTTP이다.
HTTP 대신 웹 소켓을 이용해야하는 이유는 무엇일까?
HTTP와의 차이점
HTTP는 다음과 같은 특징을 가진다.
- 비연결성
- 요청이 있어야만 응답이 가능함
- 매번 연결시 헤더 정보가 포함됨
비연결성을 지향하여 한 번 요청에 응답을 보내면 해당 연결에 대한 정보는 저장되지 않고 바로 연결이 종료된다.
따라서 요청이 있어야지만 응답이 가능하며, 매번 요청과 응답에는 헤더 정보가 필요해서 그만큼의 비용이 발생한다.
어디에 활용할 수 있을까?
서버가 클라이언트에 원하는 시점에 데이터를 보내고 싶을 때, 실시간 통신이 필요할 때에 사용할 수 있다.
채팅 서비스를 생각해보자
A클라이언트가 B에게 메세지를 보내는 상황이라면,
B는 A가 메세지를 언제 보낼지 알 수 없다.
이 때 소켓 연결이 되어있다면 A가 B에게 메세지를 보냈다는 이벤트가 서버에 발생했을 때 서버는 바로 B에게 데이터를 전달해줄 수 있다.
(채팅 서비스가 모두 소켓연결로 이루어지는 것은 아니다.)
웹 소켓 핸드쉐이크
그렇다면 웹소켓은 어떻게 연결을 유지할까?
Handshake과정을 통해 이루어진다.
먼저, HTTP 프로토콜로 소켓 업그레이드 요청을 보낸다.
Upgrade: websocket, Connection: Upgrade가 헤더에 포함된다.
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
해당 요청을 보내면 서버에서 웹소켓 연결 성공의 의미로 101 코드 응답을 보내 웹소켓 연결이 이루어진다.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Key는 랜덤으로 생성된 16바이트의 키가 base64 인코딩 된 값이다.
이 값을 서버에 요청시 보내면, 서버는 이 값을 SHA-1 알고리즘으로 해싱하고 Sec-WebSocket-Accept에 응답한다.
이 과정으로 인증과정을 추가해 웹소켓 연결의 안전성, 유효성을 확인한다.
Data Transfer
핸드쉐이크로 연결이 성립되면 frame이라는 데이터 조각으로 데이터를 전송한다.
여러 프레임이 frame 하나의 메세지를 구성하고, 메시지 단위로 데이터를 송수신한다.
브라우저 호환성
웹 소켓은 HTML5에서부터 사용할 수 있다.
하지만 현재 대부분의 브라우저에서는 웹 소켓을 지원한다.
MDN : https://developer.mozilla.org/ko/docs/Web/API/WebSocket
웹 소켓 말고 다른 방법은 없을까?
1. 실시간 통신
웹 소켓 이전에는 polling, long polling 방식으로 실시간 통신을 했다.
- polling (short polling)
서버에 주기적으로 요청을 전송해서 서버의 응답을 받음
서버는 응답이 가능하면 응답을 보내고 불가능한 경우라면 빈 응답을 보냄. - long polling
서버에 조금 더 긴 주기로 요청을 보냄.
서버는 받은 요청을 당장 처리할 수 없으면 특정 시간동안 보류시키고, 해당 시간내에 응답 가능한 이벤트가 생기는 경우 즉시 응답을 보내고 그렇지 않으면 응답하지않음.
2. 서버에서 데이터 보내기
SSE (Server Sent Event) 라는 방법이 있다.
웹소켓과의 차이는 SSE는 서버에서 클라이언트로의 단방향 커뮤니케이션이라는 것이다.
SSE는 일방적으로 서버에서 데이터를 보내줄 때 이용할 수 있다.
주식차트에 이 방식이 활용될 수 있다.
'CS' 카테고리의 다른 글
Http 상태코드 (1) | 2023.08.01 |
---|---|
HTTP (0) | 2023.05.27 |
URI (Uniform Resource Identifier) (0) | 2023.05.27 |
인터넷 네트워크 (0) | 2023.05.27 |