스크린 캡처

W3C 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2025/WD-screen-capture-20250717/
최신 발표 버전:
https://www.w3.org/TR/screen-capture/
최신 편집자 초안:
https://w3c.github.io/mediacapture-screen-share/
히스토리:
https://www.w3.org/standards/history/screen-capture/
커밋 히스토리
편집자:
Jan-Ivar Bruaroey (Mozilla)
Elad Alon (Google)
이전 편집자:
Martin Thomson (Mozilla)
Keith Griffin (Cisco)
Suhas Nandakumar (Cisco)
Henrik Boström (Google)
피드백:
GitHub w3c/mediacapture-screen-share (풀 리퀘스트, 새 이슈, 오픈 이슈)
public-webrtc@w3.org 제목 [screen-capture] … 메시지 주제 … (아카이브)
참여하기
메일링 리스트

요약

이 문서는 사용자의 디스플레이 또는 그 일부를 getDisplayMedia를 사용하여 미디어 스트림의 소스로 활용하는 방법을 정의합니다. 이는 Media Capture API [GETUSERMEDIA]의 확장입니다.

문서 현황

이 섹션은 이 문서가 발행된 시점의 상태를 설명합니다. 최신 W3C 출판물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 인덱스에서 확인할 수 있습니다.

이 문서는 아직 완성되지 않았습니다. 주요 변경이 있을 수 있으므로, 초기 실험은 권장되지만 구현을 위한 용도로는 적합하지 않습니다.

이 문서는 웹 실시간 통신 작업 그룹권고 절차를 통해 작업 초안으로 발행한 것입니다.

작업 초안으로 발행되었다고 해서 W3C 및 회원들의 지지를 의미하지는 않습니다.

이 문서는 초안이며, 언제든지 업데이트, 대체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 용도로 이 문서를 인용하는 것은 부적절합니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C공개 특허 공개 목록을 관리하며, 해당 그룹의 산출물과 관련된 특허 공개 내역 및 특허 공개 방법 안내도 포함되어 있습니다. 특정 특허가 필수 청구항을 포함한다고 판단되는 경우, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서에 따라 관리됩니다.

1. 소개

이 섹션은 비규범적입니다.

이 문서는 Media Capture API [GETUSERMEDIA]의 확장에 대해 설명하며, 사용자의 디스플레이 또는 그 일부를 비디오 트랙 형태로 획득할 수 있게 합니다. 경우에 따라 시스템, 애플리케이션 또는 창 오디오도 캡처되어 오디오 트랙 형태로 제공됩니다. 이를 통해 WebRTC [WEBRTC]를 사용한 화면 공유를 포함한 여러 응용 프로그램이 가능합니다.

이 기능은 중대한 보안 영향을 가집니다. 이 API를 사용하여 사용자에게 표시되는 정보를 접근하는 애플리케이션은, 해당 정보가 애플리케이션의 제어 하에 있는 경우 다른 출처의 기밀 정보를 접근할 수 있습니다. 여기에는 사용자 에이전트 샌드박스가 제공하는 보호 때문에 그렇지 않으면 접근할 수 없는 콘텐츠도 포함됩니다.

이 문서는 주로 비디오 및 오디오 [GETUSERMEDIA]의 캡처를 다루지만, 여기서 정의된 일반 메커니즘은 현재 정의된 깊이 [MEDIACAPTURE-DEPTH]와 같이 다른 유형의 미디어로 확장될 수 있습니다.

2. 적합성

비규범적이라고 지정된 섹션들뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예시 및 주석은 비규범적입니다. 이 명세의 다른 모든 내용은 규범적입니다.

이 문서에서 키워드 MAY, MUST, MUST NOT, 및 SHOULD는 모두 대문자로 표시될 때에 한해 BCP 14 [RFC2119] [RFC8174] 에 설명된 대로 해석됩니다.

이 명세는 해당 인터페이스를 구현하는 단일 제품인: user agent에 적용되는 적합성 기준을 정의합니다.

이 명세에 정의된 API를 구현하기 위해 ECMAScript [ECMA-262]를 사용하는 구현체는, 이 명세가 사용하는 용어와 일치하도록 Web IDL 명세에 정의된 ECMAScript 바인딩과 일치하는 방식으로 구현해야 합니다 [WEBIDL].

3. 예시

다음 예시는 이 문서에 정의된 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);
}

4. 용어

이 문서는 MediaStream, MediaStreamTrackConstrainablePattern 의 정의를 [GETUSERMEDIA]에서 사용합니다.

스크린 캡처는 여러 유형의 화면 기반 표면 캡처를 포함합니다. 통칭하여 이러한 것들을 디스플레이 표면이라고 하며, 이 문서에서는 다음 유형들을 정의합니다:

이 문서는 각 유형의 디스플레이 표면에 대해 두 가지 변형을 구분합니다:

일부 운영체제는 서로 다른 애플리케이션의 창이 다른 창을 전체 또는 일부 가려버리는 것을 허용하므로, 보이는 디스플레이 표면논리적 디스플레이 표면의 엄격한 부분집합입니다.

소스 픽셀 비율디스플레이 표면의 수직 픽셀 수로 1/96인치의 길이를 나눈 값입니다.

devicechange 이벤트는 [GETUSERMEDIA]에서 정의되어 있습니다.

5. 표시된 미디어 캡처

표시된 미디어의 캡처는 getDisplayMedia 메서드를 MediaDevices 인터페이스에 추가함으로써 가능해지며, 이는 getUserMedia()와 유사하지만 매 호출마다 최종 사용자가 선택한 단일 디스플레이 장치에서 미디어를 획득한다는 점이 다릅니다.

5.1 MediaDevices 추가사항

WebIDLpartial interface MediaDevices {
  Promise<MediaStream> getDisplayMedia(optional DisplayMediaStreamOptions options = {});
};
getDisplayMedia

사용자에게 그들의 디스플레이를 실시간으로 캡처할 권한을 요청합니다.

사용자 에이전트는 최종 사용자가 매번 공유할 display surface를 모든 가능한 선택지 중에서 직접 선택하도록 허용해야 하며(MUST), options.videooptions.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).

  1. mediaDevicesthis로 둔다.

  2. controlleroptions.controller가 있으면 그 값으로, 그렇지 않으면 null로 둔다.

  3. controllernull이 아닌 경우, 다음 단계를 실행한다:

    1. controller.[[IsBound]]true이면, rejected된 프로미스를 반환하고, 그 이유로 DOMException 객체를 제공하며, 해당 객체의 name 속성은 InvalidStateError 여야 한다.

    2. controller.[[IsBound]]true로 설정한다.

  4. relevant global objectthis의 경우, 해당 객체가 transient activation을 가지고 있지 않으면, rejected된 프로미스를 반환하고, 그 이유로 DOMException 객체를 제공하며, 해당 객체의 name 속성은 InvalidStateError 여야 한다.

  5. 메서드의 첫 번째 인수를 options로 둔다.

  6. constraints[options.audio, options.video]로 둔다.

  7. constraints.videofalse이면, 새로 생성된 rejected된 프로미스를 반환하고 새로 생성된 TypeError를 반환한다.

  8. constraints의 기존 멤버들 각각에 대해, 그 값이 사전(dictionary)인 경우 다음 단계를 실행한다:

    1. CSadvanced 멤버를 포함하면, 새로 생성된 rejected된 프로미스를 반환하고 새로 생성된 TypeError를 반환한다.

    2. CSdisplay surface에 적용 가능한 제약 가능한 속성의 이름을 멤버로 가지고 있고, 그 값이 다시 min 또는 exact 멤버를 포함하는 사전이라면, 새로 생성된 rejected된 프로미스를 반환하고 새로 생성된 TypeError를 반환한다.

    3. CSdisplay surface에 적용 가능한 제약 가능한 속성의 이름을 멤버로 가지고 있고, 그 값이 다시 max 멤버를 포함하며 그 멤버의 값이 해당 제약 가능한 속성의 floor value보다 작다면, failedConstraint를 그 멤버의 이름으로 두고, messageundefined 또는 사람이 읽을 수 있는 설명 메시지 중 하나로 두어, rejected된 프로미스를 반환하며 OverconstrainedError(failedConstraint, message)로 생성된 새 OverconstrainedError를 반환한다.

  9. requestedMediaTypesconstraints에서 사전(dictionary) 값이거나 true인 멤버들의 미디어 타입 집합으로 둔다.

  10. 현재 설정 객체의 관련 전역 객체의 연결된 Document가 완전히 활성화되어 있지 않거나 포커스를 가지고 있지 않다면, 새로 생성된 rejected된 프로미스를 반환하고, 그 이유로 DOMException 객체를 제공하며, 해당 객체의 name 속성은 InvalidStateError 여야 한다.

  11. p를 새 프로미스로 둔다.

  12. 다음 단계를 병렬로 실행한다:

    1. requestedMediaTypes의 각 미디어 타입 T에 대해,

      1. 타입 T의 소스가 전혀 없다면, 작업을 큐에 넣어 사용자 상호작용 작업 소스에서 reject하여 p를 새로 생성된 DOMException 객체(그 객체의 name 속성은 NotFoundError여야 함)로 거부하고 이 단계를 중단한다.

      2. 현재 브라우징 컨텍스트에서 타입 T의 소스를 얻기 위한 권한 상태를 읽는다. 권한 상태가 "denied"이면 PermissionFailure 단계로 이동한다.

    2. 선택적으로(예: 이전에 설정된 사용자 선호, 보안상의 이유, 플랫폼 제한 등으로 인해) Permission Failure 단계로 이동할 수 있다.

    3. 사용자에게 디스플레이 장치를 선택하도록 프롬프트를 표시한다. 이때 PermissionDescriptorname을 "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여야 함)로 거부하고 이 단계를 중단한다.

    4. streamMediaStream 객체로 둔다.

    5. 사용자가 권한을 부여한 각 source에 대해 다음 단계를 실행한다:

      1. tracksourcemediaDevicesMediaStreamTrack 생성의 결과로 둔다.

      2. trackstream의 트랙 집합에 추가한다.

      3. Tie track source to MediaDevicessourcemediaDevices로 실행한다.

    6. stream의 모든 트랙에 대해 적절한 제약을 사용하여 ApplyConstraints algorithm를 실행한다. 실패할 경우, failedConstraint를 실패한 알고리즘의 결과로 두고, messageundefined 또는 사람이 읽을 수 있는 설명 메시지 중 하나로 둔 다음, 작업을 큐에 넣어 사용자 상호작용 작업 소스에서 reject하여 pOverconstrainedError(failedConstraint, message)로 생성된 새 OverconstrainedError로 거부하고 이 단계를 중단한다.

    7. getDisplayMedia() 호출은 이제 새로운 capture-session을 생성한 것으로 간주된다.

    8. 작업을 큐에 넣어 사용자 상호작용 작업 소스에서 다음 단계를 실행한다:

      1. controllernull이 아니면 다음 단계를 실행한다:

        1. controller.[[Source]]stream의 비디오 트랙의 [[Source]]로 설정한다.

        2. controller.[[DisplaySurfaceType]]stream의 비디오 트랙의 DisplayCaptureSurfaceType로 설정한다.

      2. last activation timestampcurrent high resolution time로 설정한다.

      3. Resolve pstream로 한다.

    9. controllernull이 아니면, 작업을 큐에 넣어 사용자 상호작용 작업 소스에서 finalize focus decision algorithmcontroller에 대해 실행한다.

    10. 이 단계들을 중단한다.

    11. Permission Failure: 작업을 큐에 넣어 사용자 상호작용 작업 소스에서 reject하여 p를 새로 생성된 DOMException 객체(그 객체의 name 속성은 NotAllowedError여야 함)로 거부한다.

  13. p를 반환한다.

최상위 문서가 포커스를 잃을 때, 해당 문서와 그 중첩된 browsing contexts의 모든 CaptureController 객체에 대해 다음 단계를 실행한다:

  1. [[Source]]undefined이면, 이 단계들을 중단한다.

  2. [[FocusChangeDisabled]]true로 설정한다.

사용자 에이전트는 부분적으로 투명한 캡처된 display surface 뒤에 있는 내용을 캡처해서는 안 된다(MUST NOT).

새로 생성된 MediaStreamTrack에 대해, 사용자 에이전트는 프롬프트로 사용자에게 표시된 내용을 캡처해서는 안 된다(MUST NOT).

현재 화면에 렌더링되지 않은 정보는 애플리케이션이 해당 콘텐츠에 대해 명시적으로 접근 권한을 부여받지 않은 한(예: elevated permissions과 같은 수단을 통해) 캡처 시 가려져야 한다(SHOULD).

사용자 에이전트는 활성 사용자 동의(active user consent) 없이는 오디오를 공유해서는 안 된다(MUST NOT). 예를 들어, 특정 window의 비디오 캡처가 전체 시스템의 오디오 캡처(그 창과 관련 없는 애플리케이션 포함)를 동반하는 경우가 이에 해당한다.

5.2 닫히거나 최소화된 디스플레이 표면

공유 중인 디스플레이 표면은 운영체제나 사용자 에이전트의 동작으로 인해 일시적이거나 영구적으로 애플리케이션에서 접근 불가능하게 될 수 있습니다. 어떤 것이 디스플레이 표면이 접근 불가능하다고 간주되는지는 이 명세의 범위를 벗어나지만, 예시로는 모니터의 연결 해제, 또는 브라우저의 종료나 최소화, 또는 전화의 수신 통화 등이 포함될 MAY 있습니다.

Note

사용자 에이전트가 궁극적으로 이 문맥에서 '접근 불가능'이 무엇을 의미하는지를 제어하지만, 외부 요인으로 인한 중단에 대해서만 음소거 및 음소거 해제 이벤트를 발생시키는 것이 권장됩니다.

만약 디스플레이 표면이 반드시 영구적이지는 않은 접근 불가능 상태에 들어가면, 사용자 에이전트는 작업을 큐에 넣어 해당하는 미디어 트랙의 muted 상태true로 설정하는 작업을 사용자 상호작용 작업 소스에서 실행해야 합니다(MUST).

만약 디스플레이 표면이 접근 불가능 상태에서 벗어나 접근 가능하게 되면, 사용자 에이전트는 작업을 큐에 넣어 해당하는 미디어 트랙의 muted 상태false로 설정하는 작업을 사용자 상호작용 작업 소스에서 실행해야 합니다(MUST).

만약 디스플레이 표면이 영구적인 접근 불가능 상태(예: 소스인 의 종료)에 들어가면, 사용자 에이전트는 작업을 큐에 넣어 해당하는 미디어 트랙을 종료하는 작업을 사용자 상호작용 작업 소스에서 실행해야 합니다(MUST).

방금 getDisplayMedia에 의해 반환된 스트림은 기본적으로 음소거된 트랙들을 포함할 MAY 있습니다. 동일 스트림에 속한 오디오 및 비디오 트랙은 서로 독립적으로 음소거/음소거 해제될 MAY 있습니다.

5.3 제약 없는 디스플레이 표면 선택

소스 선택에 대한 제약을 수락하지 않는다는 것은 getDisplayMedia가 오디오, 비디오 또는 오디오+비디오 디스플레이 소스가 존재하는지를 노출하는 지문(fingerprinting) 표면만 제공한다는 것을 의미합니다. (이것은 지문 분석 벡터입니다.)

참고로 displaySurface 제약을 수락해도 사용자 선택이 제한되지는 않습니다.

5.4 캡처된 디스플레이 표면에 대한 제약 가능한 속성

제약(constraints)은 getDisplayMedia에서의 목적이 getUserMedia()와는 다릅니다. 제약은 검색을 돕지 않으며, 대신 사용자 선택 이후에만 적용됩니다.

이 섹션에서는 getDisplayMedia 트랙에 적용되는 제약을 정의합니다; getUserMedia()에 대해 정의된 제약은 여기 목록에 포함되지 않는 한 적용되지 않습니다.

이들 중 일부 제약은 사용자 에이전트의 처리(예: 다운스케일링 및 프레임 감산)와 디스플레이 별 기능을 가능하게 합니다. 다른 것들은 사용자 선택한 display surface의 고유 속성을 기능 및 설정으로 관찰할 수 있게 합니다.

다음의 새로운 및 기존 MediaStreamTrack 제약 가능한 속성들은 사용자 선택 비디오 display surface에 적용되며, 다음과 같은 동작을 갖습니다:

속성 이름 형식 동작
width unsigned long 픽셀 단위의 너비입니다. capability로서, max는 MUST 해당 display surface의 너비를 반영해야 하며, min은 사용자 에이전트가 제공하는 종횡비를 유지하는 가장 작은 표현의 너비를 반영해야 합니다(MUST).
height unsigned long 픽셀 단위의 높이입니다. capability로서, max는 MUST 해당 display surface의 높이를 반영해야 하며, min은 사용자 에이전트가 제공하는 종횡비를 유지하는 가장 작은 표현의 높이를 반영해야 합니다(MUST).
frameRate double 초당 프레임 수(frame per second)입니다. capability로서, max는 MUST 해당 display surface의 프레임레이트를 반영해야 하며, min은 사용자 에이전트가 제공하는 프레임 감산(frame decimation)을 통해 얻을 수 있는 가장 낮은 프레임레이트를 반영해야 합니다(MUST).
aspectRatio double 정확한 종횡비(픽셀 단위의 너비를 픽셀 단위의 높이로 나눈 값, 소수점 열 번째 자리까지 반올림하여 double로 표현) 또는 종횡비 범위입니다. 설정(setting)으로서는 width / height를 나타냅니다. capability로서는 min과 max가 모두 MUST 현재 설정 값을 가져야 하므로 애플리케이션 관점에서는 이 속성이 변경 불가능합니다.
resizeMode DOMString 이 문자열은 VideoResizeModeEnum의 멤버 중 하나입니다. 설정으로서, "none" 은 MediaStreamTrack가 디스플레이를 전체 해상도로 렌더링하는 데 필요한 모든 비트를 포함함을 의미합니다. 만약 source pixel ratio > 1이면, 이는 사용자 관점에서 보이는 디스플레이보다 widthheight가 더 클 수 있음을 뜻합니다. 반면에 "crop-and-scale" 는 MediaStreamTrack가 사용자 에이전트에 의해 다운스케일된, 종횡비가 보존된 display surface의 표현을 포함하되 잘라내지는 않았음을 의미합니다. capability로서는 "none"와 "crop-and-scale"의 값이 둘 다 포함되어야 합니다(MUST).
deviceId DOMString 캡처되는 표면의 식별자입니다.

설정으로서, 캡처되고 있는 display surface를 식별합니다. 이 식별자는 각 document마다 고유하게 생성되어야 합니다(MUST).

capability로서, 설정 값은 유일한 값이어야 하며, 애플리케이션 관점에서는 이 속성이 변경 불가능합니다(MUST).

displaySurface DOMString

이 문자열은 DisplayCaptureSurfaceType의 멤버 중 하나입니다.

설정으로서, 캡처 중인 display surface의 유형을 나타냅니다.

capability로서, 설정 값은 유일한 값이어야 하며, 애플리케이션 관점에서는 이 속성이 변경 불가능합니다(MUST).

제약으로서, 이 값은 애플리케이션이 특정 display surface 유형을 사용자 에이전트에 선호로 신호하는 역할을 합니다; 사용자 에이전트는 해당 선호에 따라 사용자에게 제공되는 옵션의 순서를 다시 정렬할 수 있습니다(MAY). 이 제약은 다른 목적에는 무시되며, 따라서 어떠한 부작용(예: OverconstrainedError의 원인)이 발생할 수 없습니다.

logicalSurface boolean 설정으로서, 값이 true이면 논리적 디스플레이 표면을 캡처함을 나타내고, 값이 false이면 보이는 디스플레이 표면을 캡처함을 나타냅니다. capability로서는 이 동일한 값이 유일한 값이어야 하므로 애플리케이션 관점에서는 이 속성이 변경 불가능합니다(MUST).
cursor DOMString 이 문자열은 CursorCaptureConstraint의 멤버 중 하나입니다. 설정으로서, 캡처된 display surface에 커서가 포함되는 시점과 여부를 나타냅니다. capability로서, 사용자 에이전트는 이 CursorCaptureConstraint에서 이 display surface에 대해 지원할 수 있는 값들의 집합만 포함해야 합니다(MUST).
screenPixelRatio double 설정으로서, 이는 CSS 픽셀의 크기를 page zoom이 1.0일 때와 scale factor가 1.0일 때의 수직 픽 크기로 나눈 결과입니다. 이는 display surface의 픽셀에 대한 비율입니다. 이 값은 제약이나 capability로 사용할 수 없습니다.

다음의 새로운 및 기존 MediaStreamTrack 제약 가능한 속성들은 사용자 선택 오디오 소스에 적용되며, 다음과 같은 동작을 갖습니다:

속성 이름 형식 동작
restrictOwnAudio boolean

설정으로서 이 값은 사용자 에이전트가 소스에 대해 own audio restriction을 적용하고 있는지 여부를 나타냅니다.

제약으로서, 이 속성은 제약되어 소스에 대해 own audio restriction이 활성화되거나 비활성화되도록 할 수 있습니다.

own audio restriction이 적용되면, 사용자 에이전트는 getDisplayMedia를 실행한 문서에서 생성된 오디오를 캡처 오디오에서 제거하려 시도해야 합니다(MUST). 사용자 에이전트가 처리로 오디오를 제거할 수 없을 경우, 문서의 오디오를 캡처에서 제외함으로써 오디오를 제거해야 합니다(SHOULD). 만약 이로 인해 아무 오디오도 캡처되지 않게 되면, 사용자 에이전트는 다시 오디오를 캡처할 수 있을 때까지 트랙을 음소거 상태로 유지해야 합니다(MUST).

suppressLocalAudioPlayback boolean

설정으로서 이 값은 애플리케이션이 사용자 에이전트에 대해 소스에 local audio playback suppression을 적용하도록 지시했는지를 나타냅니다.

제약으로서, 이 값은 사용자가 browser display surface를 캡처하도록 선택한 경우에만 의미가 있습니다. 그 경우 값이 true이면 사용자 에이전트는 캡처된 browser display surface에 대해 local audio playback suppression을 수행해야 합니다(SHOULD).

local audio playback suppression이 적용되면, 사용자 에이전트는 로컬 스피커로의 오디오 전달을 중지해야 합니다(SHOULD), 그러나 해당 오디오는 여전히 진행 중인 오디오 캡처 세션들에 의해 캡처되어야 합니다(MUST). 이 억제는 캡처된 문서에 대해 관찰 가능해져서는 안 됩니다. 또한 캡처하는 문서는 자신이 suppressLocalAudioPlayback를 적용하고 있는지 여부만 관찰할 수 있으며; 그 억제가 실제로 효과를 발휘하고 있는지(예: 사용자가 사용자 에이전트에서 이를 재정의했는지)는 관찰할 수 없습니다.

browser display surface가 동시에 여러 캡처의 대상이 되는 경우, local audio playback suppression은 적어도 하나의 활성 오디오 캡처 capture-sessionsuppressLocalAudioPlaybacktrue로 제약하고 있는 한 적용되어야 합니다(SHOULD).

사용자 선택한 display surface의 근본 소스에 내재된 속성들이 변경될 때(예: 최종 사용자가 캡처된 창의 크기를 변경하는 경우) 이러한 변경으로 인해 하나 이상 제약 가능한 속성의 capability 및/또는 설정이 오래된 것으로 간주되면, 사용자 에이전트는 작업을 큐에 넣어 사용자 상호작용 작업 소스에서 다음 단계를 실행해야 합니다(MUST).

  1. 영향받는 모든 제약 가능한 속성을 동시에 업데이트합니다.

    만약 이로 인해 "overconstrained" 상황이 발생하면, 사용자 에이전트는 해당 과도 제약을 그 제약이 과도한 동안 무시해야 합니다(MUST). 사용자 에이전트는 트랙을 음소거해서는 안 됩니다(MUST NOT).

참고

min 및 exact 제약은 getDisplayMedia()에서 TypeError를 발생시키지만, 이 명세는 track.applyConstraints() 메서드를 변경하지 않습니다. 따라서 해당 제약들은 대신 값에 따라 OverconstrainedError를 발생시키거나 성공할 수 있으며, 그로 인해 이 "overconstrained" 상황을 일으킬 수 있습니다. max 제약도 예를 들어 aspectRatio와 같이 이 상황을 초래할 수 있습니다. 이 명세는 이러한 것을 유용하지 않은 엣지 케이스로 간주합니다.

5.4.1 다운스케일링 및 프레임 감산

SelectSettings 알고리즘의 목적을 위해, 사용자 에이전트는 원본 display surface의 종횡비를 유지하는(가장 가까운 픽셀 단위로) 모든 가능한 다운스케일된 치수 조합과 프레임 감산을 통해 이용 가능한 프레임레이트를 가능한 settings dictionaries로 간주해야 합니다(SHOULD).

제약의 다운스케일링 및 감산 효과는 사실상 fitness distance 알고리즘에 의해 지배됩니다.

목표는 사용자 에이전트가 이상적인 width, 이상적인 height, 및/또는 이상적인 frameRate가 지정된 경우 이들에 가까운 출력을 생성하도록 하는 것이며, 언제나 원본 display surface의 종횡비를 보존해야 합니다.

사용자 에이전트는 적용된 제약에 별도 지시가 없는 한 기본적으로 source pixel ratio만큼 다운스케일링해야 합니다(SHOULD).

사용자 에이전트는 캡처된 출력물을 잘라내어서는 안 됩니다(MUST NOT).

사용자 에이전트는 집계된 display surface에서 높은 해상도와 프레임레이트를 보존해야 할 필요가 있을 때를 제외하고는 캡처된 출력을 업스케일하거나 추가 프레임을 생성해서는 안 됩니다(MUST NOT).

Note

max 제약 유형은 웹 애플리케이션이 width와 height 같은 제약 가능한 속성에 대한 최대 한계를 제공할 수 있게 합니다. 이는 최종 사용자가 캡처되는 동안 windowbrowser 표면을 극단적으로 리사이즈할 경우 극단적인 종횡비를 제한하는 데 유용합니다.

이 명세의 양의 숫자형 제약 가능한 속성 각각에 대해, 사용자 에이전트는 소스와 상관없이 지원되는 가장 작은 허용 값을 나타내는 floor value를 정해야 합니다. 이 값은 MUST 상수여야 하며 MUST 0보다 커야 합니다. 사용자 에이전트는 소스와 상관없이 floor value보다 큰 모든 값을 지원하는 것이 권장됩니다.

Note

floor value의 목적은 사용자에게 이미 프롬프트를 표시한 후에 getDisplayMedia()OverconstrainedError로 실패하는 것을 방지하고, 사용자의 시스템에 대한 정보 누출을 피하도록 돕는 것입니다.

5.4.2 CaptureStartFocusBehavior

애플리케이션이 setFocusBehavior()를 호출할 때, 해당 display surface와 연관된 해당 CaptureControllercapture-session에 포커스를 맞추기를 사용자 에이전트에게 원하는지 여부를 설명합니다.

WebIDLenum CaptureStartFocusBehavior {
  "focus-capturing-application",
  "focus-captured-surface",
  "no-focus-change"
};
Enumeration description
focus-capturing-application 애플리케이션이 포커스를 갖기를 선호합니다.
focus-captured-surface 애플리케이션은 이 display surface와 연관된 해당 CaptureControllercapture-session에 포커스를 맞추는 것을 선호합니다.
no-focus-change 애플리케이션은 사용자 에이전트가 포커스를 변경하지 않고, 사용자와 사용자 에이전트/운영체제 간의 상호작용 이후 마지막으로 포커스를 가졌던 표면에 포커스를 그대로 유지하기를 선호합니다.
Note
작업 그룹은 "no-focus-change" 의 사용 중단 가능성을 조사 중입니다.

5.4.3 CaptureController

CaptureController 객체는 capture-session과 연관될 수 있습니다. 이는 capture-session 자체와 관련된 기능을 노출하는 데 사용되며, getDisplayMedia() 호출이나 그 결과 스트림 또는 트랙과는 관련이 없습니다.

어떤 capture-session도 최대 하나의 CaptureController와 연관됩니다.

어떤 CaptureController도 최대 하나의 capture-session과 연관됩니다.

WebIDL[Exposed=Window, SecureContext]
interface CaptureController : EventTarget {
  constructor();
  undefined setFocusBehavior(CaptureStartFocusBehavior focusBehavior);
};
(Feature at Risk) Issue 1

CaptureController는 아직 이벤트 핸들러를 정의하지 않았으므로, EventTarget을 상속받을 필요가 없습니다. 이는 이벤트 핸들러 속성으로 CaptureController를 확장하는 향후 명세의 이점을 위한 것입니다; 상속이 사용되지 않으면 제거될 수 있습니다.

constructor
새로운 CaptureController 객체를 다음 내부 슬롯과 함께 생성합니다:
내부 슬롯 초기 값 설명 (비규범적)
[[IsBound]] false 애플리케이션이 thiscapture-session에 연결하려 시도했는지 여부.
[[Source]] null 연관된 capture-session의 소스.
[[DisplaySurfaceType]] null 캡처가 시작되면, 이는 캡처된 display surface의 유형으로 설정됩니다.
[[FocusChangeDisabled]] false 외부 이벤트나 사용자 에이전트 고려에 의해 포커스 변경이 비활성화되었는지 여부.
[[FocusDecisionFinalized]] false 포커스 결정이 완료되었을 때 true로 설정됩니다.
[[FocusBehavior]] null 애플리케이션이 원하는 포커스 동작.

사용자 에이전트는 자신의 로직에 따라 언제든지 [[FocusChangeDisabled]]true로 설정할 MAY 있습니다.

setFocusBehavior

다음 단계를 실행합니다:

  1. 메서드의 첫 번째 인수를 focusBehavior로 둡니다.

  2. this.[[Source]]null이라면, this.[[FocusBehavior]]focusBehavior로 설정하고 이 단계를 중단합니다.

  3. this.[[Source]]stopped된 경우, throw "InvalidStateError" DOMException을 던집니다.

  4. this.[[DisplaySurfaceType]]가 "browser"나 "window"가 아니라면, throw "InvalidStateError" DOMException을 던집니다.

  5. this.[[FocusDecisionFinalized]]true라면, throw "InvalidStateError" DOMException을 던집니다.

  6. this.[[FocusBehavior]]focusBehavior로 설정합니다.

  7. finalize focus decision algorithmthis에서 실행합니다.

finalize focus decision algorithmcontroller를 받아 다음 단계를 실행합니다:

  1. 캡처 세션이 시작된 이후 너무 많은 시간이 경과한 경우, 사용자 에이전트는 [[FocusDecisionFinalized]]true로 설정해야 합니다(SHOULD). 경과 시간은 사용자 에이전트에 맡기지만, 1초의 값을 사용하는 것이 권장됩니다.

  2. controller.[[FocusDecisionFinalized]]true인 경우, 이 단계를 중단합니다.

  3. controller.[[FocusDecisionFinalized]]true로 설정합니다.

  4. controller.[[FocusChangeDisabled]]true인 경우, 이 단계를 중단합니다.

  5. controller.[[DisplaySurfaceType]]가 "browser"나 "window"가 아니라면, 이 단계를 중단합니다.

  6. controller.[[FocusBehavior]]focusBehavior로 설정합니다.

  7. 다음 단계를 병렬로 실행합니다:

    1. focusBehavior가 "focus-capturing-application"인 경우, 캡처하는 문서를 나타내는 display surface에 포커스를 맞춥니다.

    2. focusBehavior가 "focus-captured-surface"인 경우, controller.[[Source]]가 참조하는 display surface에 포커스를 맞춥니다.

5.4.4 SelfCapturePreferenceEnum

애플리케이션이 사용자가 선택할 수 있는 옵션에 애플리케이션이 위치한 display surface를 포함할지에 대한 힌트를 제공할 수 있는 다양한 방법을 설명합니다.

WebIDLenum SelfCapturePreferenceEnum {
  "include",
  "exclude"
};
열거형 값 설명
include 애플리케이션은 해당 표면이 사용자에게 제공되는 선택지에 포함되기를 선호합니다.
exclude 애플리케이션은 해당 표면이 사용자에게 제공되는 선택지에서 제외되기를 선호합니다.

5.4.5 SystemAudioPreferenceEnum

애플리케이션이 getDisplayMedia()를 호출할 때, 사용자 에이전트가 monitor display surfaces를 위해 사용자에게 제공되는 오디오 소스에 시스템 오디오를 포함할지에 대한 설명입니다. 다른 유형의 display surface에는 적용되지 않습니다.

WebIDLenum SystemAudioPreferenceEnum {
  "include",
  "exclude"
};
열거형 설명
include 애플리케이션은 monitor display surfaces를 위해 시스템 오디오를 공유하는 옵션이 사용자에게 제공되기를 선호합니다.
exclude 애플리케이션은 monitor display surfaces를 위해 시스템 오디오를 공유하는 옵션이 사용자에게 제공되지 않기를 선호합니다.

5.4.9 DisplayMediaStreamOptions

DisplayMediaStreamOptions 사전은 사용자 에이전트에 MediaStreamTrackMediaStream에 포함될 수 있도록 getDisplayMedia가 반환하는 지침을 제공하는 데 사용됩니다.

WebIDLdictionary DisplayMediaStreamOptions {
  (boolean or MediaTrackConstraints) video = true;
  (boolean or MediaTrackConstraints) audio = false;
  CaptureController controller;
  SelfCapturePreferenceEnum selfBrowserSurface;
  SystemAudioPreferenceEnum systemAudio;
  WindowAudioPreferenceEnum windowAudio;
  SurfaceSwitchingPreferenceEnum surfaceSwitching;
  MonitorTypeSurfacesEnum monitorTypeSurfaces;
};
video 타입 (boolean or MediaTrackConstraints), 기본값 true

true인 경우, 반환된 MediaStream에 비디오 트랙이 포함되도록 요청합니다. Constraints 구조가 제공된 경우, 이는 사용자가 선택한 디스플레이 표면의 비디오 트랙 렌더링에 적용할 추가 처리 옵션을 지정합니다. false인 경우, 요청은 거부되며, TypeError를 발생시킵니다. 이는 getDisplayMedia 알고리즘에 따라 처리됩니다.

audio 타입 (boolean or MediaTrackConstraints), 기본값 false

true인 경우, 반환된 MediaStream에 오디오 트랙이 포함되도록 요청합니다. 오디오 트랙이 지원되고 사용자가 선택한 디스플레이 표면에 오디오가 사용 가능한 경우에만 포함됩니다. Constraints 구조가 제공된 경우, 이는 오디오 트랙에 적용할 추가 처리 옵션을 지정합니다. false인 경우, MediaStream에 오디오 트랙이 포함되지 않습니다.

controller 타입 CaptureController

존재하는 경우, 이 CaptureController 객체는 capture-session과 연관됩니다. 이 객체에서 노출된 메서드를 통해 capture-session을 조작할 수 있습니다.

selfBrowserSurface 타입 SelfCapturePreferenceEnum
존재하는 경우, browser display surface를 사용자에게 제공되는 선택지에 포함시킬지에 대한 애플리케이션 선호도를 나타냅니다. 사용자 에이전트는 이 힌트를 무시할 수 있습니다(MAY).
systemAudio 타입 SystemAudioPreferenceEnum
존재하는 경우, monitor display surfaces를 위해 사용자에게 제공되는 오디오 소스에 시스템 오디오를 포함시킬지에 대한 애플리케이션 선호도를 나타냅니다. 사용자 에이전트는 이 힌트를 무시할 수 있습니다(MAY).
windowAudio 타입 WindowAudioPreferenceEnum
존재하는 경우, window display surfaces를 위해 사용자에게 제공되는 오디오 소스에 창 또는 시스템 오디오를 포함시킬지에 대한 애플리케이션 선호도를 나타냅니다. 사용자 에이전트는 이 힌트를 무시할 수 있습니다(MAY).
surfaceSwitching 타입 SurfaceSwitchingPreferenceEnum
존재하는 경우, 애플리케이션이 사용자 에이전트에 캡처된 display surface를 동적으로 전환할 옵션을 사용자에게 제공하도록 요청할지에 대한 선호도를 나타냅니다. 사용자 에이전트는 이 힌트를 무시할 수 있습니다(MAY).
monitorTypeSurfaces 타입 MonitorTypeSurfacesEnum

존재하는 경우, 애플리케이션이 사용자 에이전트에 display surfaces를 사용자에게 제공되는 선택지에 포함시키도록 요청할지에 대한 선호도를 나타냅니다. 사용자 에이전트는 이 힌트를 무시할 수 있습니다(MAY).

참고

사용자 에이전트는 여전히 display surfaces를 캡처할 옵션을 사용자에게 제공할 수 있습니다. 따라서 애플리케이션은 여전히 수신된 트랙의 displaySurface 설정을 확인하는 것이 좋습니다.

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 제약 조건이 인식되는지 여부.

5.4.11 MediaTrackConstraintSet 확장

MediaTrackConstraintSet은 제약 조건의 현재 상태를 읽는 데 사용됩니다.

WebIDLpartial dictionary MediaTrackConstraintSet {
  ConstrainDOMString displaySurface;
  ConstrainBoolean logicalSurface;
  ConstrainDOMString cursor;
  ConstrainBoolean restrictOwnAudio;
  ConstrainBoolean suppressLocalAudioPlayback;
};
displaySurface 타입 ConstrainDOMString

캡처되고 있는 display surface의 유형입니다. 이는 DisplayCaptureSurfaceType 열거형에서 값을 가집니다.

logicalSurface 타입 ConstrainBoolean

true 값은 논리적 디스플레이 표면을 캡처함을 나타내며, false 값은 보이는 디스플레이 표면을 캡처함을 나타냅니다.

cursor 타입 ConstrainDOMString

캡처된 디스플레이 표면에 커서를 포함할지 여부와 시점을 결정하는 CursorCaptureConstraint 열거형에서 값을 가집니다.

restrictOwnAudio 타입 ConstrainBoolean

이 제약 조건은 오디오 트랙에만 적용됩니다. restrictOwnAudio를 참조하십시오.

suppressLocalAudioPlayback 타입 ConstrainBoolean

이 제약 조건은 오디오 트랙에만 적용됩니다. suppressLocalAudioPlayback를 참조하십시오.

5.4.12 MediaTrackSettings 확장

비디오 스트림 트랙에서 getSettings() 메서드가 호출될 때, 사용자 에이전트는 기본 사용자 에이전트의 현재 상태를 나타내는 확장된 MediaTrackSettings 사전을 반환해야 합니다.

WebIDLpartial dictionary MediaTrackSettings {
  DOMString displaySurface;
  boolean logicalSurface;
  DOMString cursor;
  boolean restrictOwnAudio;
  boolean suppressLocalAudioPlayback;
  double screenPixelRatio;
};
displaySurface 타입 DOMString

캡처되고 있는 display surface의 유형입니다. 이는 DisplayCaptureSurfaceType 열거형에서 값을 가집니다.

logicalSurface 타입 boolean

true 값은 논리적 디스플레이 표면을 캡처함을 나타내며, false 값은 보이는 디스플레이 표면을 캡처함을 나타냅니다.

cursor 타입 DOMString

캡처된 디스플레이 표면에 커서를 포함할지 여부와 시점을 결정하는 CursorCaptureConstraint 열거형에서 값을 가집니다.

restrictOwnAudio 타입 boolean

restrictOwnAudio 제약 조건이 적용되었는지 (true) 또는 적용되지 않았는지 (false)를 나타냅니다.

suppressLocalAudioPlayback 타입 boolean

애플리케이션이 사용자 에이전트에 소스에 로컬 오디오 재생 억제를 적용하도록 지시했는지 여부를 나타냅니다.

screenPixelRatio 타입 double

캡처되고 있는 디스플레이 표면의 화면 픽셀 비율.

5.4.13 MediaTrackCapabilities 확장

비디오 스트림 트랙에서 getCapabilities() 메서드가 호출될 때, 사용자 에이전트는 기본 사용자 에이전트의 기능을 나타내는 확장된 MediaTrackCapabilities 사전을 반환해야 합니다.

WebIDLpartial dictionary MediaTrackCapabilities {
  DOMString displaySurface;
  boolean logicalSurface;
  sequence<DOMString> cursor;
};
displaySurface 타입 DOMString

MUSTgetSettings() 메서드가 반환하는 값과 동일해야 하며, 애플리케이션 관점에서 이 속성을 변경할 수 없게 합니다.

logicalSurface 타입 boolean

MUSTgetSettings() 메서드가 반환하는 값과 동일해야 하며, 애플리케이션 관점에서 이 속성을 변경할 수 없게 합니다.

cursor 타입 sequence<DOMString>

MUST는 사용자 에이전트가 이 트랙에 대해 지원할 수 있는 CursorCaptureConstraint 열거형의 값 집합과 정확히 일치해야 합니다.

5.4.14 DisplayCaptureSurfaceType

DisplayCaptureSurfaceType 열거형은 디스플레이 표면의 다양한 유형을 설명합니다.

WebIDLenum DisplayCaptureSurfaceType {
  "monitor",
  "window",
  "browser"
};
열거형 값 설명
monitor 모니터 디스플레이 표면, 물리적 디스플레이 또는 물리적 디스플레이의 모음
window 디스플레이 표면, 또는 단일 애플리케이션 창
browser 브라우저 디스플레이 표면, 또는 단일 브라우저 창

5.4.15 CursorCaptureConstraint

CursorCaptureConstraint 는 커서가 캡처되는 조건을 열거합니다.

WebIDLenum CursorCaptureConstraint {
  "never",
  "always",
  "motion"
};
열거형 값 설명
never "never" 커서 캡처 제약 조건은 캡처된 디스플레이 표면에서 커서를 생략합니다.
always "always" 커서 캡처 제약 조건은 캡처된 디스플레이 표면에 커서를 포함합니다.
motion "motion" 커서 캡처 제약 조건은 커서/포인터가 이동할 때 캡처된 디스플레이 표면에 커서를 포함합니다. 캡처된 커서는 사용자 에이전트에 의해 결정된 특정 시간 동안 포인터/커서의 추가 이동이 없을 경우 제거됩니다.

5.5 디바이스 식별자

캡처의 각 잠재적 소스는 이 API에서 개별 미디어 소스로 처리됩니다. 그러나 디스플레이 캡처 소스는 enumerateDevices() 에 의해 열거되어서는 안 됩니다. 이는 호스트 시스템에 대한 과도한 정보를 노출시킬 수 있기 때문입니다.

따라서 디스플레이 캡처 소스는 deviceId 제약 조건으로 선택할 수 없습니다. 이는 해당 deviceId가 노출되지 않기 때문입니다.

참고

이는 동일한 이름을 가진 알고리즘에서 프라이버시 지표를 구현하기 위해 사용되는 안정적이고 비공개적인 ID와 혼동해서는 안 됩니다.

6. 권한 통합

화면 캡처강력한 기능으로, "display-capture"라는 이름으로 식별되며, 사용하기 위해 명시적 권한을 요구합니다.

권한 사양과의 통합을 위해 필수적인 요구사항으로, 본 사양은 다음을 정의합니다:

권한 상태 제약
이 설명자의 권한 상태에 대한 유효 값은 "prompt"와 "denied"입니다. 사용자 에이전트는 이 설명자의 권한 상태를 "granted"로 설정해서는 안 됩니다.

7. 권한 정책 통합

이 사양은 문자열 "display-capture"로 식별되는 정책 제어 기능을 정의합니다. 기본 허용 목록은 "self"입니다.

참고

문서권한 정책은 해당 문서의 모든 콘텐츠가 getDisplayMedia를 사용할 수 있는지 여부를 결정합니다. 특정 문서에서 비활성화된 경우, 문서 내의 어떤 콘텐츠도 사용 허용되지 않습니다 getDisplayMedia. 이는 사용자에게 선택을 요청 알고리즘에 의해 강제됩니다.

8. 프라이버시 지표 요구사항

이 사양은 프라이버시 지표 요구사항을 확장하여 getDisplayMedia를 포함합니다.

이 사양에서 [[devicesLiveMap]], [[devicesAccessibleMap]], 그리고 [[kindsAccessibleMap]]에 대한 참조는 getUserMedia()의 프라이버시 지표 요구사항을 지원하기 위해 이미 생성된 정의를 참조합니다.

getDisplayMedia에 의해 노출되는 각 kind의 디바이스에 대해, 디바이스의 안정적이고 비공개적인 ID deviceId를 사용하여, kind"Display" + kind로 설정하고 다음 작업을 수행합니다:

그런 다음, 위의 새로운 정의를 통해 사용자 에이전트에 대한 요구사항은 프라이버시 지표 요구사항에 명시된 요구사항과 동일합니다 getUserMedia().

참고

비록 getDisplayMedia에 대한 단일 권한 설명자가 있더라도, 위의 정의는 kind별로 구분하여 사용자 에이전트가 특정 시점에 공유되고 있는 디스플레이 소스의 종류를 최종 사용자에게 표시하는 프라이버시 지표를 구현할 수 있도록 합니다.

참고

이 사양은 사용자 에이전트가 "granted" 권한을 지속적으로 유지하는 것을 금지하기 때문에, "Live" 지표만이 중요합니다.

사용자 에이전트는 사용 가능한 소스 세트의 변경 사항에 따라 devicechange 이벤트를 발생시켜서는 안 됩니다.

9. 보안 및 권한

이 섹션은 정보 제공용입니다. 그러나 여기에 포함된 조언을 따르지 않을 경우 플랫폼 보안에 심각한 위험을 초래할 수 있음을 주의해야 합니다.

표시된 콘텐츠를 캡처하는 것이 사용자 프라이버시와 보안에 미치는 위험은 두 가지입니다. 첫 번째로, 사용자가 의도하지 않은 콘텐츠를 공유하거나 공유된다는 사실을 인지하지 못할 가능성이 있는 즉각적이고 분명한 위험이 있습니다.

디스플레이 캡처는 브라우저 샌드박스에서 제공하는 교차 사이트 요청 위조 방어 기능에 덜 분명한 위험을 초래합니다. 애플리케이션이 직접적으로 접근할 수 없는 정보를 간접적으로라도 제어할 수 있는 경우, 디스플레이 및 정보 캡처가 해당 애플리케이션이 직접적으로 접근할 수 없는 정보를 접근 가능하게 할 수 있습니다. 예를 들어, 캔버스 API는 캔버스 샘플링을 허용하지 않으며, 원본이 깨끗하지 않은 경우 접근 가능한 형태로 변환할 수 없습니다 [2DCONTEXT].

이 문제는 [RTCWEB-SECURITY-ARCH] 및 [RTCWEB-SECURITY]에서 더 자세히 논의됩니다.

특히 애플리케이션이 어떤 형태로든 제어하는 브라우저 창을 포함한 디스플레이 캡처는 이러한 기본 보안 보호 기능을 위반할 위험이 있습니다. 이 위험은 브라우저 창에 국한되지 않으며, 운영 체제에 따라 브라우저 애플리케이션과 기타 애플리케이션 간 제어 채널에도 영향을 미칩니다. 캡처된 디스플레이 표면이 결과 미디어를 수신하는 애플리케이션에서 비밀로 유지해야 하는 정보를 표시하도록 유도될 수 있는지 여부가 주요 고려 사항입니다.

9.1 논리적 또는 가시적 디스플레이 표면 캡처

논리적 디스플레이 표면의 캡처는 사용자가 인지하지 못한 콘텐츠가 공유될 가능성을 초래합니다. 논리적 디스플레이 표면은 사용자가 노출하려고 하지 않는 정보를 렌더링할 수 있습니다. 이 정보가 가시적인 경우 이러한 문제를 더 쉽게 인식할 수 있습니다. 이와 같은 수단은 기계에는 효과가 없을 수 있지만, 인간 수신자는 잠시만 나타나는 콘텐츠를 처리하기 어렵습니다.

현재 화면에 렌더링되지 않은 정보는 애플리케이션이 상승된 권한을 통해 해당 콘텐츠에 접근하도록 명시적으로 허가받지 않은 경우 캡처에서 가려지도록 권장됩니다.

논리적 디스플레이 표면의 가려진 영역이 가시적 디스플레이 표면 캡처를 생성하기 위해 캡처되는 방식은 다를 수 있습니다. 프레젠테이션 소프트웨어와 같은 일부 애플리케이션은 화면의 가려진 부분이 가려지기 전에 표시된 이미지를 렌더링하면 이점이 있습니다. 이미지 동결은 변경되는 콘텐츠에 대해 시각적 왜곡을 초래하거나 콘텐츠가 가려지고 있음을 숨길 수 있습니다. 캡처된 부분이 동결된 경우 이를 버그로 잘못 인식할 수 있습니다. 반대로, 가려진 영역은 회색 색상이나 해칭과 같이 가려지고 있음을 나타내는 콘텐츠로 대체될 수 있습니다.

일부 시스템은 논리적 디스플레이 표면만 캡처할 수 있습니다. 예를 들어, 작은 화면을 가진 장치는 일반적으로 의 개념이 없으며, 애플리케이션을 전체 화면 모드로만 렌더링합니다. 이러한 시스템은 현재 표시되지 않는 애플리케이션을 캡처할 수 있으며, 논리적 디스플레이 표면을 캡처하지 않으면 사용할 수 없게 됩니다.

이나 부분적으로 투명한 다른 디스플레이 표면을 캡처할 때, 그 뒤의 콘텐츠는 캡처되지 않습니다.

예를 들어, 사용자가 화면을 선택할 때 새로 생성된 MediaStreamTrack에 의해 사용자 프롬프트가 웹 페이지에 짧은 시간 동안 노출될 위험이 있습니다. 사용자가 선택할 수 있는 다양한 표면의 미리 보기를 표시하는 사용자 프롬프트의 경우, 이러한 미리 보기는 새로 생성된 MediaStreamTrack에 의해 캡처되지 않습니다.

9.1.1 오디오 캡처

getDisplayMedia는 비디오와 함께 오디오를 캡처할 수 있도록 하며, 이는 시스템 애플리케이션에 대한 추가 정보를 노출할 수 있기 때문에 프라이버시 및 보안 문제를 초래합니다. 공유된 오디오 소스의 집합은 공유된 비디오 소스의 집합과 반드시 동일하지는 않습니다. 예를 들어, 의 비디오 캡처가 전체 시스템 오디오를 동반하는 경우, 해당 창과 관련 없는 애플리케이션을 포함하여 사용자의 적극적인 동의 없이는 공유되지 않습니다. 사용자가 공유될 콘텐츠, 특히 오디오를 인지하는 것이 중요합니다. 사용자가 오디오가 없는 비디오만 스트리밍하도록 동의할 수 있도록 허용하는 것이 강력히 권장됩니다. 이를 통해 오디오 요청이 항상 선택 사항이 되며, 비디오 전용 요청에 비해 사용자의 선택이 제한되지 않도록 보장합니다.

9.2 디스플레이 캡처 권한 부여

이 문서는 구현에서 사용자 동의를 확인하는 메커니즘에 추가적인 제한을 제공할 것을 권장합니다. 이러한 제한은 API가 초래할 수 있는 보안 및 프라이버시 위험을 완화하기 위해 설계되었습니다.

동의 상호작용은 두 가지 형태로 설명됩니다: 사용자의 적극적인 동의와 다양한 상승된 권한입니다. 이는 비규범적 권장 사항입니다.

9.2.2 상승된 권한

콘텐츠에 대한 교차 출처 보호를 우회하는 데 사용될 수 있는 디스플레이 표면에 접근하기 위해 상승된 권한이 요구되는 것이 강력히 권장됩니다. 이 동의 과정의 주요 목표는 사용자가 콘텐츠를 공유하려는 의도를 보여주는 것뿐만 아니라, 접근 권한을 부여받는 애플리케이션에 대해 사용자가 높은 신뢰 수준을 보인다는 것을 확인하는 것입니다.

상승된 권한을 부여하기 위해 여러 가지 다른 제어가 제공될 수 있습니다. 이 섹션에서는 독립적으로 부여될 수 있는 여러 가지 기능을 설명합니다. 사용자 에이전트상승된 권한이 필요한 모든 기능에 대한 접근을 금지할 수 있습니다.

이 표면에 대한 접근이 지원되는 경우, 상승된 권한을 획득하기 위한 메커니즘이 단순한 사용자 동의 프롬프트에만 의존하지 않는 것이 강력히 권장됩니다. 모든 조치는 상승된 권한으로 애플리케이션을 승인하기로 한 결정이 신중한 것임을 보장해야 합니다. 예를 들어, 사용자 에이전트상승된 권한에 대한 사용자 동의가 부여되었음을 나타내기 위해 소프트웨어 설치와 동등한 프로세스를 요구할 수 있습니다.

상승된 권한 경험은 사용자 에이전트가 이 기능을 활성화하는 것과 관련된 위험을 전달하거나, 최소한 애플리케이션에 대한 신뢰 수준이 높아야 함을 전달할 수 있도록 허용할 수 있습니다.

상승된 권한사용자의 적극적인 동의를 대체할 수 없다는 점에 유의하십시오. 사용자 에이전트상승된 권한을 가진 애플리케이션의 경우에도 사용자가 공유할 항목을 선택할 수 있는 권한을 제공해야 한다고 권장합니다.

9.2.3 상승된 권한에 의존하는 기능

상승된 권한모니터 또는 브라우저 디스플레이 표면의 캡처에 대한 접근의 전제 조건으로 권장됩니다. 전체 모니터 캡처는 사용자 에이전트의 창을 포함할 수 있으므로 포함됩니다.

마찬가지로, 상승된 권한은 일반적으로 제공되지 않는 경우 논리적 디스플레이 표면에 대한 접근의 전제 조건으로 권장됩니다.

상승된 권한이 부여된 출처가 지속적으로 유지되도록 권장됩니다. 상승된 권한 프로세스는 부분적으로 사용자의 의도를 정확히 포착하기 위해 그 새로움에 의존합니다.

9.3 캡처 중 피드백 및 인터페이스

구현에서는 [GETUSERMEDIA]에서 권장하는 대로 카메라나 마이크를 공유할 때 제공되는 것과 유사한 사용자 피드백 및 제어 메커니즘을 제공할 것을 권장합니다.

사용자가 콘텐츠가 적극적으로 캡처되고 있을 때 콘텐츠가 공유되고 있음을 인지하는 것이 중요합니다. 사용자 에이전트는 콘텐츠가 캡처되는 동안 눈에 띄는 표시기를 표시할 것을 권장합니다. 표시기에 추가하여, 사용자 에이전트는 정확히 무엇이 공유되고 있는지 알 수 있는 수단을 제공할 것을 권장합니다. 이 기능은 애플리케이션이 캡처된 콘텐츠를 렌더링하여 쉽게 제공할 수 있지만, 이를 통해 사용자는 공유되고 있는 내용을 정확히 평가할 수 있습니다.

피드백 메커니즘 외에도 사용자가 활성 캡처를 중지할 수 있는 수단을 제공하는 것이 좋습니다.

A. 참조

A.1 규범적 참조

[2DCONTEXT]
HTML Canvas 2D Context. Rik Cabanier; Jatinder Mann; Jay Munro; Tom Wiltzius; Ian Hickson. W3C. 2021년 1월 28일. W3C 권고안. URL: https://www.w3.org/TR/2dcontext/
[css-values]
CSS Values and Units Module Level 3. Tab Atkins Jr.; Elika Etemad. W3C. 2024년 3월 22일. CRD. URL: https://www.w3.org/TR/css-values-3/
[dom]
DOM Standard. Anne van Kesteren. WHATWG. 현행 표준. URL: https://dom.spec.whatwg.org/
[ECMA-262]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[GETUSERMEDIA]
Media Capture and Streams. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 2025년 6월 24일. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[hr-time]
High Resolution Time. Yoav Weiss. W3C. 2024년 11월 7일. W3C 작업 초안. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. 현행 표준. URL: https://infra.spec.whatwg.org/
[Permissions]
Permissions. Marcos Caceres; Mike Taylor. W3C. 2025년 6월 24일. W3C 작업 초안. URL: https://www.w3.org/TR/permissions/
[permissions-policy]
Permissions Policy. Ian Clelland. W3C. 2025년 5월 6일. W3C 작업 초안. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RTCWEB-SECURITY]
Security Considerations for WebRTC. E. Rescorla. IETF. 2021년 1월. 제안된 표준. URL: https://www.rfc-editor.org/rfc/rfc8826
[RTCWEB-SECURITY-ARCH]
WebRTC Security Architecture. E. Rescorla. IETF. 2021년 1월. 제안된 표준. URL: https://www.rfc-editor.org/rfc/rfc8827
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/

A.2 비규범적 참조

[MEDIACAPTURE-DEPTH]
Media Capture Depth Stream Extensions. Anssi Kostiainen; Ningxin Hu; Rijubrata Bhaumik; Rob Manson. W3C. 2022년 2월 1일. W3C 작업 초안. URL: https://www.w3.org/TR/mediacapture-depth/
[WEBRTC]
WebRTC: Real-Time Communication in Browsers. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; Florent Castelli. W3C. 2025년 3월 13일. W3C 권고안. URL: https://www.w3.org/TR/webrtc/