35P by xguru 9일전 | ★ favorite | 댓글 8개
  • 몇 줄의 코드만으로 서버 없이 서로 연동되는 멀티 플레이어 웹앱을 구현 가능하게 해주는 라이브러리
  • 브라우저 WebRTC를 기반으로, 공개 네트워크를 신호 교환(시그널링) 채널로 활용해 P2P 매칭과 통신을 자동화
    • BitTorrent, Nostr, MQTT, IPFS, Supabase, Firebase 중 하나를 선택해 서버 없이 피어 발견을 수행
    • 시그널링 이후의 앱 데이터는 중간 매체를 거치지 않고 P2P + E2E 암호화로 전송됨
  • Rooms/브로드캐스팅, 자동 직렬화, 대용량 데이터의 청킹/스로틀링, 진행률 이벤트, 세션 데이터 암호화, 스트림 메타데이터 등 고수준 추상화 제공
  • 브라우저뿐 아니라 Node/Deno/Bun에서도 동작하며, TURN 서버 설정, React 훅, 서버 사이드 실행 등 실전 기능을 지원
  • 퍼블릭 인프라를 무설정으로 활용하는 방식으로 다양한 실험과 프로토타이핑에 쓰기 좋음

TURN 서버는 조상님이 제공해주나요?

'stun:stun.cloudflare.com:3478' 가 소스에 박혀있네요

stun 말고 turn 요.
stun은 단순 stun 기준 넌 누구다 알려주는 정도라 공개된 서버가 좀 있지만
turn 은 트래픽을 릴레이해줘야해서(비싸서) 돈내고쓰던가 자체 구축을 하던가 해야해요.
예) https://github.com/coturn/coturn
요런친구요.

stun 만으로 통신이 가능한 경우가 많기야하지만 단순하게 "된다" 라고 하기에는.....
되......긴 되는대..... 쓰읍.. 라는 느낌이내요.

p2p 매칭이면 turn 필요 없지 않나요

webrtc에서 말씀하시는 "p2p 매칭"의 의도에 따라 다를 것 같아요

  1. 상호 UDP 로 패킷 통신이 가능한 상태
  2. 상호 stun 이 알려주는 주소만 알고있는 상태

1번이면 말씀하신대로 turn 이 필요 없어요
2번에서도 상황이 좋아서 상호 UDP 통신이 성공한 상태라면 turn 이 필요 없어요.

2번에서 상호 UDP 로 패킷 통신이 실패한 상태에서 turn 이 필요해요.

실패하는 요인은

  • 피어가 symmetric nat 뒤에 있거나 해서 stun 이 알아낸 주소(의 포트)를 사용할 수 없거나
  • 네트워크 중간 어디든 웹 트래픽만 허용하거나(80,443)
  • 네트워크 중간 어디든 UDP 가 막혀있거나
  • 한쪽은 ipv4 만 쓰고 한쪽은 ipv6 만 쓰거나
  • 등등?

에는 turn 을 써야합니다.

(ipv4 only <-> ipv6 only 가 안된다는건 기억 검증하다가 처음 알았내요)

네 그러니까 2번이요. '서버 없이 서로 연동', '라이브러리' 라고 했는데 너무 많은걸 기대하시는게 아니신지...

말씀하시고자 하는 부분이 어떤 부분이에요?

  1. stun 에서 알려주는 주소(+포트) 만으로 연동이 가능하므로 turn 서버는 필요없다. 따라서 "서버 없이 서로 연동" 표현이 텍스트 그대로 맞다.
    -> 요거면 제가 아는게 옛날꺼인가보내요. 제가 알고있는(공유드린) 내용 이후로 상황이 바뀐 부분을 알려주시면 감사하겠습니다~!
  2. turn 서버는 필요하지만 라이브러리니까 그정도는 봐주자.
    -> skageektp님이 말씀하신게 맞아요. 라이브러리니까 그 정도는 봐줄 수도 있습니다. 제가 민감했어요.

저는
3. 제대로 쓰려면 stun 만으로는 부족하고 turn이 필요한대 과장이 심하내~
를 표현중이였습니다.

1번, 2번 설명에 대해서

  1. 상호 UDP 로 패킷 통신이 가능한 상태 -> 상호 피어가 UDP 로 패킷 통신이 가능한 상태
  2. 상호 stun 이 알려주는 주소만 알고있는 상태 -> 상호 피어가 stun 이 알려주는 주소만 알고있는 상태

로 정정하겠습니다. 원글에서는 오해의 여지가 있내요.