
웹 서비스 개발 – 웹 소켓 – 웹 소켓 개념과 동작 원리
안녕하세요~ 😊
오늘은 웹 기술의 새로운 가능성을 열어주는 **웹 소켓(WebSocket)**에 대해 알아보는 시간을 가져보려고 해요!
기존의 HTTP 통신만으로는 한계가 있었던 실시간 데이터 전송을 손쉽고 효율적으로 처리할 수 있게 해주는 주인공이 바로 이 웹 소켓입니다.
마치 전화기를 들고 끊지 않고 계속 대화할 수 있는 것처럼,
웹 소켓은 한 번 연결되면 끊기지 않고 양방향으로 소통할 수 있어요! 📞💬
1. 웹 소켓(WebSocket)이란?
웹 소켓은 실시간 양방향 통신을 가능하게 하는 프로토콜이에요.
기존 HTTP는 요청이 있어야만 응답이 가능한 단방향 방식이지만,
웹 소켓은 서버와 클라이언트가 한 번 연결되면, 실시간으로 계속 주고받을 수 있어요.
즉, 웹 소켓은 **”끊지 않는 HTTP”**처럼 작동하죠!
2. 웹 소켓의 동작 원리
웹 소켓은 다음과 같은 흐름으로 동작합니다.
✅ 1. 핸드셰이크(HandShake)
- 웹 소켓은 처음에 HTTP 요청을 보내서 연결을 시도해요.
- 이 요청에 서버가 웹 소켓 업그레이드를 허락하면 연결이 웹 소켓으로 전환됩니다.
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xxxxx
Sec-WebSocket-Version: 13
→ 서버가 이를 수락하면 101 Switching Protocols
응답을 보내고, 연결이 전환돼요.
✅ 2. 연결 유지
- 연결이 유지되며 클라이언트와 서버가 자유롭게 메시지를 주고받을 수 있어요.
- 이때는 추가적인 HTTP 헤더 없이, 가볍고 빠른 이진 또는 텍스트 프레임이 오갑니다.
✅ 3. 연결 종료
- 어느 쪽이든 원하면 연결을 종료할 수 있어요. (예: 사용자가 채팅창 닫기)
3. 웹 소켓 vs HTTP
항목 | HTTP | WebSocket |
---|---|---|
연결 방식 | 요청/응답 | 지속 연결 |
통신 방향 | 클라이언트 → 서버 (단방향) | 클라이언트 ↔ 서버 (양방향) |
속도 | 느림 (매번 요청 필요) | 빠름 (연결 유지) |
실시간 처리 | 어려움 (폴링 필요) | 탁월함 |
사용 예 | 웹 페이지, API 호출 | 채팅, 게임, 주식 시세, 실시간 알림 등 |
웹 소켓은 실시간이 필요한 모든 서비스에서 진가를 발휘해요!
4. 웹 소켓이 필요한 상황은?
- ✅ 실시간 채팅 서비스 (예: 카카오톡 웹버전)
- ✅ 실시간 주식 시세/암호화폐 가격 표시
- ✅ 온라인 멀티플레이 게임
- ✅ 실시간 알림(푸시 알림)
- ✅ IoT 센서 데이터 실시간 수집
기존 HTTP 방식으로는 ‘주기적으로 데이터를 요청해야 하는’ 불편함이 있었지만,
웹 소켓은 서버가 먼저 데이터를 **”푸시”**할 수 있어서 훨씬 효율적입니다!
5. 웹 소켓 간단 사용 예시 (JavaScript)
const socket = new WebSocket("wss://example.com/socket");
// 연결 성공
socket.onopen = () => {
console.log("서버와 연결되었습니다.");
socket.send("안녕하세요 서버님!");
};
// 메시지 수신
socket.onmessage = (event) => {
console.log("서버로부터 수신한 메시지:", event.data);
};
// 오류 발생
socket.onerror = (error) => {
console.error("에러 발생:", error);
};
// 연결 종료
socket.onclose = () => {
console.log("연결이 종료되었습니다.");
};
wss://
는 SSL이 적용된 웹 소켓 연결이고,ws://
는 일반 연결이에요.
6. 서버에서의 웹 소켓 처리 (PHP Ratchet 예시)
PHP에서는 Ratchet
이라는 웹 소켓 라이브러리를 주로 사용해요.
composer require cboden/ratchet
간단한 서버 코드 예시:
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class Chat implements MessageComponentInterface {
public function onOpen(ConnectionInterface $conn) {
echo "새로운 연결: {$conn->resourceId}
";
}
public function onMessage(ConnectionInterface $from, $msg) {
echo "수신한 메시지: $msg
";
$from->send("서버 응답: 잘 받았습니다!");
}
public function onClose(ConnectionInterface $conn) {
echo "연결 종료: {$conn->resourceId}
";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "에러 발생: {$e->getMessage()}
";
}
}
이를
WebSocketServer
에 등록하면 실시간 채팅 서버로 활용할 수 있어요.
7. 웹 소켓의 장점과 단점
✅ 장점
- 실시간 양방향 통신
- HTTP보다 낮은 오버헤드
- 빠른 속도, 낮은 지연 시간
- 서버 푸시 가능
⚠️ 단점
- 연결 유지로 인한 리소스 소모
- 프록시/방화벽 설정이 까다로움
- 브라우저/환경 호환성 체크 필요
- 상태 관리 복잡성
8. 주의사항 체크리스트 ✅
항목 | 주의사항 |
---|---|
보안 | wss:// 로 SSL 적용 권장 |
연결 상태 | onopen , onclose , onerror 등 콜백 관리 철저 |
서버 성능 | 연결 유지 수 증가 시 리소스 관리 필요 |
재접속 로직 | 네트워크 끊김 등을 대비한 자동 재접속 구현 필요 |
메시지 프로토콜 | JSON 형식 권장 (타입/데이터 구조 명확하게) |
마무리하며 😊
이제 웹 소켓이 어떤 역할을 하고, 어떻게 동작하며, 언제 쓰이는지 완벽하게 이해하셨죠?
웹 소켓은 웹 기술의 진화된 형태로,
실시간 웹 앱을 만드는 데 있어서 없어서는 안 될 핵심 기술입니다!
다음 시간에는 웹 소켓을 활용한 실시간 채팅 구현 예제를 함께 해보는 시간을 가져볼게요.
오늘도 한 뼘 더 성장한 자신을 칭찬해 주세요~ 💪📡🔥
감사합니다! 🙌