1. 페어링: 신뢰는 Mac 화면에서 시작됩니다
- 각 기기는 자체 P-256 키 쌍을 가집니다. iPhone의 개인 키는 Secure Enclave 안에서 생성되며 내보낼 수 없습니다. Secure Enclave가 없는 기기에서는 해당 기기로 제한된 키체인에 저장됩니다. Mac의 개인 키는 사용자 계정만 읽을 수 있는 파일에 저장됩니다.
- Mac의 ID는 공개 키에서 파생됩니다(키의 SHA-256 값 중 처음 16바이트). 랑데부 서비스는 Mac에 서명으로 소유를 증명하게 하므로, 누구도 그 ID를 선점하거나 사칭할 수 없습니다.
- 페어링 QR 코드는 오직 Mac 화면에만 나타납니다. 여기에는 Mac의 ID, 공개 키 지문, 그리고 5분 동안 유효하고 한 번만 사용할 수 있는 32바이트 페어링 키가 들어 있습니다.
- 스캔한 뒤 iPhone은 페어링 키로 자신의 키 지문에 대한 HMAC-SHA256을 계산합니다. 이것으로 코드를 실제로 봤다는 것을 증명하고 그 증명을 자신의 공개 키에 묶으므로, 중간에서 다른 키로 바꿔치기할 수 없습니다. Mac은 증명을 확인하고 iPhone의 공개 키를 기록합니다.
- 그 후로 양쪽은 서로의 공개 키만 받아들입니다. 피싱이나 크리덴셜 스터핑을 당할 비밀번호도 계정도 없으며, iPhone을 하나 더 추가하려면 누군가 Mac 앞에서 코드를 스캔해야 합니다.
2. 연결할 때마다 일어나는 일
- 먼저 Face ID. 연결할 때마다 iPhone은 먼저 Face ID나 기기 암호를 요구하며, 백그라운드에 5분 넘게 있다가 돌아올 때도 다시 요구합니다.
- 서명된 요청. iPhone은 Secure Enclave 키로 요청에 서명합니다. 요청에는 타임스탬프, 무작위 논스, 일회용 연결 자격 증명, iPhone의 네트워크 주소가 들어 있습니다. 랑데부 서비스는 이 요청을 Mac에 전달합니다. 주소도 서명 대상에 포함되므로 서비스가 Mac을 다른 곳으로 유도할 수 없습니다.
- Mac이 결정합니다. Mac은 페어링된 키, 2분 이내의 타임스탬프, 한 번도 본 적 없는 논스만 받아들이므로 이전 요청을 재전송할 수 없습니다. 그런 다음에야 UDP 포트를 열고, 30초 안에 세션이 시작되지 않으면 다시 닫습니다.
- 경로 찾기. 양쪽은 로컬 네트워크, STUN 홀 펀칭으로 라우터를 넘는 직접 경로, Cloudflare TURN 중계를 동시에 시도합니다. 0.6초 안에 직접 경로가 연결되면 그 경로를 쓰고, 그렇지 않으면 가장 먼저 연결된 경로를 사용하며, 이후 10초 안에 직접 경로가 나타나면 DuoDesk가 그쪽으로 옮깁니다. 중계 자격 증명은 Mac이 수락한 뒤에만 발급됩니다.
- 암호화된 세션. 그 경로 위에서 두 기기는 QUIC 연결(TLS 1.3)을 엽니다. 각자 인증서를 제시하고, 상대의 공개 키가 페어링 때 기록한 키와 정확히 일치하는지 확인합니다. 일치하지 않으면 연결을 끊습니다.
- 자동 복구. 각 세션은 예비 중계 경로를 준비해 두고, 기본 경로에서 약 1초 동안 응답이 없으면 그쪽으로 전환합니다. 네트워크가 바뀌면 앱이 스스로 다시 연결하며, 그동안에는 입력이 전송되지 않습니다.
3. 서버가 침해된다면
DuoDesk는 랑데부 서비스와 중계가 이미 침해되었다는 가정 아래 설계되었습니다. 암호화와 신원 확인은 iPhone과 Mac 사이에서만 이루어지며, 서버에는 세션을 해독하거나 기기를 사칭할 수 있는 키가 전혀 없습니다.
할 수 없는 일
- 화면, 입력, 클립보드 보기: 세션은 두 기기에만 존재하는 키로 종단 간 암호화됩니다.
- Mac이나 iPhone 사칭: 양쪽 모두 페어링 때 기록한 공개 키를 확인합니다.
- Mac에 새 iPhone 페어링: Mac 화면에만 표시되는 일회용 키가 필요합니다.
- 이전 연결 요청 재전송: 모든 요청에 타임스탬프와 일회용 논스가 들어 있습니다.
최악의 경우 할 수 있는 일
- 연결 실패시키기.
- 어떤 IP 주소가 언제 어느 Mac에 연결했는지 알아내기.
- 스탠바이 패널에 가짜 작업 상태 표시하기: 실시간 현황 푸시는 서비스를 거쳐 Apple로 전달되며, 푸시 키는 서비스가 가지고 있습니다.
평상시 서비스가 보고 보관하는 내용은 개인정보 처리방침에 나와 있습니다.
4. 랑데부 서비스에 허용된 일
- Cloudflare Workers에서 실행되며, Mac마다 Durable Object가 하나씩 있습니다. Mac은 서비스로 나가는 연결만 맺고 서명으로 등록합니다. 서비스는 페어링 키나 기기의 개인 키가 필요하지 않으며, 받는 일도 없습니다.
- 연결 요청은 그대로 Mac에 전달되며, 서비스가 읽는 필드는 푸시 토큰뿐입니다.
- 중계(TURN) 자격 증명은 Mac이 연결을 수락한 뒤에만 발급되며 12시간 후 만료됩니다.
- 푸시 중계는 실시간 현황 푸시만 통과시키며, 그 Mac에 연결한 적이 있는 iPhone으로만(서비스는 각 토큰의 해시만 보관), 그리고 그 Mac이 만든 채널에서만 허용합니다. 푸시 키는 Mac 앱에 포함되어 배포되지 않고 서비스에 남아 있습니다.
- 악용 방지 한도: 한 IP 주소에서 한 Mac으로 분당 최대 30건의 연결 요청, Mac당 최대 8개의 대기 중인 연결, 최대 8 KB의 메시지.
5. Mac의 보호 장치
- 인터넷에 열린 포트 없음. 평소 Mac에는 랑데부 서비스로 나가는 연결 하나만 있습니다. 세션용 QUIC 리스너는 루프백 주소에 바인딩되어 있으며, 외부로 향하는 UDP 포트는 검증된 요청이 있을 때만 열립니다.
- 프라이버시 화면. 연결되어 있는 동안 DuoDesk는 물리 디스플레이의 감마 테이블을 검은색으로 설정합니다. 감마는 화면이 합성된 뒤에 적용되므로 iPhone으로 전송되는 화면에는 영향이 없습니다. 또한 DuoDesk Host가 종료되거나 충돌하면 macOS가 감마를 스스로 복원하므로 화면이 검은 상태로 남을 수 없습니다.
- 연결 해제 시 잠금, 유휴 시간 초과. 연결을 해제하면 DuoDesk가 시스템의 ‘화면 잠금’ 명령과 같은 방식으로 Mac을 즉시 잠글 수 있습니다. 15분 동안 입력이 없으면 세션이 스스로 종료됩니다.
- 눈에 보이는 연결. 누군가 연결되어 있으면 메뉴 막대 아이콘이 바뀌며, 모든 연결과 연결 해제, 그 이유가 Mac의 로컬 연결 기록에 남습니다.
- 서명 및 공증. DuoDesk Host는 Developer ID로 서명되고 Apple의 공증을 받았으며 Hardened Runtime으로 실행됩니다. 입력을 실행하려면 손쉬운 사용 권한이 필요한데, 샌드박스 앱은 이 권한을 가질 수 없으므로 Mac App Store에는 없습니다. 대신 이 웹사이트에서 다운로드합니다.
6. 화면, 입력, 측정 결과
- 화면은 ScreenCaptureKit으로 최대 60 fps로 캡처되며, 변화가 없을 때는 프레임을 보내지 않습니다. 인코딩은 VideoToolbox가 하드웨어로 H.264 또는 HEVC로 수행하며, 저지연 전송률 제어를 사용하고, B 프레임을 쓰지 않으며, 비트레이트는 네트워크에 맞춰 조정됩니다.
- Mac은 iPhone 해상도에 맞는 가상 디스플레이를 추가할 수 있으며, 이 디스플레이는 크기 조정 없이 1:1로 표시됩니다.
- 포인터는 iPhone에 즉시 그려지고 나중에 Mac과 맞춰지므로 네트워크를 기다리는 일이 없습니다. iPhone은 120 Hz로 화면을 그립니다.
측정 결과
| 환경 | 경로 | 왕복 시간(중앙값) | 처리량 |
|---|---|---|---|
| Mac은 공유 오피스 Wi-Fi, iPhone은 5G | 홀 펀칭으로 직접 연결, 약 0.1초 만에 열림 | 30 ms | 58 Mbps |
| 둘 다 같은 공유 오피스 Wi-Fi(기기끼리 서로 접근 불가) | Cloudflare 중계, 약 1초 후 | 18 ms | 69 Mbps |
2026년 10월 싱가포르에서 DuoDesk의 전송 계층(홀 펀칭 또는 중계를 통한 QUIC)으로 측정했습니다. 화면 스트림의 기본값은 12 Mbps입니다. 결과는 네트워크 환경에 따라 다릅니다.
7. 알려진 제한 사항
- Mac에는 로그인된 사용자가 있어야 합니다. 화면이 잠겨 있는 것은 괜찮습니다. FileVault를 켠 Mac은 재시동 후 네트워크가 연결되기 전에 잠금 해제 화면에서 멈추며, 이 상태에서는 어떤 원격 도구도 접근할 수 없습니다.
- DuoDesk는 UDP로 연결하므로, UDP를 완전히 차단하는 네트워크에서는 작동하지 않습니다.
- macOS는 약 30일마다 화면 기록을 다시 확인하도록 요청합니다. 이 때문에 화면이 가려지면 누군가 Mac에서 ‘허용’을 클릭해야 합니다.
- 랑데부 서비스는 연결 메타데이터를 볼 수 있습니다(3절 참조).