웹소켓이란 무엇인가?
SSAFY 공통 프로젝트를 진행하며 웹소켓을 활용한 채팅, 대기방, 게임방을 구현했던 경험이 있다.
당시에는 구현에 집중하느라 정확히 웹소켓이 어떤 기술이고, 어떻게 동작하는지 알지 못했었다.
그리고 당연히 면접 때도 답변할 수 없었다… 지금부터라도 제대로 알아보려고 한다.
웹소켓(Web Socket)
웹소켓(Web Socket)은 웹 애플리케이션과 서버 간의 상호작용을 실시간으로 할 수 있게 해주는 프로토콜이다.
HTTP 프로토콜과는 다르게 서버 간에 지속적인 연결을 유지해 데이터를 양방향으로 주고받을 수 있게 해준다.
하지만, 초기 핸드셰이크를 위해 HTTP 프로토콜을 사용하긴 한다.
실시간 통신이라는 키워드로 빠르게 데이터를 보낸다는 생각에 헷갈릴 수 있는데, 엄연히 TCP위에서 동작한다.
그 이유는 아래와 같다.
- 신뢰성 있는 전송
- 웹소켓은 채팅 앱이나 금융 거래, 실시간 업데이트 등 데이터의 정확성과 신뢰성이 중요한 곳에 사용된다.
- 이때 TCP는 패킷 손실, 중복, 순서 변경 등을 감지하고 수정하는 기능을 제공한다.
- 연결 지향
- 클라이언트와 서버 간 지속적인 연결을 통해 양방향 통신을 유지해야 하는 웹소켓 특성상 TCP를 사용해야 한다.
그렇다면 소켓과 웹소켓의 차이점은 무엇일까
소켓(Socket)
소켓(Socket)은 네트워크에서 컴퓨터 간의 통신을 가능하게 하는 인터페이스이다.
이는 TCP/IP 네트워크에서 클라이언트와 서버 간의 연결을 설정하고, 데이터를 주고 받을 수 있게 한다.
그리고 다양한 프로토콜 (TCP, UDP 등) 을 지원한다.
즉, 소켓과 웹소켓은 애초에 다른 네트워크 계층에 속한다.
소켓은 전송 계층(4계층), 웹소켓은 응용 계층(7계층)
그럼 웹소켓의 동작 방식에 대해서 알아보자.
웹소켓의 동작 방식
1. 초기 핸드 셰이크 (HTTP Upgrade Request)
클라이언트가 서버에 HTTP 업그레이드 요청을 보내 웹소켓 프로토콜로 전환을 요청한다.
이때, 다음과 같은 요청을 보낸다.
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== (클라이언트에서 생성된 랜덤한 값)
Sec-WebSocket-Version: 13
2. 서버 응답
서버는 클라이언트의 요청을 수락하면 다음과 같은 응답을 보낸다.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
3. 지속적인 TCP 연결
핸드셰이크가 성공적으로 완료되면, HTTP 연결은 웹소켓 연결로 업그레이드 된다.
이 시점부터 클라이언트와 서버는 TCP 연결을 통해 지속적으로 데이터를 주고받을 수 있다.
4. 데이터 프레임 전송
웹소켓 통신은 데이터 프레임 단위로 이루어지며, 아래의 구조를 가진다.
- FIN (1 bit): 메시지의 마지막 프레임임을 나타낸다.
- RSV1, RSV2, RSV3 (각 1 bit): 확장을 위한 예약 비트로, 현재는 모두 0으로 설정된다.
- Opcode (4 bits): 프레임의 유형을 나타낸다.
- Mask (1 bit): 클라이언트에서 보낸 메시지인지 서버에서 보낸 메시지인지를 나타낸다.
- Payload length (7, 7+16, 7+64 bits): 페이로드 데이터의 길이를 나타낸다.
- Masking key (32 bits, optional): 클라이언트가 보낸 메시지를 마스킹하기 위한 키이다.
- Payload data: 실제 전송되는 데이터이다.
5. 연결 유지 및 종료
웹소켓 연결은 클라이언트와 서버 간에 지속적으로 열려있으며, 다음과 같은 방식으로 유지된다.
Ping/Pong 프레임
- 연결 상태를 확인하고 유휴 시간을 줄이기 위해 사용된다.
- 서버는 클라이언트에게 핑 프레임을 보내고, 클라이언트는 이에 대한 응답으로 퐁 프레임을 보낸다.
연결 종료
- close 프레임: 연결을 종료하기 위해 클라이언트 또는 서버가 전송한다.
- 종료 코드와 종료 이유가 포함된다.
- TCP 연결 종료: 웹소켓 연결이 종료되면, TCP 연결도 종료된다.
이렇게 웹소켓에 대해서 간단히 살펴보았다.
다음에는 웹소켓을 기반으로 동작할 수 있는 STOMP에 대해서 알아보자.