[SwiftBeam #04] "너 어디 있니?" - 중앙 서버 없이 주변 기기를 찾아내는 로컬 탐색의 원리

2026. 6. 16. 20:13AI Product Building/SwiftBeam

반응형
SwiftBeam Series #04

"로그인 없이
서로를 찾는 방법"

로컬 네트워크 디스커버리의 비밀

📡 🔍 📱 💻

지난 편에서 우리는 '로그인 없는 미니멀리즘' 기획에 대해 이야기했습니다. 하지만 로그인이 없다는 것은 개발자에게 아주 고약한 숙제를 던져줍니다. "사용자가 누구인지 모르는데, 어떻게 전송할 대상을 찾을 것인가?"라는 문제입니다. 서버에 내 위치를 보고하지 않고도 바로 옆에 있는 기기를 마법처럼 찾아내는 기술, '로컬 디스커버리(Local Discovery)'의 원리를 파헤쳐 보겠습니다.

1. 클라우드 중개인이 없는 세상

우리가 흔히 쓰는 카카오톡이나 슬랙은 중앙 서버를 거칩니다. "A가 B에게 파일을 보낸다"는 정보를 서버가 알고 있고, 두 기기를 연결해 주죠. 하지만 SwiftBeam은 인터넷이 끊긴 환경에서도, 혹은 내 파일 정보가 외부 서버에 기록되는 것을 원치 않는 상황에서도 동작해야 했습니다.

중앙 서버를 배제한다는 것은 두 기기가 '같은 동네(로컬 네트워크) 안에서 스스로 통성명'을 해야 한다는 뜻입니다. 마치 깜깜한 운동장에서 서로의 이름표를 보지 못한 채, 목소리만으로 친구를 찾아내는 것과 비슷합니다.

2. mDNS: "저 여기 있어요!"라고 외치는 기술

SwiftBeam의 탐색 엔진에서 가장 핵심적인 역할을 하는 기술은 바로 mDNS(Multicast DNS)입니다. 애플의 봉쥬르(Bonjour)나 리눅스의 아바히(Avahi)가 사용하는 표준 프로토콜이죠.

원리는 생각보다 간단합니다. 앱을 켜는 순간, SwiftBeam은 로컬 네트워크의 모든 기기에게 특정 주소(Multicast Group)로 외칩니다.
"누구 SwiftBeam 서비스(예: _swiftbeam._tcp) 돌리고 있는 사람 있어?"

그러면 주변에서 대기 중이던 다른 기기들이 응답합니다.
"응! 나 여기 있고 내 이름은 '민수의 아이폰'이야. 전송받으려면 53210 포트로 접속해!"

이 과정이 단 몇 밀리초 만에 이루어집니다. 사용자는 로그인 버튼을 누르는 대신, 그저 앱을 켜고 잠시 기다리기만 하면 주변 기기 목록이 화면에 둥실 떠오르는 '마법'을 경험하게 됩니다.

3. 벽에 부딪혔을 때의 플랜 B, UDP 스캔

하지만 세상은 만만치 않습니다. 일부 공공 와이파이나 보안이 강력한 공유기 환경에서는 이 mDNS 패킷을 막아버리기도 합니다. "옆 사람 기기가 안 보여요!"라는 피드백은 개발자에게 가장 가슴 아픈 일이죠.

이를 위해 SwiftBeam은 UDP 브로드캐스팅(Broadcasting)포트 스캐닝이라는 두 번째 카드를 준비했습니다. 네트워크 대역(예: 192.168.0.0/24) 전체에 "안녕?"이라는 아주 가벼운 신호를 뿌려보는 방식입니다. 이 과정은 네트워크 부하를 최소화하면서도, mDNS가 작동하지 않는 열악한 환경에서도 어떻게든 상대방을 찾아내는 끈질긴 생명력을 부여합니다.

4. 찾되, 함부로 보여주지 마라

로컬 탐색에서 가장 중요한 것은 '사용자가 원할 때만 나를 노출하는 것'입니다. SwiftBeam은 앱이 포그라운드(화면에 떠 있는 상태)에 있을 때만 자신의 존재를 알립니다. 앱을 끄는 순간, 내 기기는 로컬 네트워크 상에서 투명 인간이 됩니다.

또한, 단순히 기기를 찾는 것에서 끝나지 않습니다. "누가 나를 찾았는가"를 인지하고, 전송 요청이 오기 전까지는 기기 간에 어떤 데이터도 함부로 오가지 않도록 설계했습니다. 탐색은 '길 찾기'일 뿐, '집 안'으로 들여보내는 것은 철저히 사용자의 승인 절차를 거치게 됩니다.

5. 보이지 않는 연결의 첫 단추

기기를 찾아내는 것은 파일 전송이라는 거대한 퍼즐의 첫 조각입니다. 아무리 빠른 전송 엔진을 가졌어도 상대를 찾지 못하면 무용지물이기 때문입니다. SwiftBeam은 이 '탐색'의 과정에서 발생하는 수많은 예외 상황들을 처리하며, "그냥 켜면 보인다"는 당연한 상식을 구현하기 위해 노력했습니다.

상대를 찾았다면, 이제는 그 상대가 누구인지 멋진 '이름'을 붙여줄 차례입니다. 다음 편에서는 중복 없는 기기 식별과 사용자 친화적인 닉네임 시스템을 어떻게 구축했는지 이야기해보겠습니다.

다음 편 예고: [SwiftBeam #05] "이름표를 붙여줘" - 중복 없는 기기 식별과 닉네임 설정 시스템

SwiftBeam의 기술력이 녹아있는 다양한 앱들이 궁금하신가요?
사용자의 일상을 바꾸는 Team M2Y의 다른 프로젝트들도 확인해 보세요!

Team M2Y 제품 라인업 살펴보기 →
TAGS: 네트워크탐색, mDNS, UDP, Bonjour, SwiftBeam, 플러터, Flutter, 앱개발, P2P통신, 로컬네트워크, 개발일지
반응형