뷰포트 캡처

W3C 워킹 드래프트

이 문서에 대한 자세한 내용
이 버전:
https://www.w3.org/TR/2024/WD-mediacapture-viewport-20241009/
최신 공개 버전:
https://www.w3.org/TR/mediacapture-viewport/
최신 편집자 초안:
https://w3c.github.io/mediacapture-viewport/
이력:
https://www.w3.org/standards/history/mediacapture-viewport/
커밋 이력
편집자:
Elad Alon (Google)
Jan-Ivar Bruaroey (Mozilla)
Tove Petersson (Google)
피드백:
GitHub w3c/mediacapture-viewport (풀 리퀘스트, 새 이슈, 열린 이슈)
public-webrtc@w3.org 로 제목 줄을 [mediacapture-viewport] … 메시지 주제 …로 하여 보내십시오(아카이브)
참여
메일링 리스트

초록

이 문서는 Screen Capture API [screen-capture]의 확장인 getViewportMedia를 사용하여 브라우저 뷰포트를 미디어 스트림의 소스로 사용할 수 있는 방법을 정의한다.

이 문서의 상태

이 절은 이 문서가 발행된 시점의 상태를 설명한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 https://www.w3.org/TR/의 W3C 기술 보고서 색인에서 찾을 수 있다.

이 문서는 완성된 것이 아니다.

이 문서는 Web Real-Time Communications Working GroupRecommendation 트랙을 사용하여 워킹 드래프트로 발행했다.

워킹 드래프트로 발행되었다고 해서 W3C와 그 회원이 지지한다는 의미는 아니다.

이는 초안 문서이며 언제든지 다른 문서에 의해 갱신, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.

이 문서는 W3C Patent Policy에 따라 운영되는 그룹에 의해 작성되었다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지하며, 그 페이지에는 특허 공개를 위한 지침도 포함되어 있다. 개인이 자신이 실제로 알고 있는 특허가 Essential Claim(s)을 포함한다고 믿는 경우, 그 개인은 W3C Patent Policy의 6절에 따라 해당 정보를 공개해야 한다.

이 문서는 2023년 11월 03일 W3C Process Document의 적용을 받는다.

1. 소개

이 절은 비규범적이다.

이 문서는 Screen Capture API [screen-capture]의 확장으로, 브라우저 뷰포트(현재 탭)를 비디오 트랙 형태로 획득할 수 있게 하는 기능을 설명한다. 경우에 따라 탭 오디오도 오디오 트랙 형태로 캡처된다. 이를 통해 진행 중인 WebRTC [WEBRTC] 화상 회의를 녹화하거나, 화상 회의 중인 사용자가 프레젠테이션을 선택기에서 찾지 않고 대신 프레젠테이션 애플리케이션의 버튼을 클릭하여 공유하는 등의 사용 사례를 가능하게 한다.

이 기능은 "크로스 오리진 격리" 문서에서만 사용할 수 있다. 이는 애플리케이션이 이 API를 사용하여, 사용자 에이전트 샌드박스가 제공하는 보호로 인해 접근 불가능해야 하는 다른 오리진의 잠재적 기밀 정보나 콘텐츠에 접근하는 것을 방지한다.

이 기능은 보안상 영향을 가지며, 권한 프롬프트가 필요하다. 렌더링된 뷰포트를 공유하면 링크 보라색 표시를 통한 브라우징 이력, 양식 자동완성과 같은 사용자 에이전트 또는 웹 확장 기능을 통한 주소나 결제 정보 같은 개인 정보, 또는 글꼴 크기와 같은 개인 선호가 노출될 수 있다.

2. 적합성

비규범적이라고 표시된 절뿐 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범적이다. 그 밖의 모든 것은 규범적이다.

이 문서의 키워드 MAY, MUST, 및 MUST NOT는 모두 대문자로 표시된 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석된다.

이 명세는 단일 제품, 즉 여기에 포함된 인터페이스를 구현하는 사용자 에이전트에 적용되는 적합성 기준을 정의한다.

ECMAScript [ECMA-262]를 사용하여 이 명세에 정의된 API를 구현하는 구현은, 이 명세가 Web IDL 명세 [WEBIDL]와 그 용어를 사용하므로, Web IDL 명세에 정의된 ECMAScript 바인딩과 일관된 방식으로 이를 구현해야 한다.

3. 예제

다음 예제는 이 문서에 정의된 navigator.mediaDevices.getViewportMedia 메서드를 사용하여 뷰포트 캡처를 요청하는 것을 보여준다.

try {
  const stream = await navigator.mediaDevices.getViewportMedia();
  videoElement.srcObject = stream;
} catch (e) {
  console.log('Unable to acquire viewport capture: ' + e);
}

4. 용어

이 문서는 [GETUSERMEDIA]의 MediaStream, MediaStreamTrack, MediaStreamConstraintsConstrainablePattern의 정의와, [screen-capture]의 표시 표면브라우저 표시 표면의 정의를 사용한다.

5. 뷰포트 미디어 캡처

뷰포트의 캡처는 getViewportMedia 메서드를 MediaDevices 인터페이스에 새로 추가함으로써 가능해진다. 이는 getDisplayMedia()와 유사하지만, 사용자를 선택기에 표시하는 대신 권한 프롬프트를 사용하여 최상위 문서의 뷰포트(현재 탭)만 캡처한다. 보안상의 이유로, document-policy로 옵트인한 "크로스 오리진 격리" 문서에서만 작동한다.

5.1 MediaDevices 추가 사항

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

사용자에게 뷰포트(현재 탭)를 실시간 캡처할 권한을 요청한다.

사용자 에이전트는 권한이 부여된 후 생성된 미디어에 제공된 optionsMUST 적용해야 한다.

오디오의 경우, 사용자 에이전트는 가능한 경우 캡처에 현재 뷰포트의 오디오를 포함하는 옵션을 최종 사용자에게 제시할 수 있다(MAY). 오디오+비디오와 관련하여 getDisplayMedia()와 마찬가지로, 사용자 에이전트는 오디오 제약이 존재하더라도 오디오를 반환하지 않을 수 있다. 사용자 에이전트가 스트림의 수명 동안 오디오가 공유되지 않을 것임을 알고 있다면, 결과 스트림에 오디오 트랙을 포함해서는 안 된다(MUST NOT). 사용자 에이전트는 오디오 및 비디오 요청을 결과 스트림에 비디오 트랙만 반환하여 수락할 수 있으며(MAY), 또는 결과 스트림에 오디오 트랙과 비디오 트랙을 모두 반환하여 수락할 수도 있다(MAY). 사용자 에이전트는 오디오 전용 요청을 거부해야 한다(MUST).

getDisplayMedia()와 마찬가지로, "granted" 권한은 영속화될 수 없다.

getViewportMedia() 메서드가 호출되면, 사용자 에이전트는 다음 단계를 실행해야 한다(MUST):

  1. 현재 설정 객체크로스 오리진 격리 기능이 false이면, 거부된 promise를 반환한다. 이 promise는 DOMException 객체로 거부되며, 그 name 속성 값은 SecurityError이다.

  2. 관련 전역 객체연결된 Document최상위 브라우징 컨텍스트 required document policyRequire-Document-Policy: viewport-captureDocument-Policy: viewport-capture가 포함되어 있지 않으면 (TODO: 올바른 알고리즘 사용), 거부된 promise를 반환한다. 이 promise는 DOMException 객체로 거부되며, 그 name 속성 값은 SecurityError이다.

  3. 관련 전역 객체this에 대해 일시적 활성화를 가지고 있지 않으면, 거부된 promise를 반환한다. 이 promise는 DOMException 객체로 거부되며, 그 name 속성 값은 InvalidStateError이다.

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

  5. options.videofalse이면, 새로 생성된 TypeError거부된 promise를 반환한다.

  6. options에서 값 CS가 딕셔너리인 각 존재하는 멤버에 대해, 다음 단계를 실행한다:

    1. CSadvanced라는 이름의 멤버가 포함되어 있으면, 새로 생성된 TypeError거부된 promise를 반환한다.

    2. CS표시 표면에 적용 가능한 제약 가능 속성을 지정하는 이름의 멤버를 포함하고, 그 값이 다시 min 또는 exact라는 이름의 멤버를 포함하는 딕셔너리이면, 새로 생성된 TypeError거부된 promise를 반환한다.

    3. CS표시 표면에 적용 가능한 제약 가능 속성을 지정하는 이름의 멤버를 포함하고, 그 값이 다시 max라는 이름의 멤버를 포함하는 딕셔너리이며, 그 멤버의 값이 다시 그 제약 가능 속성의 floor value보다 작으면, failedConstraint를 그 멤버의 이름으로 두고, messageundefined 또는 정보 제공용 사람이 읽을 수 있는 메시지로 둔 다음, OverconstrainedError(failedConstraint, message)를 호출하여 생성된 새 OverconstrainedError로 promise를 거부한다.

  7. requestedMediaTypesoptions에서 딕셔너리 값 또는 true 값을 가진 미디어 타입의 집합으로 둔다.

  8. 관련 전역 객체연결된 Document완전히 활성이 아니거나 포커스를 가지고 있지 않으면, 거부된 promise를 반환한다. 이 promise는 DOMException 객체로 거부되며, 그 name 속성 값은 InvalidStateError이다.

  9. p를 새 promise로 둔다.

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

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

      1. T 타입의 소스가 사용 가능하지 않으면, reject p with a new DOMException object whose name attribute has the value NotFoundError.

      2. 현재 브라우징 컨텍스트에서 T 타입의 소스를 획득하기 위한 현재 권한 상태를 읽는다. 권한 상태가 "denied"이면, 아래의 권한 실패라고 표시된 단계로 점프한다.

    2. 선택적으로, 예를 들어 이전에 설정된 사용자 선호, 보안상의 이유 또는 플랫폼 제한에 따라, 아래의 권한 실패라고 표시된 단계로 점프한다.

    3. 사용 권한 요청 을 뷰포트 캡처에 대해 수행한다. 이는 PermissionDescriptor이며, 그 name"viewport-capture"로 설정되고, 그 결과 제공된 미디어의 집합이 된다.

      제공된 미디어는 정확히 하나의 비디오 트랙을 포함해야 하며(MUST), 이 트랙은 관련 전역 객체연결된 Document최상위 브라우징 컨텍스트뷰포트브라우저 표시 표면에 대한 실시간 캡처여야 한다(MUST).

      제공된 미디어는 최대 하나의 오디오 트랙을 포함해야 하며(MUST), 제공되는 경우, 그 오디오 트랙은 관련 전역 객체연결된 Document최상위 브라우징 컨텍스트활성 문서와, 관련 전역 객체연결된 Document최상위 브라우징 컨텍스트의 중첩된 브라우징 컨텍스트들 안에 있는 모든 활성 문서의 합에 의해 생성된 결합 오디오여야 한다(MUST). 이 오디오 트랙은 requestedMediaTypes에 오디오가 지정되지 않았거나 false로 지정된 경우 포함되어서는 안 된다(MUST NOT).

      MediaStreamTrack의 소스는 변경되어서는 안 된다(MUST NOT).

      요청의 결과가 "granted"이면, 제공된 미디어를 소싱하는 각 디바이스에 대해, 그 디바이스의 안정적이고 비공개인 id인 deviceId를 사용하여, 이미 true가 아니라면 [[devicesLiveMap]][deviceId]true로 설정하고, 이미 true가 아니라면 [[devicesAccessibleMap]][deviceId]true로 설정한다.

      사용자 에이전트는 "granted" 권한 엔트리를 저장해서는 안 된다(MUST NOT).

      결과가 "denied"이면, 아래의 권한 실패라고 표시된 단계로 점프한다. 사용자가 응답하지 않으면, 이 알고리즘은 이 단계에서 멈춘다.

      사용자가 권한을 부여했지만 OS/프로그램/웹페이지 잠금과 같은 하드웨어 오류가 접근을 방해하면, p거부한다. 이때 새 DOMException 객체를 사용하며, 그 name 속성 값은 NotReadableError이고, 이 단계를 중단한다.

      결과가 "granted"이지만, 위에 나열된 사유가 아닌 다른 어떤 사유로 디바이스 접근이 실패하면, p거부한다. 이때 새 DOMException 객체를 사용하며, 그 name 속성 값은 AbortError이고, 이 단계를 중단한다.

    4. stream을 사용자가 권한을 부여한 MediaStream 객체로 둔다.

    5. 적절한 제약으로 stream의 모든 트랙에 대해 ApplyConstraints 알고리즘을 실행한다. 이것이 실패하면, failedConstraint를 실패한 알고리즘의 결과로 두고, messageundefined 또는 정보 제공용 사람이 읽을 수 있는 메시지로 둔 다음, OverconstrainedError(failedConstraint, message)를 호출하여 생성된 새 OverconstrainedErrorp거부한다.

    6. videoTrackstream의 비디오 트랙으로 둔다.
    7. videoTrack.[[Restrictable]]true로 설정한다.
    8. pstream으로 해결하고 이 단계를 중단한다.

    9. 권한 실패: p를 새 DOMException 객체로 거부한다. 그 객체의 name 속성 값은 NotAllowedError이다.

  11. p를 반환한다.

사용자 에이전트는 부분적으로 투명하게 캡처된 표시 표면 뒤의 콘텐츠를 캡처해서는 안 된다(MUST NOT).

사용자 에이전트는 캡처된 탭에서 방출된 오디오 이외의 오디오를 공유해서는 안 되며(MUST NOT), 전체 시스템의 오디오를 공유해서도 안 된다(MUST NOT).

5.2 캡처된 뷰포트 표면을 위한 제약 가능 속성

getViewportMedia와 관련된 제약은 getDisplayMedia()와 관련된 제약뿐이며, 이는 5.4 캡처된 표시 표면을 위한 제약 가능 속성에 정의되어 있다.

5.3 권한 통합

뷰포트 캡처강력한 기능이며, 이름 "viewport-capture"으로 식별되고, 사용하려면 명시적 권한이 필요하다.

Permissions 명세와의 통합에 필요한 대로, 이 명세는 다음을 정의한다:

권한 상태 제약
이 설명자의 권한 상태에 유효한 값은 "prompt" 및 "denied"이다. 사용자 에이전트는 이 설명자의 권한 상태를 "granted"로 설정해서는 결코 안 된다(MUST NOT).

5.4 권한 정책 통합

이 명세는 문자열 "viewport-capture"로 식별되는 정책 제어 기능을 정의한다. 그 기본 허용 목록"self"이다.

참고

문서권한 정책은 해당 문서의 어떤 콘텐츠가 getViewportMedia를 사용할 수 있는지를 결정한다. 어떤 문서에서 비활성화되어 있으면, 문서 안의 어떤 콘텐츠도 사용하도록 허용되지 않는다. 대상은 getViewportMedia이다. 이는 사용 권한 요청 알고리즘에 의해 강제된다.

6. 프라이버시 표시기 요구사항

이 명세는 프라이버시 표시기 요구사항을 확장하여, getDisplayMedia()getViewportMedia를 포함한다.

7. 보안 및 프라이버시 고려사항

이 절은 정보 제공용이다. 그러나 여기에 포함된 조언을 따르지 않을 경우 플랫폼 보안에 심각한 위험이 발생할 수 있음을 언급한다.

미정.

A. 참고 문헌

A.1 규범 참고 문헌

[ECMA-262]
ECMAScript 언어 명세. Ecma International. URL: https://tc39.es/ecma262/multipage/
[GETUSERMEDIA]
미디어 캡처와 스트림. Cullen Jennings; Bernard Aboba; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 2024년 10월 3일. W3C 후보 권고안. URL: https://www.w3.org/TR/mediacapture-streams/
[HTML]
HTML 표준. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 살아있는 표준. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra 표준. Anne van Kesteren; Domenic Denicola. WHATWG. 현행 표준. URL: https://infra.spec.whatwg.org/
[Permissions]
권한. Marcos Caceres; Mike Taylor. W3C. 2024년 3월 19일. W3C 워킹 드래프트. URL: https://www.w3.org/TR/permissions/
[permissions-policy]
권한 정책. Ian Clelland. W3C. 2024년 9월 25일. W3C 워킹 드래프트. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
RFC에서 요구 수준을 나타내기 위해 사용하는 키워드. S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 키워드에서 대문자와 소문자의 모호성. B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[screen-capture]
화면 캡처. Jan-Ivar Bruaroey; Elad Alon. W3C. 2024년 6월 27일. W3C 워킹 드래프트. URL: https://www.w3.org/TR/screen-capture/
[WEBIDL]
Web IDL 표준. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/

A.2 정보 참고 문헌

[dom]
DOM 표준. Anne van Kesteren. WHATWG. 현행 표준. URL: https://dom.spec.whatwg.org/
[WEBRTC]
WebRTC: 브라우저에서의 실시간 통신. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; Florent Castelli. W3C. 2024년 10월 8일. W3C 권고안. URL: https://www.w3.org/TR/webrtc/