
웹 서비스 개발 – 웹 소켓 – 3 – 웹 소켓 보안
안녕하세요, 활기찬 개발자 여러분 😊
이번 시간에는 웹소켓(WebSocket)을 사용할 때 꼭 알아야 할 중요한 주제,
바로 **웹소켓 보안(Security)**에 대해 자세히 알아보겠습니다!
웹소켓은 브라우저와 서버 간 지속적인 양방향 통신을 가능하게 하는 멋진 기술이지만,
그만큼 보안 위협에도 노출되기 쉬운 구조이기 때문에
적절한 보호 조치를 취하지 않으면 정보 유출, 세션 탈취, 악성 공격의 대상이 될 수 있어요.
마치 대문을 활짝 열어놓고 대화를 나누는 것과 같아서
누가 들어올지, 어떤 말을 던질지 항상 주의해야 하죠!
그럼 하나씩 보안의 방패를 장착해봅시다! 🔐
1. 웹소켓도 HTTPS(SSL/TLS)로 암호화하기
웹소켓 연결 주소는 기본적으로 다음과 같습니다:
- 일반 연결:
ws://example.com/socket - 보안 연결:
wss://example.com/socket
왜 HTTPS처럼 wss://가 필요할까요?
웹소켓도 초기 요청은 HTTP 프로토콜을 통해 시작되기 때문에
HTTPS가 적용되지 않으면 도청이나 중간자 공격(MITM)에 취약합니다.
적용 방법
- 웹서버(Nginx/Apache)에서 HTTPS 설정
- 웹소켓 서버에서도 TLS 인증서 적용
wss://yourdomain.com:443/ws
✅ 반드시 wss 프로토콜을 사용하세요!
🔐 HTTP를 사용한 ws\://는 프로덕션에서는 절대 사용 금지입니다!
2. 인증 및 권한 검사
웹소켓은 한번 연결되면 지속적으로 연결된 상태이기 때문에
초기 연결 시 철저한 인증과 권한 확인이 매우 중요해요.
방법 1: URL 파라미터 또는 토큰 방식
const socket = new WebSocket('wss://example.com/socket?token=abc123');
서버에서는 연결 시 이 토큰을 검증합니다:
// PHP 예시
$token = $_GET['token'];
if (!validateToken($token)) {
// 연결 거부
}
방법 2: JWT(Json Web Token)
클라이언트:
const socket = new WebSocket('wss://example.com/ws?jwt=eyJhbGciOi...');
서버:
$jwt = $_GET['jwt'];
$user = decodeJwt($jwt);
if (!$user) {
// 거절 처리
}
🛡️ 접속 시점에 사용자를 인증하는 건 웹소켓 보안의 1차 관문입니다!
3. Origin 검사
웹소켓 요청의 Origin 헤더를 검사하지 않으면
제3의 사이트에서 악의적인 스크립트가 접속을 시도할 수 있어요.
서버에서 허용된 Origin만 수락하도록 설정하세요.
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
if ($origin !== 'https://yourdomain.com') {
// 연결 차단
}
🧱 마치 우리 집에 들어올 수 있는 사람의 출입처를 제한하는 셈이죠!
4. 세션 관리와 타임아웃 처리
연결이 계속 유지되기 때문에
유휴 상태 세션에 대한 관리도 필요합니다.
- 일정 시간 응답이 없으면 연결 끊기
- PING/PONG 메시지로 keep-alive 상태 체크
- 유저 인증 후 일정 시간 지나면 재인증 유도
// 클라이언트: 30초마다 핑 보내기
setInterval(() => socket.send(JSON.stringify({ type: 'ping' })), 30000);
서버에서는 일정 시간 ping이 없으면 연결을 종료합니다.
5. 메시지 검증 및 필터링
웹소켓은 연결된 후 누구든 원하는 메시지를 보낼 수 있는 구조예요.
즉, 서버에서 무조건 메시지 내용을 검증해야 합니다.
예시
$data = json_decode($message, true);
if (!isset($data['type']) || !in_array($data['type'], ['chat', 'move', 'ping'])) {
// 잘못된 요청, 연결 종료
}
🚫 클라이언트가 악의적으로 조작한 메시지나
의도치 않은 요청을 차단할 수 있어야 합니다.
6. DDoS 및 Flood 방지
공격자가 수백 수천 개의 웹소켓 연결을 동시에 열거나
폭풍처럼 메시지를 보내는 Flood/DDoS 공격에 대비해야 해요.
대응 방안
- IP별 연결 수 제한
- 초당 메시지 전송량 제한
- Rate Limiting 적용
- Cloudflare 같은 보안 게이트웨이 사용
if ($client->messageCount > 10 && $client->lastMessageTime < 1초) {
// DoS 의심, 차단
}
📉 서버 과부하를 막기 위한 속도 조절 장치가 꼭 필요합니다!
7. 민감한 데이터 전송 금지
웹소켓은 쉽게 연결되지만,
암호, 개인정보, 내부 키 등의 민감한 정보는 절대 노출해서는 안 됩니다.
❌ { "type": "auth", "password": "123456" }
✅ { "type": "auth", "token": "jwt_token_here" }
🔑 가능한 한 민감 정보는 최소한의 범위에서, 암호화된 형태로만 전송하세요.
8. 보안 테스트 자동화
개발 후에는 반드시 보안 테스트도 자동화하는 게 좋아요.
- OWASP ZAP 또는 Burp Suite를 이용한 침투 테스트
- 웹소켓 취약점 분석 도구 활용
- 방화벽 및 로깅 시스템 설정
⚠️ 실시간 연결인 만큼 **기록(log)**을 철저히 남겨
이상 행동을 탐지할 수 있도록 해야 합니다.
보안 체크리스트 ✅
| 항목 | 설명 |
|---|---|
wss:// 사용 |
SSL/TLS를 통한 암호화된 통신 필수 |
| 인증 토큰 사용 | URL 또는 헤더로 사용자 인증 처리 |
| Origin 검사 | 허용된 Origin만 연결 허용 |
| 메시지 검증 | JSON 구조와 타입 검증, SQL Injection 방어 |
| Flood/DDoS 차단 | IP별 제한, 메시지 속도 제한 |
| 민감 정보 차단 | 비밀번호 등은 절대 평문 전송 금지 |
| 로그 기록 | 접속 및 메시지 기록 저장 |
| 주기적 ping/pong | 유휴 연결 종료 및 타임아웃 설정 |
마무리하며 😊
웹소켓은 빠르고 실시간성이 뛰어난 통신 기술이지만,
그만큼 보안 위협도 함께 따라오는 양날의 검과 같아요.
오늘 배운 보안 전략들을 적용하면
보다 안전하고 신뢰성 높은 실시간 웹 서비스를 구축할 수 있습니다.
“빠르다고 무조건 좋은 건 아니에요! 안전해야 진짜 빠른 거죠!”
라는 마음으로, 여러분의 웹소켓을 더 안전하게 만들어보세요!
다음 시간에는 웹소켓을 이용한 실시간 채팅 구현을 함께 만들어볼게요.
오늘도 즐코하시고, 보안은 타협하지 마세요! 🔐🚀💻
