Copyright © 2015-2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 문서는 사용자의 디스플레이 또는 그 일부를
getDisplayMedia를 사용하여
미디어 스트림의 소스로 활용하는 방법을 정의합니다. 이는 Media Capture API
[GETUSERMEDIA]의 확장입니다.
이 절에서는 이 문서의 발행 당시 상태를 설명한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있다.
이 문서는 완성되지 않았다. 중대한 변경이 이루어질 수 있으며, 초기 실험은 권장되지만 구현을 목적으로 하지는 않는다.
이 문서는 웹 실시간 통신 워킹 그룹에서 권고안 표준화 절차를 사용하여 작업 초안으로 발행했다.
작업 초안으로 발행되었다고 해서 W3C와 그 회원들이 이를 승인했음을 의미하지는 않는다.
이 문서는 초안이며 언제든지 다른 문서로 갱신되거나 대체되거나 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성했다. W3C는 이 그룹의 결과물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 관리하며, 해당 페이지에는 특허를 공개하는 방법도 포함되어 있다. 자신이 알고 있는 특허에 필수 청구항이 포함되어 있다고 믿는 개인은 W3C 특허 정책 제6절에 따라 해당 정보를 공개해야 한다.
이 문서에는 2025년 8월 18일 자 W3C 절차 문서가 적용된다.
이 섹션은 비규범적입니다.
이 문서는 Media Capture API [GETUSERMEDIA]의 확장에 대해 설명하며, 사용자의 디스플레이 또는 그 일부를 비디오 트랙 형태로 획득할 수 있게 합니다. 경우에 따라 시스템, 애플리케이션 또는 창 오디오도 캡처되어 오디오 트랙 형태로 제공됩니다. 이를 통해 WebRTC [WEBRTC]를 사용한 화면 공유를 포함한 여러 응용 프로그램이 가능합니다.
이 기능은 중대한 보안 영향을 가집니다. 이 API를 사용하여 사용자에게 표시되는 정보를 접근하는 애플리케이션은, 해당 정보가 애플리케이션의 제어 하에 있는 경우 다른 출처의 기밀 정보를 접근할 수 있습니다. 여기에는 사용자 에이전트 샌드박스가 제공하는 보호 때문에 그렇지 않으면 접근할 수 없는 콘텐츠도 포함됩니다.
이 문서는 주로 비디오 및 오디오 [GETUSERMEDIA]의 캡처를 다루지만, 여기서 정의된 일반 메커니즘은 현재 정의된 깊이 [MEDIACAPTURE-DEPTH]와 같이 다른 유형의 미디어로 확장될 수 있습니다.
비규범적이라고 지정된 섹션들뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예시 및 주석은 비규범적입니다. 이 명세의 다른 모든 내용은 규범적입니다.
이 문서에서 키워드 MAY, MUST, MUST NOT, 및 SHOULD는 모두 대문자로 표시될 때에 한해 BCP 14 [RFC2119] [RFC8174] 에 설명된 대로 해석됩니다.
이 명세는 해당 인터페이스를 구현하는 단일 제품인: user agent에 적용되는 적합성 기준을 정의합니다.
이 명세에 정의된 API를 구현하기 위해 ECMAScript [ECMA-262]를 사용하는 구현체는, 이 명세가 사용하는 용어와 일치하도록 Web IDL 명세에 정의된 ECMAScript 바인딩과 일치하는 방식으로 구현해야 합니다 [WEBIDL].
다음 예시는 이 문서에 정의된 navigator.mediaDevices.getDisplayMedia 메서드를 사용한 디스플레이 캡처 요청을 보여줍니다.
try {
let mediaStream = await navigator.mediaDevices.getDisplayMedia({video:true});
videoElement.srcObject = mediaStream;
} catch (e) {
console.log('Unable to acquire screen capture: ' + e);
}
이 문서는 MediaStream,
MediaStreamTrack
및 ConstrainablePattern
의 정의를 [GETUSERMEDIA]에서 사용합니다.
스크린 캡처는 여러 유형의 화면 기반 표면 캡처를 포함합니다. 통칭하여 이러한 것들을 디스플레이 표면이라고 하며, 이 문서에서는 다음 유형들을 정의합니다:
MediaStreamTrack로
캡처됩니다.
이 문서는 각 유형의 디스플레이 표면에 대해 두 가지 변형을 구분합니다:
일부 운영체제는 서로 다른 애플리케이션의 창이 다른 창을 전체 또는 일부 가려버리는 것을 허용하므로, 보이는 디스플레이 표면은 논리적 디스플레이 표면의 엄격한 부분집합입니다.
소스 픽셀 비율은 디스플레이 표면의 수직 픽셀 수로 1/96인치의 길이를 나눈 값입니다.
devicechange 이벤트는 [GETUSERMEDIA]에서 정의되어 있습니다.
표시된 미디어의 캡처는 getDisplayMedia 메서드를
MediaDevices 인터페이스에 추가함으로써 가능해지며,
이는 getUserMedia()와
유사하지만 매 호출마다 최종 사용자가 선택한 단일 디스플레이 장치에서 미디어를 획득한다는 점이 다릅니다.
WebIDLpartial interface MediaDevices {
Promise<MediaStream> getDisplayMedia(optional DisplayMediaStreamOptions options = {});
};
getDisplayMedia
사용자에게 그들의 디스플레이를 실시간으로 캡처할 권한을 요청합니다.
사용자 에이전트는 최종 사용자가 매번 공유할 display surface를 모든 가능한 선택지 중에서
직접 선택하도록 허용해야 하며(MUST), options.video나
options.audio에 있는 어떠한 MediaTrackConstraints도
그 선택을 제한하는 데 사용해서는 안 됩니다(MUST NOT).
사용자 에이전트는 displaySurface 제약과 그
값을 사용하여 사용자에게 제시되는 소스 목록의 표현 방식에 영향을 줄 수는 있습니다(MAY). 그럼에도 불구하고 사용자
에이전트는 여전히 모든 display surface에 대해 사용자에게 무제한 선택권을 제공해야 합니다(MUST). 사용자 에이전트는 사용자가 모니터를 공유하는 것을 피하도록 권장하는 것이 강력히 권장됩니다. 이는 개인 정보 보호에
대한 위험을 초래할 수 있기 때문입니다.
options.video 또는 options.audio에 있는 어떠한 MediaTrackConstraints도
사용자가 선택을 마친 이후에만 사용자가 선택한 미디어에 적용되어야 합니다(MUST).
오디오의 경우, 사용자 에이전트는 최종 사용자에게 공유할 오디오 소스를 제시할 수 있습니다(MAY). 어떤 선택지가 제공되는지는
사용자 에이전트에 달려 있으며, 오디오 소스는 반드시 비디오 소스와 동일하지 않을 수 있습니다. 오디오 소스는 특정 window일 수도 있고, browser일 수도 있으며, 전체
시스템 오디오이거나 그 조합일 수도 있습니다. getUserMedia()와
달리, 오디오+비디오 요청에 대해 사용자 에이전트는 오디오 제약이 있더라도 반드시 오디오를 반환할 필요가 없습니다. 스트림 수명 동안 오디오가 전혀 공유되지 않을 것이
확실한 경우 사용자 에이전트는 결과 스트림에 오디오 트랙을 포함해서는 안 됩니다(MUST NOT). 사용자 에이전트는 오디오와
비디오 요청을 받아들일 때 비디오 트랙만 반환할 수 있고(MAY), 또는 오디오 트랙과 비디오 트랙을 모두 반환할 수
있습니다(MAY). 사용자 에이전트는 오디오 전용 요청을 거부해야 합니다(MUST).
다른 소스 세트를 사용하고 사용자 선택을 요구한다는 점 외에도, getDisplayMedia는
"granted"
권한을 영구적으로 유지할 수 없다는 점에서 getUserMedia()와도
다릅니다.
getDisplayMedia()가
호출되면,
사용자 에이전트는 다음 단계를 실행해야 합니다(MUST).
mediaDevices를 this로 둔다.
controller를 options.controller가 있으면 그 값으로, 그렇지 않으면
null로 둔다.
controller가 null이 아닌 경우, 다음 단계를 실행한다:
controller.[[IsBound]]가
true이면,
rejected된 프로미스를 반환하고,
그 이유로 DOMException
객체를 제공하며,
해당 객체의 name
속성은 InvalidStateError
여야 한다.
controller.[[IsBound]]를 true로
설정한다.
relevant
global object가 this의 경우, 해당 객체가 transient
activation을 가지고 있지 않으면,
rejected된 프로미스를 반환하고,
그 이유로 DOMException
객체를 제공하며,
해당 객체의 name
속성은 InvalidStateError
여야 한다.
메서드의 첫 번째 인수를 options로 둔다.
constraints를 [options.audio,
options.video]로 둔다.
constraints.video가 false이면, 새로 생성된 rejected된 프로미스를
반환하고 새로 생성된 TypeError를
반환한다.
constraints의 기존 멤버들 각각에 대해, 그 값이 사전(dictionary)인 경우 다음 단계를 실행한다:
CS가 advanced 멤버를 포함하면, 새로 생성된 rejected된
프로미스를 반환하고 새로 생성된 TypeError를
반환한다.
CS가 display surface에
적용 가능한 제약 가능한 속성의 이름을 멤버로 가지고 있고, 그 값이 다시 min 또는 exact
멤버를 포함하는 사전이라면, 새로 생성된 rejected된 프로미스를 반환하고 새로
생성된 TypeError를
반환한다.
CS가 display surface에
적용 가능한 제약 가능한 속성의 이름을 멤버로 가지고 있고, 그 값이 다시 max 멤버를 포함하며 그 멤버의 값이 해당
제약 가능한 속성의 floor value보다 작다면,
failedConstraint를 그 멤버의 이름으로 두고, message를
undefined 또는 사람이 읽을 수 있는 설명 메시지 중 하나로 두어, rejected된
프로미스를 반환하며
OverconstrainedError(failedConstraint, message)로
생성된 새 OverconstrainedError를 반환한다.
requestedMediaTypes를 constraints에서 사전(dictionary) 값이거나
true인 멤버들의 미디어 타입 집합으로 둔다.
현재 설정 객체의 관련 전역 객체의 연결된 Document가 완전히 활성화되어 있지 않거나 포커스를 가지고 있지 않다면, 새로 생성된
rejected된 프로미스를 반환하고, 그 이유로 DOMException
객체를 제공하며, 해당 객체의 name
속성은 InvalidStateError
여야 한다.
사용자 활성화를 소비한다. 이때 this의 관련 전역 객체를 사용한다.
p를 새 프로미스로 둔다.
다음 단계를 병렬로 실행한다:
requestedMediaTypes의 각 미디어 타입 T에 대해,
타입 T의 소스가 전혀 없다면, 작업을
큐에 넣어 사용자 상호작용 작업 소스에서 reject하여
p를 새로 생성된 DOMException
객체(그 객체의 name
속성은 NotFoundError여야
함)로 거부하고 이 단계를 중단한다.
현재 브라우징 컨텍스트에서 타입 T의 소스를 얻기 위한 권한 상태를 읽는다. 권한 상태가 "denied"이면
PermissionFailure 단계로 이동한다.
선택적으로(예: 이전에 설정된 사용자 선호, 보안상의 이유, 플랫폼 제한 등으로 인해) Permission Failure 단계로 이동할 수 있다.
사용자에게 디스플레이 장치를 선택하도록 프롬프트를
표시한다. 이때 PermissionDescriptor의
name을
"display-capture"로 설정하여 제공된 미디어 집합을 얻는다.
제공된 미디어는 정확히 하나의 비디오 트랙을 포함해야 한다(MUST).
제공된 미디어는 최대 하나의 오디오 트랙을 포함할 수 있다. 이 오디오 트랙은 requestedMediaTypes에 오디오가
명시되지 않았거나 해당 값이 false로 지정된 경우 포함되어서는 안 된다(MUST
NOT).
선택된 장치는 사용자에 의해 결정된 것이어야 한다(MUST). 일단 선택되면, MediaStreamTrack의
소스는 사용자가 사용자 에이전트와의 상호작용을 통해 허용하지 않는 한 변경되어서는 안 된다(MUST
NOT).
사용자 에이전트는 브라우저 창이 보이는 경우와 같이 브라우저 browser 디스플레이 장치나 monitor 디스플레이 장치의 공유를 사용자에게 경고하거나, 이러한 선택을 비권장하도록 유도하는 것이 권장된다. 이는 공유 시 훨씬 더 높은 위험을 초래하기 때문이다.
요청 결과가 "granted"인
경우, 제공된 미디어를 공급하는 각 장치에 대해 장치를 나타내는 안정적이고 비공개적인 id인 deviceId를 사용하여
[[devicesLiveMap]][deviceId]를 true로 설정하고, 아직 true가 아니면
[[devicesAccessibleMap]][deviceId]도 true로 설정해야 한다.
사용자 에이전트는 "granted"
권한 항목을 저장해서는 안 된다(MUST NOT).
결과가 "denied"이면,
Permission Failure 단계로 이동한다. 사용자가 응답하지 않으면 이 알고리즘은 이 단계에서 정체된다.
사용자가 권한을 부여했지만 OS/프로그램/웹페이지 잠금 같은 하드웨어 오류로 접근할 수 없는 경우, 작업을
큐에 넣어 사용자 상호작용 작업 소스에서 reject하여 p를 새로
생성된 DOMException
객체(그 객체의 name
속성은 NotReadableError여야
함)로 거부하고 이 단계를 중단한다.
결과가 "granted"이지만
장치 접근이 위에 열거된 이유 외의 어떤 이유로 실패하면, 작업을
큐에 넣어 사용자 상호작용 작업 소스에서 reject하여 p를 새로
생성된 DOMException
객체(그 객체의 name
속성은 AbortError여야
함)로 거부하고 이 단계를 중단한다.
stream를 MediaStream
객체로 둔다.
사용자가 권한을 부여한 각 source에 대해 다음 단계를 실행한다:
track를 source와 mediaDevices로 MediaStreamTrack 생성의 결과로 둔다.
track를 stream의 트랙 집합에 추가한다.
Tie track source to MediaDevices를 source와 mediaDevices로 실행한다.
stream의 모든 트랙에 대해 적절한 제약을 사용하여 ApplyConstraints
algorithm를 실행한다. 실패할 경우, failedConstraint를 실패한 알고리즘의 결과로 두고,
message를 undefined 또는 사람이 읽을 수 있는 설명 메시지 중 하나로 둔 다음, 작업을
큐에 넣어 사용자 상호작용 작업 소스에서 reject하여 p를
OverconstrainedError(failedConstraint, message)로
생성된 새 OverconstrainedError로 거부하고 이 단계를 중단한다.
이 getDisplayMedia()
호출은 이제 새로운 capture-session을 생성한 것으로 간주된다.
작업을 큐에 넣어 사용자 상호작용 작업 소스에서 다음 단계를 실행한다:
controller가 null이 아니면 다음 단계를 실행한다:
controller.[[Source]]를
stream의 비디오 트랙의 [[Source]]로
설정한다.
controller.[[DisplaySurfaceType]]를
stream의 비디오 트랙의 DisplayCaptureSurfaceType로
설정한다.
last activation timestamp를 current high resolution time로 설정한다.
Resolve p를 stream로 한다.
controller가 null이 아니면, 작업을
큐에 넣어 사용자 상호작용 작업 소스에서 finalize focus decision
algorithm를 controller에 대해 실행한다.
이 단계들을 중단한다.
Permission Failure: 작업을
큐에 넣어 사용자 상호작용 작업 소스에서 reject하여 p를 새로
생성된 DOMException
객체(그 객체의 name
속성은 NotAllowedError여야
함)로 거부한다.
p를 반환한다.
최상위 문서가 포커스를 잃을 때, 해당 문서와 그 중첩된 browsing
contexts의 모든 CaptureController 객체에 대해 다음 단계를 실행한다:
[[Source]]가 undefined이면, 이
단계들을 중단한다.
[[FocusChangeDisabled]]를
true로 설정한다.
사용자 에이전트는 부분적으로 투명한 캡처된 display surface 뒤에 있는 내용을 캡처해서는 안 된다(MUST NOT).
새로 생성된 MediaStreamTrack에
대해,
사용자 에이전트는 프롬프트로 사용자에게 표시된 내용을 캡처해서는 안 된다(MUST NOT).
현재 화면에 렌더링되지 않은 정보는 애플리케이션이 해당 콘텐츠에 대해 명시적으로 접근 권한을 부여받지 않은 한(예: elevated permissions과 같은 수단을 통해) 캡처 시 가려져야 한다(SHOULD).
사용자 에이전트는 활성 사용자 동의(active user consent) 없이는 오디오를 공유해서는 안 된다(MUST NOT). 예를 들어, 특정 window의 비디오 캡처가 전체 시스템의 오디오 캡처(그 창과 관련 없는 애플리케이션 포함)를 동반하는 경우가 이에 해당한다.
공유 중인 디스플레이 표면은 운영체제나 사용자 에이전트의 동작으로 인해 일시적이거나 영구적으로 애플리케이션에서 접근 불가능하게 될 수 있습니다. 어떤 것이 디스플레이 표면이 접근 불가능하다고 간주되는지는 이 명세의 범위를 벗어나지만, 예시로는 모니터의 연결 해제, 창 또는 브라우저의 종료나 최소화, 또는 전화의 수신 통화 등이 포함될 MAY 있습니다.
사용자 에이전트가 궁극적으로 이 문맥에서 '접근 불가능'이 무엇을 의미하는지를 제어하지만, 외부 요인으로 인한 중단에 대해서만 음소거 및 음소거 해제 이벤트를 발생시키는 것이 권장됩니다.
만약 디스플레이 표면이 반드시 영구적이지는 않은 접근 불가능 상태에 들어가면, 사용자 에이전트는 작업을
큐에 넣어 해당하는 미디어 트랙의 muted 상태를 true로
설정하는 작업을 사용자 상호작용 작업 소스에서 실행해야 합니다(MUST).
만약 디스플레이 표면이 접근 불가능 상태에서 벗어나 접근 가능하게 되면, 사용자 에이전트는 작업을
큐에 넣어 해당하는 미디어 트랙의 muted 상태를 false로
설정하는 작업을 사용자 상호작용 작업 소스에서 실행해야 합니다(MUST).
만약 디스플레이 표면이 영구적인 접근 불가능 상태(예: 소스인 창의 종료)에 들어가면, 사용자 에이전트는 작업을 큐에 넣어 해당하는 미디어 트랙을 종료하는 작업을 사용자 상호작용 작업 소스에서 실행해야 합니다(MUST).
방금 getDisplayMedia에 의해 반환된 스트림은 기본적으로
음소거된 트랙들을 포함할 MAY 있습니다. 동일 스트림에 속한 오디오 및 비디오 트랙은 서로 독립적으로 음소거/음소거 해제될 MAY 있습니다.
소스 선택에 대한 제약을 수락하지 않는다는 것은 getDisplayMedia가 오디오, 비디오 또는
오디오+비디오 디스플레이 소스가 존재하는지를 노출하는 지문(fingerprinting) 표면만 제공한다는 것을 의미합니다. ![]()
참고로 displaySurface 제약을 수락해도 사용자 선택이 제한되지는 않습니다.
제약 조건은
getDisplayMedia에서
getUserMedia()와
다른 목적으로 사용된다.
제약 조건은 검색을 지원하지 않으며, 사용자가 선택한
후에만 적용된다.
이 절에서는
getDisplayMedia 트랙에 적용되는 제약 조건을
정의한다.
getUserMedia()에
정의된 제약 조건은 여기에 나열되지 않은 한 적용되지 않는다.
이러한 제약 조건 중 일부는 다운스케일링과 프레임 데시메이션 같은 사용자 에이전트 처리와 디스플레이 관련 기능을 활성화한다. 다른 제약 조건은 사용자가 선택한 디스플레이 표면의 고유 속성을 기능 및 설정으로 관찰할 수 있게 한다.
다음과 같은 새로운 기존 MediaStreamTrack
제한 가능
속성은 다음 동작을 통해
사용자가 선택한 비디오 디스플레이 표면에 적용되도록
정의된다.
| 속성 이름 | 유형 | 동작 |
|---|---|---|
| width | unsigned long
|
픽셀 단위 너비이다. 기능으로서 max는 반드시 디스플레이 표면의 너비를 반영해야 하며, min은 반드시 사용자 에이전트의 다운스케일링을 통해 사용할 수 있는 가장 작은 종횡비 보존 표현의 너비를 반영해야 한다. |
| height | unsigned long
|
픽셀 단위 높이이다. 기능으로서 max는 반드시 디스플레이 표면의 높이를 반영해야 하며, min은 반드시 사용자 에이전트의 다운스케일링을 통해 사용할 수 있는 가장 작은 종횡비 보존 표현의 높이를 반영해야 한다. |
| frameRate | double |
프레임 속도(초당 프레임 수)이다. 기능으로서 max는 반드시 디스플레이 표면의 프레임 속도를 반영해야 하며, min은 반드시 사용자 에이전트의 프레임 데시메이션을 통해 사용할 수 있는 가장 낮은 프레임 속도를 반영해야 한다. |
| aspectRatio | double |
정확한 종횡비(픽셀 단위 너비를 픽셀 단위 높이로 나눈
값을 소수점 이하 열 번째 자리에서 반올림한 double로 표현한 것)
또는 종횡비 범위이다. 설정으로서는 width /
height를 나타낸다. 기능으로서 min과 max는 모두 반드시
현재 설정값이어야 하며, 애플리케이션 관점에서 이
속성을 변경할 수 없게 한다. |
| resizeMode | DOMString |
이 문자열은 VideoResizeModeEnum의
멤버 중 하나이다.
설정으로서
"none"은
MediaStreamTrack이
디스플레이를 완전한 세부 정보로 렌더링하는 데 필요한 모든 비트를
포함한다는 의미이다. 소스 픽셀
비율 > 1이면, 이는 width와
height가 최종 사용자 관점에서 보이는 디스플레이의
외관이 시사하는 것보다 더 크다는 의미이다. 반면
"crop-and-scale"은
MediaStreamTrack이
사용자 에이전트에 의해 다운스케일링되었지만 잘리지는 않은
디스플레이 표면의 종횡비 보존 표현을
포함한다는 의미이다. 기능으로서
"none"과
"crop-and-scale"
값은 모두 반드시 존재해야 한다.
|
| deviceId | DOMString |
캡처 중인 표면의 식별자이다.
설정으로서 캡처 중인 디스플레이 표면을 식별한다. 식별자는 각 문서마다 반드시 고유하게 생성되어야 한다. 기능으로서 설정값은 반드시 존재하는 유일한 값이어야 하며, 애플리케이션 관점에서 이 속성을 변경할 수 없게 한다. |
| displaySurface | DOMString |
이 문자열은
설정으로서 캡처 중인 디스플레이 표면의 유형을 나타낸다. 기능으로서 설정값은 반드시 존재하는 유일한 값이어야 하며, 애플리케이션 관점에서 이 속성을 변경할 수 없게 한다. 제약 조건으로서 이 값은 특정 디스플레이 표면 유형에 대한 애플리케이션의
선호를 사용자 에이전트에 전달한다. 사용자 에이전트는 해당 선호에
따라 사용자에게 제공하는 옵션의 순서를 변경할 수 있다.
이 제약 조건은 다른 모든 목적으로는 무시되므로
어떠한 부작용도 일으킬 수 없다
(예: |
| logicalSurface | boolean |
설정으로서 true 값은
논리적 디스플레이
표면의 캡처를 나타내며,
false 값은 가시 디스플레이 표면의 캡처를 나타낸다.
기능으로서 이 동일한 값은 반드시 존재하는 유일한
값이어야 하며, 애플리케이션 관점에서 이 속성을 변경할 수 없게 한다.
|
| cursor | DOMString |
이 문자열은
CursorCaptureConstraint의 멤버
중 하나이다.
설정으로서 캡처된 디스플레이 표면에 커서가
포함되는지와 언제 포함되는지를 나타낸다. 기능으로서
사용자 에이전트는 이
디스플레이 표면에 대해 지원할 수 있는
CursorCaptureConstraint 값
집합만
반드시 포함해야 한다.
|
| screenPixelRatio | double |
설정값으로서는 크기가 1.0인 CSS 픽셀을 페이지 확대/축소 1.0에서 배율 1.0을 사용하여 디스플레이 표면의 픽셀 세로 크기로 나눈 결과이다. 이는 제약 조건이나 기능으로 사용할 수 없다. |
다음과 같은 새로운 기존 MediaStreamTrack
제한 가능
속성은 다음 동작을 통해
사용자가 선택한 오디오 소스에 적용되도록 정의된다.
| 속성 이름 | 유형 | 동작 |
|---|---|---|
| restrictOwnAudio | boolean |
설정으로서 이 값은 사용자 에이전트가 소스에 자체 오디오 제한을 적용하는지 여부를 나타낸다. 제약 조건으로서 이 속성을 제한하면 자체 오디오 제한이 활성화되거나 비활성화된 소스가 생성될 수 있다. 자체 오디오 제한이 적용되면 사용자
에이전트는 |
| suppressLocalAudioPlayback | boolean |
설정으로서 이 값은 애플리케이션이 사용자 에이전트에 소스에 로컬 오디오 재생 억제를 적용하도록 지시했는지 여부를 나타낸다. 제약 조건으로서 이 값은 사용자가
브라우저 디스플레이 표면의 캡처를 선택한 경우에만 의미가 있다.
이 경우 로컬 오디오 재생 억제가 적용되면 사용자 에이전트는 로컬 스피커로 오디오를 전달하는 것을 중단해야 한다. 그러나 해당 오디오는 진행 중인 오디오 캡처 캡처 세션에서 여전히 반드시 캡처되어야 한다. 이 억제는 캡처되는 문서에서 관찰할 수 없어야 한다. 또한 캡처하는 문서는 suppressLocalAudioPlayback을 적용하는지 여부만 관찰할 수 있으며, 해당 억제가 실제로 효과를 발휘하는지는 관찰할 수 없다(즉, 사용자가 사용자 에이전트에서 이를 재정의하는지 관찰할 수 없다). 브라우저 디스플레이 표면이
동시에 여러 번 캡처되는 경우, 하나 이상의 활성
오디오 캡처 캡처 세션이
suppressLocalAudioPlayback을
|
사용자가 선택한 디스플레이 표면의 기반 소스가 가진 고유 속성이 변경되어, 예를 들어 최종 사용자가 캡처 중인 창의 크기를 조절함으로써 하나 이상의 제한 가능 속성의 기능 및/또는 설정이 최신 상태가 아니게 되는 경우, 사용자 에이전트는 사용자 상호작용 태스크 소스에서 다음 단계를 실행하도록 태스크를 대기열에 추가해야 한다.
영향을 받는 모든 제한 가능 속성을 동시에 갱신한다.
그 결과 "overconstrained" 상태가 발생하면 사용자 에이전트는 해당 제약 조건이 과도하게 제한하는 동안 원인이 된 제약 조건을 반드시 무시해야 한다. 사용자 에이전트는 트랙을 음소거해서는 안 된다.
min 및 exact 제약 조건은 getDisplayMedia()에서 TypeError를 발생시키지만, 이 명세는 track.applyConstraints() 메서드를 변경하지 않는다. 따라서 값에 따라 대신 OverconstrainedError가 발생하거나 성공할 수 있으며, 그 결과 이 "overconstrained" 상태를 일으킬 가능성이 있다. max 제약 조건도 aspectRatio 등의 경우 이를 일으킬 수 있다. 이 명세에서는 이러한 경우를 유용하지 않은 예외적 사례로 간주한다.
SelectSettings 알고리즘을 위해 사용자 에이전트는 원본 디스플레이 표면의 종횡비를 보존하는(가장 가까운 픽셀 기준) 다운스케일링된 크기의 가능한 모든 조합과 프레임 데시메이션을 통해 사용할 수 있는 프레임 속도를 사용 가능한 설정 딕셔너리로 고려해야 한다.
제약 조건의 다운스케일링 및 데시메이션 효과는 이후 적합도 거리 알고리즘에 의해 실질적으로 결정된다.
의도는 ideal width, ideal height 및/또는
ideal frameRate가 지정되었을 때 사용자 에이전트가 이에 가까운
출력을 생성하면서, 항상 원본 디스플레이 표면의
종횡비를 보존하도록 하는 것이다.
적용된 제약 조건에서 달리 지시하지 않는 한 사용자 에이전트는 기본적으로 소스 픽셀 비율에 따라 다운스케일링해야 한다.
사용자 에이전트는 캡처된 출력을 잘라서는 안 된다.
사용자 에이전트는 집계된 디스플레이 표면에서 높은 해상도와 프레임 속도를 보존하는 데 필요한 경우를 제외하고, 캡처된 출력을 업스케일링하거나 추가 프레임을 생성해서는 안 된다.
이 명세에서 양의 숫자 유형을 갖는 각 제한 가능 속성에 대해
사용자 에이전트는 소스와 관계없이 사용자 에이전트가 지원하는
가장 작은 허용값을 나타내는 최솟값을
반드시 설정해야 한다. 이 값은 반드시 일정해야 하며
0보다 반드시 커야 한다.
사용자 에이전트는 소스와 관계없이 최솟값보다 큰 모든 값을 지원하는 것이 권장된다.
최솟값의 목적은 사용자에게 이미
메시지가 표시된 후 사용자 에이전트가
getDisplayMedia()를
OverconstrainedError로 실패시키는 것을 방지하고,
사용자의 시스템에 관한 정보가 유출되는 것을 방지하는 데 있다.
setFocusBehavior()를
호출하는
애플리케이션이 사용자 에이전트에서 해당
CaptureController의
캡처 세션과 연결된
디스플레이 표면에 포커스를 맞추기를 원하는지 설명한다.
WebIDLenum CaptureStartFocusBehavior {
"focus-capturing-application",
"focus-captured-surface",
"no-focus-change"
};
| 열거형 설명 | |
|---|---|
focus-capturing-application
|
애플리케이션은 자신에게 포커스가 맞춰지기를 선호한다. |
focus-captured-surface
|
애플리케이션은 이 CaptureController의
캡처 세션과 연결된
디스플레이 표면에
포커스가 맞춰지기를 선호한다.
|
no-focus-change
|
애플리케이션은 사용자 에이전트가 포커스를 변경하지 않고, 사용자가 사용자 에이전트 및/또는 운영 체제와 상호작용한 후 마지막으로 포커스를 가졌던 표면에 포커스를 그대로 두기를 선호한다. |
no-focus-change"를
사용 중단할 가능성을 검토하고 있다.
CaptureController
객체는 캡처 세션과 연결될 수 있다.
이 객체는 getDisplayMedia()
호출이나 그 결과 스트림 또는 트랙이 아니라
캡처 세션 자체와 연결된
기능을 노출하는 데 사용된다.
특정 캡처 세션에는 최대 하나의
CaptureController만
연결된다.
특정 캡처 세션에는 최대 하나의
CaptureController만
연결된다.
WebIDL[Exposed=Window, SecureContext]
interface CaptureController : EventTarget {
constructor();
undefined setFocusBehavior(CaptureStartFocusBehavior focusBehavior);
};
CaptureController는 아직
이벤트 처리기를 정의하지 않으므로
EventTarget을
상속할 필요가 없다. 이는 향후
CaptureController에 이벤트 처리기
속성을 추가하는 명세를 위한 것이다. 상속을 사용하지 않는다면
이를 제거할 수 있다.
constructor
CaptureController
객체를 생성한다.
| 내부 슬롯 | 초기값 | 설명(비규범적) |
|---|---|---|
| [[IsBound]] | false
|
애플리케이션이 this를 캡처 세션과 연결하려고 시도했는지 여부이다. |
| [[Source]] | null
|
연결된 캡처 세션의 소스이다. |
| [[DisplaySurfaceType]] | null
|
캡처가 시작되면 캡처된 디스플레이 표면의 유형으로 설정된다. |
| [[FocusChangeDisabled]] | false
|
외부 이벤트 또는 사용자 에이전트의 판단으로 포커스 변경이 비활성화되었는지 여부이다. |
| [[FocusDecisionFinalized]] | false
|
포커스 결정이 확정되면 true로 설정된다. |
| [[FocusBehavior]] | null
|
애플리케이션이 원하는 포커스 동작이다. |
사용자 에이전트는 자체 논리에 따라 언제든지
[[FocusChangeDisabled]]를
true로 설정할 수 있다.
setFocusBehavior
다음 단계를 실행한다.
focusBehavior를 메서드의 첫 번째 인수로 설정한다.
this.[[Source]]가
null이면
this.[[FocusBehavior]]를
focusBehavior로 설정하고 이 단계를 중단한다.
this.[[Source]]가
중지되었으면
"InvalidStateError"
DOMException을
예외로
던진다.
this.[[DisplaySurfaceType]]이
"browser"도
아니고
"window"도
아니면
"InvalidStateError"
DOMException을
예외로
던진다.
this.[[FocusDecisionFinalized]]가
true이면
"InvalidStateError"
DOMException을
예외로
던진다.
this.[[FocusBehavior]]를
focusBehavior로 설정한다.
this에 포커스 결정 확정 알고리즘을 실행한다.
controller가 주어졌을 때 포커스 결정 확정 알고리즘은 다음 단계를 실행하는 것으로 구성된다.
캡처 세션이 시작된 후
너무 많은 시간이 경과했으면 사용자 에이전트는
[[FocusDecisionFinalized]]를
true로 설정해야 한다.
시간 간격은 사용자 에이전트가 결정하지만 1초를 사용하는 것이 권장된다.
controller.[[FocusDecisionFinalized]]가
true이면 이 단계를 중단한다.
controller.[[FocusDecisionFinalized]]를
true로 설정한다.
controller.[[FocusChangeDisabled]]가
true이면 이 단계를 중단한다.
controller.[[DisplaySurfaceType]]이
"browser"도 아니고
"window"도 아니면
이 단계를 중단한다.
focusBehavior를
controller.[[FocusBehavior]]로 설정한다.
다음 단계를 병렬로 실행한다.
focusBehavior가
"focus-capturing-application"이면
캡처하는 문서를 나타내는
디스플레이 표면에
포커스를 맞춘다.
focusBehavior가
"focus-captured-surface"이면
controller.[[Source]]가 참조하는
디스플레이 표면에
포커스를 맞춘다.
애플리케이션이 위치한 디스플레이 표면을 사용자에게 제공하는 선택 항목에 포함할지 여부에 관해 애플리케이션이 제공할 수 있는 여러 힌트를 설명한다.
WebIDLenum SelfCapturePreferenceEnum {
"include",
"exclude"
};
| 열거형 값 | 설명 |
|---|---|
include
|
애플리케이션은 해당 표면이 제공되는 선택 항목에 포함되기를 선호한다. |
exclude
|
애플리케이션은 해당 표면이 제공되는 선택 항목에서 제외되기를 선호한다. |
getDisplayMedia()를
호출하는
애플리케이션이 사용자 에이전트에서
모니터 디스플레이
표면에 대해 사용자에게 제공하는
오디오 소스에 시스템 오디오를 포함하기를 원하는지 설명한다.
다른 유형의 디스플레이 표면에는 적용되지 않는다.
WebIDLenum SystemAudioPreferenceEnum {
"include",
"exclude"
};
| 열거형 설명 | |
|---|---|
include
|
애플리케이션은 모니터 디스플레이 표면에 대해 시스템 오디오를 공유하는 옵션이 사용자에게 제공되기를 선호한다. |
exclude
|
애플리케이션은 모니터 디스플레이 표면에 대해 시스템 오디오를 공유하는 옵션이 사용자에게 제공되지 않기를 선호한다. |
getDisplayMedia()를
호출하는
애플리케이션이 사용자 에이전트에서
창 디스플레이 표면에 대해 사용자에게 제공하는
오디오 소스에 창 오디오 또는 시스템 오디오를 포함하기를 원하는지
설명한다.
WebIDLenum WindowAudioPreferenceEnum {
"system",
"window",
"exclude"
};
| 열거형 설명 | |
|---|---|
system
|
애플리케이션은 창 디스플레이 표면에 대해 시스템 오디오를 공유하는 옵션이 사용자에게 제공되기를 선호한다. |
window
|
애플리케이션은 창 디스플레이 표면에 대해 창 오디오를 공유하는 옵션이 사용자에게 제공되기를 선호한다. |
exclude
|
애플리케이션은 창 디스플레이 표면에 대해 오디오를 공유하는 옵션이 사용자에게 제공되지 않기를 선호한다. |
getDisplayMedia()를
호출하는
애플리케이션이 캡처 중에 소스 디스플레이 표면을 동적으로 전환하는 옵션을
사용자 에이전트가 사용자에게 제공하기를 원하는지 설명한다.
WebIDLenum SurfaceSwitchingPreferenceEnum {
"include",
"exclude"
};
| 열거형 설명 | |
|---|---|
include
|
애플리케이션은 캡처 중에 소스 디스플레이 표면을 동적으로 전환하는 옵션이 사용자에게 제공되기를 선호한다. |
exclude
|
애플리케이션은 캡처 중에 소스 디스플레이 표면을 동적으로 전환하는 옵션이 사용자에게 제공되지 않기를 선호한다. |
애플리케이션이 사용자 에이전트에서 사용자에게 유형이 모니터인 디스플레이 표면을 선택하는 옵션을 제공하기를 원하는지 설명한다.
WebIDLenum MonitorTypeSurfacesEnum {
"include",
"exclude"
};
| 열거형 설명 | |
|---|---|
include
|
애플리케이션은 사용자에게 제공되는 디스플레이 표면에 모니터 유형이 포함되기를 선호한다. |
exclude
|
애플리케이션은 사용자에게 제공되는 디스플레이 표면에서 모니터 유형이 제외되기를 선호한다. |
getDisplayMedia()를
호출하는
애플리케이션이 사용자 에이전트에서 비디오와 함께 오디오를
캡처하는 것을 선호하기를 원하는지 설명한다.
WebIDLenum AudioSelectionPreferenceEnum {
"preferred"
};
| 열거형 설명 | |
|---|---|
preferred
|
애플리케이션은 사용자 에이전트가 비디오와 함께 오디오를 캡처하는 것을 우선하기를 선호한다. |
DisplayMediaStreamOptions 딕셔너리는
getDisplayMedia가 반환하는
MediaStream에
어떤 종류의 MediaStreamTrack이
포함될 수 있는지를 사용자 에이전트에 지시하는 데 사용된다.
WebIDLdictionary DisplayMediaStreamOptions {
(boolean or MediaTrackConstraints) video = true;
(boolean or MediaTrackConstraints) audio = false;
CaptureController controller;
SelfCapturePreferenceEnum selfBrowserSurface;
SystemAudioPreferenceEnum systemAudio;
WindowAudioPreferenceEnum windowAudio;
SurfaceSwitchingPreferenceEnum surfaceSwitching;
MonitorTypeSurfacesEnum monitorTypeSurfaces;
AudioSelectionPreferenceEnum audioSelection;
};
DisplayMediaStreamOptions
딕셔너리 멤버video의 유형은
(boolean 또는
MediaTrackConstraints)이며
기본값은
true이다.
true이면 반환되는
MediaStream에
비디오 트랙을 포함하도록 요청한다.
Constraints 구조가 제공되면 사용자가 선택한 디스플레이 표면의
비디오 트랙 표현에 적용할 원하는 처리 옵션을 추가로
지정한다. false이면
getDisplayMedia
알고리즘에 따라 요청이
TypeError로
거부된다.
audio의 유형은
(boolean 또는
MediaTrackConstraints)이며
기본값은
false이다.
true이면 지원되고 사용자가 선택한 디스플레이 표면에서
오디오를 사용할 수 있는 경우 반환되는
MediaStream에
오디오 트랙을 포함하는 데 관심이 있음을 나타낸다.
Constraints 구조가 제공되면 오디오 트랙에 적용할
원하는 처리 옵션을 추가로 지정한다. false이면
MediaStream에
오디오 트랙이 포함되지 않는다.
controller의 유형은
CaptureController이다.
존재하는 경우 이 CaptureController 객체는
캡처 세션과
연결된다. 이 객체에 노출된 메서드를 통해
캡처 세션을 조작할 수 있다.
selfBrowserSurface의 유형은
SelfCapturePreferenceEnum이다.
systemAudio의 유형은
SystemAudioPreferenceEnum이다.
windowAudio의 유형은
WindowAudioPreferenceEnum이다.
surfaceSwitching의 유형은
SurfaceSwitchingPreferenceEnum이다.
monitorTypeSurfaces의 유형은
MonitorTypeSurfacesEnum이다.
존재하는 경우 애플리케이션이 사용자 에이전트에서 유형이 모니터인 디스플레이 표면을 사용자에게 제공되는 선택 항목에 포함하기 원하는지 나타낸다. 사용자 에이전트는 이 힌트를 무시할 수 있다.
사용자 에이전트는 여전히 사용자에게 유형이
모니터인
디스플레이
표면을 캡처하는 옵션을 제공할 수 있다. 따라서 애플리케이션은
수신한 트랙의
displaySurface
설정을 계속 확인하는 것이 권장된다.
audioSelection의 유형은
AudioSelectionPreferenceEnum이다.
존재하는 경우 애플리케이션이 사용자 에이전트에서 사용자가 비디오와 함께 오디오를 공유하도록 유도하기 원하는지 나타낸다. 사용자 에이전트는 이 힌트를 무시할 수 있다.
MediaTrackSupportedConstraints
확장
여기에서는 사용자 에이전트가 인식하는 제약 조건 목록으로
MediaTrackSupportedConstraints를
확장한다.
WebIDLpartial dictionary MediaTrackSupportedConstraints {
boolean displaySurface = true;
boolean logicalSurface = true;
boolean cursor = true;
boolean restrictOwnAudio = true;
boolean suppressLocalAudioPlayback = true;
};
displaySurface의
유형은 boolean이며 기본값은
true이다.
displaySurface
제약 조건이 인식되는지 여부이다.
logicalSurface의
유형은 boolean이며
기본값은 true이다.logicalSurface
제약 조건이 인식되는지 여부이다.
cursor의 유형은 boolean이며 기본값은
true이다.
cursor 제약 조건이 인식되는지 여부이다.
restrictOwnAudio의
유형은 boolean이며 기본값은
true이다.
restrictOwnAudio 제약 조건이
인식되는지 여부이다.
suppressLocalAudioPlayback의 유형은 boolean이며
기본값은 true이다.suppressLocalAudioPlayback
제약 조건이 인식되는지 여부이다.
MediaTrackConstraintSet
확장
MediaTrackConstraintSet은
제약 조건의 현재 상태를 읽는 데 사용된다.
WebIDLpartial dictionary MediaTrackConstraintSet {
ConstrainDOMString displaySurface;
ConstrainBoolean logicalSurface;
ConstrainDOMString cursor;
ConstrainBoolean restrictOwnAudio;
ConstrainBoolean suppressLocalAudioPlayback;
};
displaySurface의 유형은
ConstrainDOMString이다.
캡처 중인 디스플레이 표면의 유형이다.
이 값은 DisplayCaptureSurfaceType
열거형의 값을 사용한다.
logicalSurface의 유형은
ConstrainBoolean이다.
true 값은 논리적 디스플레이 표면의 캡처를
나타내며,
false 값은
가시 디스플레이
표면의 캡처를 나타낸다.
cursor의
유형은 ConstrainDOMString이다.
캡처된 디스플레이 표면에 커서가 포함되는지와 언제 포함되는지를
결정하는 CursorCaptureConstraint
열거형의 값을 사용한다.
restrictOwnAudio의 유형은
ConstrainBoolean이다.
이 제약 조건은 오디오 트랙에만 적용된다.
restrictOwnAudio를 참조한다.
suppressLocalAudioPlayback의 유형은
ConstrainBoolean이다.
이 제약 조건은 오디오 트랙에만 적용된다.
suppressLocalAudioPlayback을
참조한다.
MediaTrackSettings
확장
비디오 스트림 트랙에서
getSettings()
메서드가 호출되면 사용자 에이전트는 기반 사용자 에이전트의
현재 상태를 나타내는 확장된
MediaTrackSettings
딕셔너리를 반환해야 한다.
WebIDLpartial dictionary MediaTrackSettings {
DOMString displaySurface;
boolean logicalSurface;
DOMString cursor;
boolean restrictOwnAudio;
boolean suppressLocalAudioPlayback;
double screenPixelRatio;
};
displaySurface의
유형은 DOMString이다.캡처 중인 디스플레이 표면의 유형이다.
이 값은 DisplayCaptureSurfaceType
열거형의 값을 사용한다.
logicalSurface의
유형은 boolean이다.true 값은 논리적
디스플레이 표면의 캡처를 나타내며, false 값은
가시 디스플레이
표면의 캡처를 나타낸다.
cursor의 유형은 DOMString이다.캡처된 디스플레이 표면에 커서가 포함되는지와 언제 포함되는지를
결정하는 CursorCaptureConstraint
열거형의 값을 사용한다.
restrictOwnAudio의
유형은 boolean이다.restrictOwnAudio 제약
조건이
적용되는지(true) 또는 적용되지 않는지(false)를 나타낸다.
suppressLocalAudioPlayback의 유형은 boolean이다.애플리케이션이 사용자 에이전트에 소스에 로컬 오디오 재생 억제를 적용하도록 지시했는지 여부를 나타낸다.
screenPixelRatio의
유형은 double이다.캡처 중인 디스플레이 표면의 화면 픽셀 비율이다.
MediaTrackCapabilities
확장
비디오 스트림 트랙에서
getCapabilities()
메서드가 호출되면 사용자 에이전트는 기반 사용자 에이전트의
기능을 나타내는 확장된
MediaTrackCapabilities
딕셔너리를 반환해야 한다.
WebIDLpartial dictionary MediaTrackCapabilities {
DOMString displaySurface;
boolean logicalSurface;
sequence<DOMString> cursor;
};
displaySurface의
유형은 DOMString이다.getSettings()가
반환한 값과 반드시 동일해야 하며,
애플리케이션 관점에서 이 속성을 변경할 수 없게 한다.
logicalSurface의
유형은 boolean이다.getSettings()가
반환한 값과 반드시 동일해야 하며,
애플리케이션 관점에서 이 속성을 변경할 수 없게 한다.
cursor의 유형은
sequence<DOMString>이다.사용자 에이전트가 이 트랙에 대해 지원할 수 있는
CursorCaptureConstraint의
값 집합으로 정확히 구성되어야 한다.
DisplayCaptureSurfaceType
열거형은 여러 유형의 디스플레이 표면을 설명한다.
WebIDLenum DisplayCaptureSurfaceType {
"monitor",
"window",
"browser"
};
| 열거형 값 | 설명 |
|---|---|
monitor
|
모니터 디스플레이 표면, 물리적 디스플레이 또는 물리적 디스플레이 모음 |
window
|
창 디스플레이 표면 또는 단일 애플리케이션 창 |
browser
|
브라우저 디스플레이 표면 또는 단일 브라우저 창 |
CursorCaptureConstraint은
커서가 캡처되는 조건을 열거한다.
WebIDLenum CursorCaptureConstraint {
"never",
"always",
"motion"
};
| 열거형 값 | 설명 |
|---|---|
never
|
"never"
커서 캡처 제약 조건은 캡처된 디스플레이 표면에서
커서를 제외한다. |
always
|
"always"
커서 캡처 제약 조건은 캡처된 디스플레이 표면에
커서를 포함한다. |
motion
|
"motion"
커서 캡처 제약 조건은 커서/포인터가 이동할 때
캡처된 디스플레이 표면에 커서를 포함한다.
포인터/커서가 사용자 에이전트가 정한 일정 시간 동안
더 이상 이동하지 않으면 캡처된 커서가 제거된다.
|
캡처의 각 잠재적 소스는 이 API에서 개별 미디어 소스로 처리됩니다. 그러나 디스플레이 캡처 소스는
enumerateDevices()
에 의해 열거되어서는 안 됩니다. 이는 호스트 시스템에 대한 과도한 정보를 노출시킬 수 있기 때문입니다.
따라서 디스플레이 캡처 소스는
deviceId 제약 조건으로 선택할 수 없습니다. 이는 해당
deviceId가 노출되지 않기 때문입니다.
이는 동일한 이름을 가진 알고리즘에서 프라이버시 지표를 구현하기 위해 사용되는 안정적이고 비공개적인 ID와 혼동해서는 안 됩니다.
화면 캡처는 강력한 기능으로, "display-capture"라는 이름으로 식별되며, 사용하기 위해 명시적 권한을 요구합니다.
권한 사양과의 통합을 위해 필수적인 요구사항으로, 본 사양은 다음을 정의합니다:
prompt"와
"denied"입니다.
사용자
에이전트는 이 설명자의 권한
상태를
"granted"로
설정해서는 안 됩니다.
이 사양은 문자열 "display-capture"로 식별되는
정책 제어
기능을 정의합니다. 기본
허용 목록은 "self"입니다.
문서의 권한
정책은 해당 문서의 모든 콘텐츠가
getDisplayMedia를 사용할 수 있는지
여부를 결정합니다. 특정 문서에서 비활성화된 경우, 문서 내의 어떤 콘텐츠도
사용
허용되지 않습니다
getDisplayMedia. 이는
사용자에게 선택을 요청
알고리즘에 의해 강제됩니다.
이 사양은 프라이버시 지표
요구사항을 확장하여
getDisplayMedia를 포함합니다.
이 사양에서 [[devicesLiveMap]], [[devicesAccessibleMap]], 그리고 [[kindsAccessibleMap]]에 대한 참조는 getUserMedia()의
프라이버시 지표 요구사항을 지원하기 위해 이미 생성된 정의를 참조합니다.
getDisplayMedia에 의해 노출되는 각
kind의 디바이스에 대해, 디바이스의 안정적이고 비공개적인 ID deviceId를 사용하여, kind를
"Display" + kind로 설정하고 다음 작업을 수행합니다:
false로 초기화합니다.
false로 초기화합니다.
그런 다음, 위의 새로운 정의를 통해 사용자 에이전트에 대한 요구사항은 프라이버시 지표
요구사항에 명시된 요구사항과 동일합니다
getUserMedia().
비록 getDisplayMedia에 대한 단일 권한 설명자가
있더라도, 위의 정의는 kind별로 구분하여 사용자 에이전트가 특정 시점에 공유되고 있는 디스플레이 소스의 종류를 최종 사용자에게 표시하는 프라이버시 지표를 구현할 수 있도록
합니다.
이 사양은 사용자 에이전트가 "granted"
권한을 지속적으로 유지하는 것을 금지하기 때문에, "Live" 지표만이 중요합니다.
사용자 에이전트는
getDisplayMedia에서
사용 가능한 소스 집합의 변경을 근거로
devicechange
이벤트를 발생시켜서는 안 된다.
이 섹션은 정보 제공용입니다. 그러나 여기에 포함된 조언을 따르지 않을 경우 플랫폼 보안에 심각한 위험을 초래할 수 있음을 주의해야 합니다.
표시된 콘텐츠를 캡처하는 것이 사용자 프라이버시와 보안에 미치는 위험은 두 가지입니다. 첫 번째로, 사용자가 의도하지 않은 콘텐츠를 공유하거나 공유된다는 사실을 인지하지 못할 가능성이 있는 즉각적이고 분명한 위험이 있습니다.
디스플레이 캡처는 브라우저 샌드박스에서 제공하는 교차 사이트 요청 위조 방어 기능에 덜 분명한 위험을 초래합니다. 애플리케이션이 직접적으로 접근할 수 없는 정보를 간접적으로라도 제어할 수 있는 경우, 디스플레이 및 정보 캡처가 해당 애플리케이션이 직접적으로 접근할 수 없는 정보를 접근 가능하게 할 수 있습니다. 예를 들어, 캔버스 API는 캔버스 샘플링을 허용하지 않으며, 원본이 깨끗하지 않은 경우 접근 가능한 형태로 변환할 수 없습니다 [2DCONTEXT].
이 문제는 [RTCWEB-SECURITY-ARCH] 및 [RTCWEB-SECURITY]에서 더 자세히 논의됩니다.
특히 애플리케이션이 어떤 형태로든 제어하는 브라우저 창을 포함한 디스플레이 캡처는 이러한 기본 보안 보호 기능을 위반할 위험이 있습니다. 이 위험은 브라우저 창에 국한되지 않으며, 운영 체제에 따라 브라우저 애플리케이션과 기타 애플리케이션 간 제어 채널에도 영향을 미칩니다. 캡처된 디스플레이 표면이 결과 미디어를 수신하는 애플리케이션에서 비밀로 유지해야 하는 정보를 표시하도록 유도될 수 있는지 여부가 주요 고려 사항입니다.
논리적 디스플레이 표면의 캡처는 사용자가 인지하지 못한 콘텐츠가 공유될 가능성을 초래합니다. 논리적 디스플레이 표면은 사용자가 노출하려고 하지 않는 정보를 렌더링할 수 있습니다. 이 정보가 가시적인 경우 이러한 문제를 더 쉽게 인식할 수 있습니다. 이와 같은 수단은 기계에는 효과가 없을 수 있지만, 인간 수신자는 잠시만 나타나는 콘텐츠를 처리하기 어렵습니다.
현재 화면에 렌더링되지 않은 정보는 애플리케이션이 상승된 권한을 통해 해당 콘텐츠에 접근하도록 명시적으로 허가받지 않은 경우 캡처에서 가려지도록 권장됩니다.
논리적 디스플레이 표면의 가려진 영역이 가시적 디스플레이 표면 캡처를 생성하기 위해 캡처되는 방식은 다를 수 있습니다. 프레젠테이션 소프트웨어와 같은 일부 애플리케이션은 화면의 가려진 부분이 가려지기 전에 표시된 이미지를 렌더링하면 이점이 있습니다. 이미지 동결은 변경되는 콘텐츠에 대해 시각적 왜곡을 초래하거나 콘텐츠가 가려지고 있음을 숨길 수 있습니다. 캡처된 부분이 동결된 경우 이를 버그로 잘못 인식할 수 있습니다. 반대로, 가려진 영역은 회색 색상이나 해칭과 같이 가려지고 있음을 나타내는 콘텐츠로 대체될 수 있습니다.
일부 시스템은 논리적 디스플레이 표면만 캡처할 수 있습니다. 예를 들어, 작은 화면을 가진 장치는 일반적으로 창의 개념이 없으며, 애플리케이션을 전체 화면 모드로만 렌더링합니다. 이러한 시스템은 현재 표시되지 않는 애플리케이션을 캡처할 수 있으며, 논리적 디스플레이 표면을 캡처하지 않으면 사용할 수 없게 됩니다.
창이나 부분적으로 투명한 다른 디스플레이 표면을 캡처할 때, 그 뒤의 콘텐츠는 캡처되지 않습니다.
예를 들어, 사용자가 화면을 선택할 때 새로 생성된 MediaStreamTrack에
의해 사용자 프롬프트가 웹 페이지에 짧은 시간 동안 노출될 위험이 있습니다. 사용자가 선택할 수 있는 다양한 표면의 미리 보기를 표시하는 사용자 프롬프트의 경우, 이러한 미리 보기는 새로
생성된 MediaStreamTrack에
의해 캡처되지 않습니다.
getDisplayMedia는 비디오와 함께 오디오를
캡처할 수 있도록 하며, 이는 시스템 애플리케이션에 대한 추가 정보를 노출할 수 있기 때문에 프라이버시 및 보안 문제를 초래합니다. 공유된 오디오 소스의 집합은 공유된 비디오
소스의 집합과 반드시 동일하지는 않습니다. 예를 들어, 창의 비디오 캡처가 전체 시스템 오디오를 동반하는 경우, 해당 창과 관련 없는
애플리케이션을 포함하여 사용자의 적극적인 동의 없이는 공유되지 않습니다. 사용자가 공유될 콘텐츠, 특히 오디오를
인지하는 것이 중요합니다. 사용자가 오디오가 없는 비디오만 스트리밍하도록 동의할 수 있도록 허용하는 것이 강력히 권장됩니다. 이를 통해 오디오 요청이 항상 선택 사항이 되며,
비디오 전용 요청에 비해 사용자의 선택이 제한되지 않도록 보장합니다.
구현에서는 [GETUSERMEDIA]에서 권장하는 대로 카메라나 마이크를 공유할 때 제공되는 것과 유사한 사용자 피드백 및 제어 메커니즘을 제공할 것을 권장합니다.
사용자가 콘텐츠가 적극적으로 캡처되고 있을 때 콘텐츠가 공유되고 있음을 인지하는 것이 중요합니다. 사용자 에이전트는 콘텐츠가 캡처되는 동안 눈에 띄는 표시기를 표시할 것을 권장합니다. 표시기에 추가하여, 사용자 에이전트는 정확히 무엇이 공유되고 있는지 알 수 있는 수단을 제공할 것을 권장합니다. 이 기능은 애플리케이션이 캡처된 콘텐츠를 렌더링하여 쉽게 제공할 수 있지만, 이를 통해 사용자는 공유되고 있는 내용을 정확히 평가할 수 있습니다.
피드백 메커니즘 외에도 사용자가 활성 캡처를 중지할 수 있는 수단을 제공하는 것이 좋습니다.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: