브라우저 오디오 캡처 제약 (W3C 보안 모델)
브라우저 오디오 캡처 제약
한 줄 정의
브라우저는 W3C 보안 모델상 스피커 출력에 직접 접근 불가. 상대방 음성 캡처는
getDisplayMedia필수.
핵심 제약 (API별)
| API | 캡처 대상 | 화면공유 팝업 | 제약 |
|---|---|---|---|
getUserMedia({ audio }) | 마이크 입력만 | 없음 | 스피커 출력 접근 불가 |
getDisplayMedia({ audio }) | 선택한 탭/화면 오디오 | 필수 | video: true 필수 |
getDisplayMedia({ audio: { systemAudio: 'include' } }) | 시스템 전체 오디오 | 필수 | Chrome/Edge + macOS 14.2+ only |
왜 스피커에 직접 접근 안 되는가: 스피커 출력은 “컴퓨터의 모든 소리”라 도청 위험 → W3C가 화면공유 UI 강제로 사용자가 직접 범위 선택하게 함. AudioOutputContext 제안 있었으나 보안 이유로 미채택.
이어폰 사용 시 주의
getUserMedia만 쓰면 이어폰 사용자의 상대방 음성 캡처 불가 (이어폰으로 나가서 마이크에 안 잡힘)getDisplayMedia필수: 음소거해도 오디오 스트림은 캡처됨
채택된 패턴 (lattice AI 회의록)
// 마이크 + 시스템 오디오 합성
getUserMedia({ audio: true }) // 마이크
getDisplayMedia({
video: true, // API 제약상 필수
audio: { systemAudio: 'include' } // 시스템 오디오
})
// → 비디오 트랙은 즉시 stop()
대안 (화면공유 팝업이 불편할 때)
- Chrome Extension (
chrome.tabCapture) — 팝업 없이 탭 오디오, 별도 배포 필요 - Electron 앱 — OS 레벨 CoreAudio/WASAPI 접근 가능
- 봇 참가 방식 (Otter.ai 등) — 서버에서 수신, 클라이언트 무관
Relationships
related_to ../concepts/stt-pipeline-design
applies_to ../entities/lattice