모든 디스코드 (새 탭에서 열림)
Discord는 음성·영상 통화의 표준을 DAVE 기반 종단간 암호화(E2EE)로 전환하며, 브라우저·콘솔·Social SDK까지 지원 범위를 확대한다. 2026년 3월 1일부터는 DAVE를 지원하지 않는 클라이언트와 앱이 Discord 통화에 참여할 수 없다. 브라우저 환경에서는 WebRTC Encoded Transform API, Web Worker, WebAssembly를 조합해 보안성과 성능을 확보했다.
DAVE의 전 플랫폼 확대
- DAVE는 Discord의 음성·영상 통화에 E2EE를 제공하는 프로토콜이다.
- 이미 매일 수천만 건의 통화에 적용되고 있으며, 이번 작업으로 다음 플랫폼까지 지원한다.
- 웹 브라우저
- 콘솔
- Discord Social SDK
- 2026년 3월 1일부터 비-DAVE 클라이언트는 음성 채널과 영상 통화에 참여할 수 없다.
- 이는 기존 실험적 도입을 종료하고 DAVE를 Discord 통화의 기본 보안 표준으로 삼는 단계다.
WebRTC Encoded Transform API 활용
- 브라우저에서는 WebRTC 미디어 파이프라인 내부의 인코딩 전후 지점에서 오디오·영상 프레임을 암호화한다.
- Encoded Transform API를 사용하면 브라우저의 코덱과 WebRTC 기능을 유지하면서 DAVE 암호화를 삽입할 수 있다.
- Discord는 H.265, AV1 등 최신 코덱의 하드웨어 지원도 활용할 수 있도록 설계했다.
- 더 높은 화질
- 더 효율적인 대역폭 사용
- 플랫폼별 코덱 지원 유지
Firefox에서 발견한 교착 상태 문제
- 초기 테스트에서는 Firefox에서도 DAVE가 정상 작동했지만, 실제 Discord 통화에서는 암호화용 Web Worker가 프레임을 받지 못했다.
- 원인은 Firefox의
FrameTransformerProxy가 비디오 데이터가 너무 일찍 전달될 때 교착 상태에 빠지는 엣지 케이스였다. - 지연 처리를 위해 저장된 비디오 데이터가 뮤텍스를 사용했으며, 변환 작업이 같은 뮤텍스에 재진입하면서 재귀적 교착이 발생했다.
- Discord 팀은 Firefox를 직접 빌드해 브라우저 수준에서 문제를 추적하고 Mozilla에 패치를 제출했다.
- 수정 사항은 Firefox 142.0에 포함되며, DAVE를 사용하려면 최소 Firefox 142.0이 필요하다.
Web Worker 기반 암호화 구조
- 각 Discord 연결은 미디어 암호화와 복호화를 담당하는 전용 Web Worker를 사용한다.
- 일반 통화에서는 다음 미디어를 처리한다.
- 통화 오디오
- 카메라 영상
- 화면 공유나 게임 스트림은 오디오와 영상별로 별도의 Worker가 처리한다.
- 각 WebRTC 스트림에는 고유한 SSRC가 있으며, DAVE는 SSRC를 기준으로 프레임에 사용할 대칭키를 식별한다.
- Worker는 다음과 같은 최소한의 상태만 유지한다.
- 송수신 오디오·영상 정보
- SSRC와 사용자 ID의 매핑
- 각 사용자에 대한 암호화 키
메인 스레드와 암호화 Worker의 역할 분리
- 메인 JavaScript 스레드는 WebRTC 연결과 참여자, 미디어 트랙을 관리한다.
- 사용자 입장·퇴장 시 필요한 MLS(Message Layer Security) 협상도 메인 스레드에서 수행한다.
- MLS 그룹 변경을 Worker에서 처리하지 않기 때문에, Worker가 프레임 암호화를 끝낼 때까지 메인 스레드가 대기할 필요가 없다.
- MLS 상태가 바뀌면 메인 스레드가 Worker에 비동기 메시지를 보내 암호화 상태를 갱신한다.
- 이 구조는 멤버 변경 중에도 미디어 암호화를 계속 수행해 통화 지연을 줄인다.
검증된 C++ 구현의 WebAssembly 재사용
- Discord는 데스크톱과 모바일에서 이미 대규모로 검증된 DAVE C++ 코드베이스를 WebAssembly로 컴파일했다.
- 동일한 암호화 구현을 여러 플랫폼에서 재사용하면 플랫폼별 재구현으로 인한 보안 취약점과 동작 차이를 줄일 수 있다.
- WebRTC 패킷에는 라우팅과 패킷 처리를 위해 일부 메타데이터가 평문으로 남아 있어야 한다.
- 암호화된 데이터가 WebRTC 패킷화기, SFU, 역패킷화기를 거치는 동안 변경되면 복호화가 실패한다.
- 따라서 프레임을 바이트 단위로 파싱하고 필요한 부분만 선택적으로 암호화해야 한다.
- 이 작업은 JavaScript로 직접 구현하기에는 복잡하고 오류 가능성이 높지만, WebAssembly를 사용하면 네이티브에 가까운 성능으로 처리할 수 있다.
WebAssembly와 SubtleCrypto의 성능 절충
- WebAssembly는 프레임 파싱과 선택적 암호화 로직을 효율적으로 처리한다.
- 반면 암호화 연산 자체는 브라우저의 네이티브 API인
SubtleCrypto보다 약간 느릴 수 있다. - Discord의 벤치마크는 두 방식의 성능 차이가 단순하지 않으며, 실제 병목이 암호화 연산뿐 아니라 프레임 처리와 데이터 이동에도 있음을 시사한다.
- 최종 선택은 단순한 최고 암호화 속도보다 다음 요소를 종합한 결과다.
- 검증된 코드 재사용
- 플랫폼 간 동작 일관성
- 프레임 파싱 성능
- 보안 로직의 유지보수성
실용적인 권장 사항
- Discord 통화에 계속 참여하려면 2026년 3월 1일 전까지 DAVE 지원 클라이언트로 업데이트해야 한다.
- Firefox 사용자는 최소 Firefox 142.0 이상으로 업그레이드해야 한다.
- Discord용 앱이나 Social SDK를 개발 중이라면 DAVE 지원 여부를 확인하고, 비-E2EE 통화에 의존하는 구현을 제거해야 한다.