Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 문서는 애플리케이션 APP가 실행 중인 탭을 CAPTR이 화면 캡처하고 있는 경우, 애플리케이션 APP가 다른 애플리케이션 CAPTR에 특정 정보를 노출하도록 옵트인할 수 있는 메커니즘을 제안합니다. 이는 탭 캡처 또는 창 캡처를 위한 메커니즘을 설명합니다.
이 절은 이 문서가 공개된 시점에서의 문서 상태를 설명합니다. 현재 W3C 공개 문서 목록과 이 기술 보고서의 최신 개정판은 https://www.w3.org/TR/의 W3C 기술 보고서 색인에서 확인할 수 있습니다.
이 문서는 완전하지 않습니다.
이 문서는 Web Real-Time Communications Working Group에서 Recommendation 트랙을 사용하여 작업 초안으로 공개했습니다.
작업 초안으로 공개되었다고 해서 W3C와 그 회원들이 보증한다는 의미는 아닙니다.
이 문서는 초안 문서이며 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있습니다. 진행 중인 작업 이외의 것으로 이 문서를 인용하는 것은 적절하지 않습니다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성했습니다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지합니다. 해당 페이지에는 특허를 공개하기 위한 지침도 포함되어 있습니다. 본인이 필수 청구항을 포함한다고 믿는 특허에 대해 실제 지식을 가진 개인은 W3C 특허 정책 6절에 따라 해당 정보를 공개해야 합니다.
이 문서는 2023년 11월 3일 W3C 프로세스 문서의 적용을 받습니다.
비규범으로 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 도표, 예제 및 참고는 비규범입니다. 이 명세의 그 밖의 모든 내용은 규범입니다.
이 문서의 핵심 단어 MUST 및 MUST NOT은 여기 보이는 것처럼 모두 대문자로 나타나는 경우에, 그리고 오직 그 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석됩니다.
한 탭에서 실행 중인 웹 애플리케이션을 생각해 보겠습니다. 이를 "main_app"이라고 부르겠습니다. main_app이 getDisplayMedia를 호출하고 사용자가 다음 중 하나를 선택한다고 가정합니다:
다음 사항에 유의하십시오:
이 두 특성은 일반적인 경우에는 바람직하지만, 브라우저가 애플리케이션이 그 간극을 메우고 연결을 가능하게 하도록 옵트인하는 것을 허용하고자 하는 정당한 사용 사례가 존재합니다.
우리는 일반적인 경우를 이전과 같이 유지하면서, 정당한 사용 사례를 가능하게 하고자 합니다.
협업 프레젠테이션 소프트웨어와 화상 회의 소프트웨어를 생각해 보겠습니다. 사용자가 VC 세션에 있다고 가정합니다. 사용자는 프레젠테이션 공유를 시작합니다. 두 애플리케이션 모두 VC 앱이 슬라이드 세션을 캡처하고 있다는 사실, 어떤 애플리케이션인지, 나아가 어떤 세션인지까지 발견할 수 있게 하는 데 관심이 있습니다. 그러면 VC 애플리케이션은 사용자에게 슬라이드를 넘기는 컨트롤을 노출할 수 있습니다. 사용자가 그 컨트롤을 클릭하면, VC 앱은 프레젠테이션 앱에 메시지를 보내 슬라이드 넘기기, 프레젠테이션 모드 진입/종료 등의 작업을 요청할 수 있습니다.
이러한 메시지를 전송하는 수단은 이 문서의 범위를 벗어납니다. 몇 가지 선택지는 다음과 같습니다:
캡처하는 애플리케이션은 사용자가 어떤 애플리케이션을 캡처하는 경향이 있는지에 대한 통계를 수집하고자 하는 경우가 많습니다. 예를 들어 VC 애플리케이션은 사용자가 특정 제공자의 프레젠테이션 애플리케이션, Wikipedia, CNN 등을 얼마나 자주 공유하는지 알고자 합니다. 이러한 정보를 수집하면 위에서 설명한 것과 같은 새로운 협업을 도입하여 사용자에 대한 서비스를 개선하는 데 사용할 수 있습니다.
사용자는 때때로 잘못된 탭을 공유하도록 선택합니다. 때로는 실수로 share-this-tab-instead 버튼을 클릭하여 잘못된 탭 공유로 전환하기도 합니다. 선의의 애플리케이션은 사용자가 실수했을 수 있다고 판단하면, 사용자를 보호하기 위해 앱 내부 대화상자를 표시하여 재확인을 요청할 수 있습니다.
이 사용 사례는 #3의 하위 사례이지만, 그 중요성 때문에 자체 절을 둘 가치가 있습니다. "거울의 방" 효과는 사용자가 VC 통화가 이루어지는 탭을 공유하기로 선택할 때 발생합니다. 자기 캡처를 감지하면 VC 애플리케이션은 캡처된 스트림을 사용자에게 다시 표시하지 않음으로써, 우려되는 이 효과를 피할 수 있습니다.
capture-handle 메커니즘은 두 가지 주요 부분, 즉 캡처되는 쪽과 캡처하는 쪽으로 구성됩니다.
setCaptureHandleConfig를
호출하여 정보 노출에 옵트인합니다.
CaptureHandle로 읽습니다.
애플리케이션은 캡처하는 애플리케이션에 정보를 노출하는 것이 허용됩니다. 일반적으로
자신이 실제로 캡처되고 있는지 알기 전에 그렇게 합니다. 사용되는 메커니즘은 적절한
CaptureHandleConfig와 함께
setCaptureHandleConfig를
호출하는 것입니다.
CaptureHandleConfig 딕셔너리는 캡처되는 애플리케이션이 어떤 정보를 노출하려는지, 그리고 어떤 애플리케이션에 그 정보를 노출할 의향이 있는지를 사용자 에이전트에 지시하는 데 사용됩니다.
WebIDLdictionary CaptureHandleConfig {
boolean exposeOrigin = false;
DOMString handle = "";
sequence<DOMString> permittedOrigins = [];
};
exposeOrigin
true이면, 사용자 에이전트는 캡처되는 애플리케이션의 origin을
CaptureHandle의
origin 필드를 통해
노출해야 MUST 합니다. false이면, 사용자 에이전트는
캡처되는 애플리케이션의 origin을 노출해서는 MUST NOT 안 됩니다.
handle
사용자 에이전트는 이 값을 handle로 노출해야
MUST 합니다.
참고: 이 필드의 값은 1024개의 16비트 문자로 제한됩니다. 이 제한은
setCaptureHandleConfig에서
더 자세히 명세됩니다.
permittedOrigins
이 필드의 유효한 값은 다음을 포함합니다:
"*"을 가진 목록
permittedOrigins가
단일 항목
"*"으로 구성되어 있으면, CaptureHandle은 모든 캡처하는 쪽에서
관찰 가능합니다.
그렇지 않으면, CaptureHandle은
자신의 origin이 permittedOrigins에
나열된 캡처하는 쪽에게만 관찰 가능합니다.
MediaDevices는
setCaptureHandleConfig라는
메서드로 확장되며, 이 메서드는 CaptureHandleConfig
객체를 받습니다. 이 메서드를 호출함으로써 애플리케이션은 캡처하는 애플리케이션이
어떤 정보를 관찰할 수 있도록 허용하는지 사용자 에이전트에 알립니다.
setCaptureHandleConfig가
한 번보다 많이 호출될 경우 어떻게 동작해야 하는지에 대해서는 아직 합의가 없습니다.
이는 그 자체가 cross-origin 메시징 채널로 오용될 수 있다는 우려 때문입니다. 이는
이슈 #11에서
논의 중입니다.
WebIDLpartial interface MediaDevices {
undefined setCaptureHandleConfig(optional CaptureHandleConfig config = {});
};
setCaptureHandleConfig
사용자 에이전트는 다음 검증을 실행해야 MUST 합니다:
handle이
유효하지 않은 값으로 설정되어 있으면, 사용자 에이전트는
TypeError를
발생시켜 거부해야 MUST 합니다.
permittedOrigins가
유효하지 않은 값으로 설정되어 있으면, 사용자 에이전트는
NotSupportedError를
발생시켜 거부해야 MUST 합니다.
setCaptureHandleConfig()
호출이 최상위
브라우징 컨텍스트에서 이루어진 것이 아니면, 사용자 에이전트는
InvalidStateError를
발생시켜 거부해야 MUST 합니다.
모든 검증을 통과하면, 사용자 에이전트는 새 config를 받아들여야
MUST 합니다. 사용자 에이전트는
setCaptureHandleConfig에
대한 이전 호출을 모두 잊어야 MUST 하며, 이제부터
애플리케이션의 CaptureHandleConfig는
config입니다.
관찰 가능한 CaptureHandle은 모든 캡처하는 애플리케이션에
대해 다시 평가됩니다.
CaptureHandle이
setCaptureHandleConfig
호출 전과 다른 모든 캡처하는 애플리케이션에 대해, 사용자 에이전트는
capturehandlechange라는 이름의
이벤트를 발화해야
MUST 합니다.
getCaptureHandle이
호출될 때마다 새 관찰 가능한 CaptureHandle을 보고해야
MUST 합니다.
트랙의 CaptureHandle을 관찰하도록
허용된
캡처하는 애플리케이션은 그것을 읽는 두 가지 방법을 가집니다.
getCaptureHandle이
반환하는 현재 값을 읽습니다.EventListener를
oncapturehandlechange에
등록합니다.
사용자 에이전트는 캡처되는 애플리케이션에 대한 정보를
CaptureHandle 딕셔너리를 통해
캡처하는 애플리케이션에 노출합니다. CaptureHandle 객체는 그것을
관찰하도록 허용되지 않은 캡처하는 애플리케이션에
제공되어서는 MUST NOT 안 됩니다.
WebIDLdictionary CaptureHandle {
DOMString origin;
DOMString handle;
};
origin
캡처되는 애플리케이션이 (exposeOrigin을 true로
설정하여) 자신의 origin 노출에 옵트인했다면, 사용자 에이전트는
origin을 캡처되는 애플리케이션의
origin으로 설정해야 MUST 합니다. 그렇지 않으면
origin은 설정되지 않습니다.
handle
사용자 에이전트는 이 필드를 캡처되는 애플리케이션이
handle에 설정한 값으로
설정해야 MUST 합니다.
MediaStreamTrack을
getCaptureHandle이라는
메서드로 확장합니다. MediaStreamTrack이
화면 캡처에서 파생된 비디오 트랙이면,
getCaptureHandle은 최신의
관찰 가능한 CaptureHandle을 반환합니다.
그렇지 않으면 null을 반환합니다.
getCaptureHandle이
MediaStreamTrack에
속해야 하는지, 아니면 모든 트랙에 영향을 미치는 메시징과 단일 트랙의 소비를
분리하기 위해 복제 가능하지도
않고 전송
가능하지도
않은 전용 컨트롤러 객체에 속해야 하는지에 대해서는 아직 합의가 없습니다. 이는
이슈 #12에서
논의 중입니다.
WebIDLpartial interface MediaStreamTrack {
CaptureHandle? getCaptureHandle();
};
getCaptureHandle
해당 트랙이 비디오 트랙이 아니면 사용자 에이전트는
null을 반환해야 MUST 합니다.
트랙이 browser 또는
window
display surface 중
어느 하나도 나타내지 않으면, 사용자 에이전트는 null을 반환해야
MUST 합니다.
트랙이 ended 상태이면,
사용자 에이전트는
null을 반환해야 MUST 합니다.
캡처되는 애플리케이션이 CaptureHandleConfig를 설정하지
않았거나, 마지막으로 그것을 빈 CaptureHandleConfig로 설정했다면,
사용자 에이전트는 null을 반환해야 MUST 합니다.
사용자 에이전트는 캡처하는 문서의 origin을 캡처되는 애플리케이션이
permittedOrigins에
나열한 origin들과 비교해야 MUST 합니다. 캡처하는 origin이
CaptureHandle을
관찰하도록
허용되지 않은 경우, 사용자 에이전트는 null을 반환해야
MUST 합니다.
이전의 모든 검증을 통과했다면, 사용자 에이전트는 캡처되는 애플리케이션이
마지막으로 설정한 CaptureHandleConfig에서 파생된
값을 가진 CaptureHandle 딕셔너리를
반환해야
MUST 합니다.
주어진 캡처하는 애플리케이션에 대한 관찰 가능한
CaptureHandle이 변경될 때마다,
사용자 에이전트는 capturehandlechange라는
이름의 이벤트를 발화합니다. 이는 다음 경우에 발생할 수 있습니다:
CaptureHandleConfig와 함께
setCaptureHandleConfig()를
호출한 경우. (새 CaptureHandleConfig는 예를 들어
permittedOrigins를
변경하는 경우처럼, 관찰 가능한 CaptureHandle을 변경할 수도 있고
변경하지 않을 수도 있음에 유의하십시오.)
MediaStreamTrack은
oncapturehandlechange라는
EventListener로
확장됩니다.
WebIDLpartial interface MediaStreamTrack {
attribute EventHandler oncapturehandlechange;
};
oncapturehandlechange
EventHandler는
capturehandlechange라는 이름의
이벤트를 위한 것입니다.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: