웹소켓 (WEB Socket)

윤따·2025년 2월 19일
0

지금 Dapp 을 혼자 만들어보고 있는데, 여기에 채팅기능을 추가할 예정이라
web socket 을 사용하려고 한다.

그럼 채팅을 구현할 때 왜 웹소켓을 사용할까?

채팅은 A와 B가 있을 때, A가 채팅을 보내면 바로 바로 B의 화면에도 A의 채팅이 보여야한다. 즉, 실시간성이 가장 중요하다.
만약, http로 채팅을 구현한다면 서버에 과부화가 올 것이다.
왜냐면 http는 기본적으로 서버가 먼저 클라이언트한테 데이터를 보낼 수 없다.(단방향 통신)

HTTP로 채팅을 구현한다면?
1. 사용자 A가 메세지를 작성하고 Post 요청을 보냄
2. 서버가 200OK를 응답하고 메세지를 저장함
3. 사용자 B는 A의 메세지가 왔는지 모름
4. 사용자 B가 실시간으로 A의 메세지를 확인하기 위해서는 계속해서 Get 요청을 보내야함 -> 서버의 부하가 커짐

여기서 내가 살짝 헷갈렸던 점은, 사용자 A와 사용자 B가 P2P연결 되는 것이 아니다 ! 사용자 A와 B는 서버와 웹소켓 프로토콜로 연결되는 것이다.

웹소켓이란?

양방향성을 가진 프로토콜이고 Http 와 같이 TCP 위에서 동작한다. (전송 속도가 중요하다고 생각해서 UDP 위에서 동작할 줄 알았는데 아무래도 채팅 메세지가 없어지거나 순서가 달라지면 큰일일 수 있으니 안전한 TCP 위에서 동작하는 듯)

웹소켓 동작 과정

1. 웹소켓 핸드셰이크 (hand shake)

GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9YZrdmQ==
Sec-WebSocket-Version: 13

클라이언트는 웹소켓을 사용하기 위해 http를 이용하여 서버에 연결 요청을 보냄 Upgrade 헤더를 통해 프로토콜을 웹소켓으로 변경함.

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=

서버는 성공 응답을 보냄

2. 웹소켓 연결 유지
한번 연결이 설정되면 클라와 서버는 계속 연결 양방향 소통이 가능해짐!

3. 웹소켓 메세지 송수진
웹소켓은 텍스트 및 바이너리 데이터를 프레임 형태로 보냄

4. 웹소켓 연결 종료
서버 혹은 클라이언트가 종료 메세지를 보내면 종료됨

다음에는 웹소켓을 사용하여 채팅을 구현하려고 한당

profile
윤따와더나은인생

0개의 댓글