피드로 돌아가기
I Built a Private Voice Chat App Because I Was Done Giving Discord My Conversations
Dev.toDev.to
Backend

엔지니어가 WebRTC와 Socket.io를 활용한 자체 호스팅 음성 채팅 앱 Squawk을 구축해 중앙화된 Discord 서버를 거치지 않는 P2P 통신 구현

I Built a Private Voice Chat App Because I Was Done Giving Discord My Conversations

shyn2026년 3월 29일4intermediate

Context

Discord를 통해 진행되는 모든 대화(음성, 메시지, 계획 공유)가 Discord 서버에 저장되고 있으며, 개인이 데이터 가시성과 제어권을 가질 수 없다는 점이 문제였다.

Technical Solution

  • WebRTC 피어투피어 음성 채팅 구현: 오디오가 서버를 거치지 않고 클라이언트 간 직접 전송되도록 설계
  • Socket.io를 시그널링 서버로 활용: 피어 간 연결 핸드셰이크(Offer, Answer, ICE Candidate) 중개
  • Tailscale 기반 프라이빗 VPN으로 네트워크 접근 제한: VPN을 통하지 않으면 서버 접근 불가능하도록 구성
  • WebRTC 신호 릴레이 시 송수신자 검증 추가: 같은 방(Room)에 속한 클라이언트끼리만 신호 교환 허용
  • Docker Compose 기반 배포: git clone과 docker compose up -d 두 명령으로 실행 가능하도록 구성
  • 보안 강화 사항 적용: 소켓당 Rate Limiting(30 events/5초), 입력 검증, Prototype Pollution 방지, CORS 제한, 보안 헤더(CSP, X-Frame-Options, Referrer-Policy), Non-root Docker 사용자

Key Takeaway

자체 호스팅 모델에서도 VPN 뒤에 있다는 가정만으로는 부족하며, 신호 릴레이 검증, Rate Limiting, 입력 검증 같은 명시적 보안 계층이 필수이다. 또한 권한 시스템 같은 단순해 보이는 기능도 실제 운영 중에 소유자 이전, 중복 이름 충돌 같은 엣지 케이스가 발생하므로 실제 사용을 통한 검증이 필수다.


자체 호스팅 소규모 팀 협업 도구를 구축할 때 WebRTC 시그널링 서버(Socket.io 등)에서 피어 식별자 검증을 반드시 명시적으로 구현해야 하며, VPN 보호만으로 충분하다고 가정하지 말고 Rate Limiting, CORS, 보안 헤더, 입력 검증을 기본으로 적용하면 중앙화 서비스 대비 프라이버시를 확보하면서도 기본적인 보안 수준을 유지할 수 있다.

원문 읽기