기기 속성 API

커뮤니티 그룹 보고서 초안,

이 버전:
https://wicg.github.io/WebApiDevice/device_attributes
이슈 추적:
GitHub
편집자:
(Google LLC)

초록

이 문서는 개발자가 관리되는 기기에서 기기 정보(기기 ID, 일련번호, 위치 등)를 조회할 수 있게 하는 웹 플랫폼 API를 정의한다. 이 API는 가상 데스크톱 인프라(VDI) 및 컨텍스트 기반 구성과 같은 사용 사례에 매우 유용하다.

이 문서의 상태

이 명세는 웹 플랫폼 인큐베이터 커뮤니티 그룹에서 발행했다. 이는 W3C 표준이 아니며 W3C 표준화 트랙에 있지도 않다. 다음 사항에 유의하라. W3C 커뮤니티 기여자 라이선스 계약 (CLA) 에 따라 제한적인 옵트아웃 및 기타 조건이 적용된다. 자세한 내용은 W3C 커뮤니티 및 비즈니스 그룹을 참조하라.

1. 소개

Device Attributes API는 기기 관리자가 특정 출처가 UA를 실행하는 기기의 특정 속성에 접근하도록 허용할 수 있게 한다. 각 출처에 사용자 지정 JSON 객체를 전달할 수 있게 하는 [MANAGED-CONFIG]와 달리, 이 API는 관리자가 활성화한 모든 출처에 동일한 값 집합을 전달할 것을 기대한다.

2. 모델

2.1. 관리되는 기기

이 API는 최종 사용자가 완전히 제어하는 것이 아니라 외부 주체인 기기 관리자가 제어하는 기기에서 사용되는 것으로 간주한다. 기기 관리자에게는 관리되는 기기를 완전히 제어할 권한이 부여된다.

2.2. 관리되는 웹 애플리케이션

이 API는 기기 관리자가 이해하고 관리하는 웹 애플리케이션에서 사용되는 것으로 간주한다.

2.3. 권한 제어

Device Attributes API는 강력한 기능이며, 이름 "device-attributes"로 식별된다.

대부분의 운영 체제에는 웹 브라우저와 같은 애플리케이션이나 기기의 운영 체제의 여러 측면을 구성하는 데 사용할 수 있는 정책 배포 메커니즘이 있다. 이 명세는 이러한 기기 속성에 접근할 권한이 그러한 시스템을 통해 구성될 것을 요구한다. 이러한 정책은 기기 관리자가 제어한다. 이들이 반드시 기기 사용자의 최선의 이익을 고려하지는 않을 수 있다.

Chrome 브라우저를 예로 들면, 관리되는 웹 애플리케이션의 상태는 기기 관리자Google Admin Console에서 선택하고 엔터프라이즈 관리 기기에 자동으로 설치되는 웹 애플리케이션에 해당하는 출처에 부여된다. 관리되는 웹 애플리케이션의 경우, 기기 관리자가 특정 애플리케이션에 접근 권한을 제공하고 싶지 않다면 이러한 기기 속성에 접근할 권한을 철회할 수 있다.

2.4. 권한 정책

이 명세는 토큰 문자열 "device-attributes"로 식별되는 정책 제어 기능을 정의한다.

2.5. 기기 속성

이 API는 기기 관리자가 기기 집합을 관리하고 해당 기기의 속성을 구성할 수 있게 하는 관리 인프라와 함께 사용되는 것으로 간주한다.

2.5.1. 주석이 달린 자산 ID

조직 내에서 기기를 고유하게 식별하는 관리자 정의 값이다.

2.5.2. 주석이 달린 위치

조직 내에서 위치를 고유하게 식별하는 관리자 정의 값이다.

2.5.3. 디렉터리 ID

조직 내에서 기기를 고유하게 식별하는 재고 관리 시스템 정의 값이다.

2.5.4. 호스트 이름

DHCP 요청 중 기기의 호스트 이름으로 사용되는 관리자 정의 값이다.

2.5.5. 일련번호

해당 제조업체가 생산한 기기들 사이에서 기기를 고유하게 식별하는 제조업체 정의 값이다.

[
  SecureContext,
  Exposed=Window
] interface NavigatorManagedData : EventTarget {
  // Device Attributes API.
  Promise<DOMString> getAnnotatedAssetId();
  Promise<DOMString> getAnnotatedLocation();
  Promise<DOMString> getDirectoryId();
  Promise<DOMString> getHostname();
  Promise<DOMString> getSerialNumber();
};

이 인터페이스의 메서드는 일반적으로 비동기적으로 완료되며, 관리 데이터 태스크 소스에 작업을 큐에 넣는다.

3.1. getAnnotatedAssetId() 메서드

getAnnotatedAssetId() 메서드 단계는 다음과 같다.

  1. promise새 promise로 둔다.

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

    1. 이 API가 기기 속성에 접근할 권한이 있는 관리되는 웹 애플리케이션에 의해 호출되지 않았다면, 전역 태스크를 큐에 넣어 관련 전역 객체this에서 관리 데이터 태스크 소스를 사용하여 promise를 "NotAllowedError" DOMException으로 거부하고 이 단계를 중단한다.

    2. annotatedAssetId주석이 달린 자산 id로 둔다. 이는 기기 관리자가 설정한 값이거나, 설정된 값이 없다면 undefined이다.

    3. 전역 태스크를 큐에 넣어 관련 전역 객체this에서 관리 데이터 태스크 소스를 사용하여 promiseannotatedAssetId해결한다.

  3. promise를 반환한다.

3.2. getAnnotatedLocation() 메서드

getAnnotatedLocation() 메서드 단계는 다음과 같다.

  1. promise새 promise로 둔다.

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

    1. 이 API가 기기 속성에 접근할 권한이 있는 관리되는 웹 애플리케이션에 의해 호출되지 않았다면, 전역 태스크를 큐에 넣어 관련 전역 객체this에서 관리 데이터 태스크 소스를 사용하여 promise를 "NotAllowedError" DOMException으로 거부하고 이 단계를 중단한다.

    2. annotatedLocation주석이 달린 위치로 둔다. 이는 기기 관리자가 설정한 값이거나, 설정된 값이 없다면 undefined이다.

    3. 전역 태스크를 큐에 넣어 관련 전역 객체this에서 관리 데이터 태스크 소스를 사용하여 promiseannotatedLocation으로 해결한다.

  3. promise를 반환한다.

3.3. getDirectoryId() 메서드

getDirectoryId() 메서드 단계는 다음과 같다.

  1. promise새 promise로 둔다.

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

    1. 이 API가 기기 속성에 접근할 권한이 있는 관리되는 웹 애플리케이션에 의해 호출되지 않았다면, 전역 태스크를 큐에 넣어 관련 전역 객체this에서 관리 데이터 태스크 소스를 사용하여 promise를 "NotAllowedError" DOMException으로 거부하고 이 단계를 중단한다.

    2. directoryId디렉터리 id로 둔다. 이는 관리 인프라에서 제공되지 않는 경우 undefined이다.

    3. 전역 태스크를 큐에 넣어 관련 전역 객체this에서 관리 데이터 태스크 소스를 사용하여 promisedirectoryId해결한다.

  3. promise를 반환한다.

3.4. getHostname() 메서드

getHostname() 메서드 단계는 다음과 같다.

  1. promise새 promise로 둔다.

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

    1. 이 API가 기기 속성에 접근할 권한이 있는 관리되는 웹 애플리케이션에 의해 호출되지 않았다면, 전역 태스크를 큐에 넣어 관련 전역 객체this에서 관리 데이터 태스크 소스를 사용하여 promise를 "NotAllowedError" DOMException으로 거부하고 이 단계를 중단한다.

    2. hostname호스트 이름으로 둔다. 이는 기기 관리자가 설정한 값이거나, 설정된 값이 없다면 undefined이다.

    3. 전역 태스크를 큐에 넣어 관련 전역 객체this에서 관리 데이터 태스크 소스를 사용하여 promisehostname으로 해결한다.

  3. promise를 반환한다.

3.5. getSerialNumber() 메서드

getSerialNumber() 메서드 단계는 다음과 같다.

  1. promise새 promise로 둔다.

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

    1. 이 API가 기기 속성에 접근할 권한이 있는 관리되는 웹 애플리케이션에 의해 호출되지 않았다면, 전역 태스크를 큐에 넣어 관련 전역 객체this에서 관리 데이터 태스크 소스를 사용하여 promise를 "NotAllowedError" DOMException으로 거부하고 이 단계를 중단한다.

    2. serialNumber일련번호로 둔다. 사용할 수 없다면 undefined이다.

    3. 전역 태스크를 큐에 넣어 관련 전역 객체this에서 관리 데이터 태스크 소스를 사용하여 promiseserialNumber해결한다.

  3. promise를 반환한다.

4. 코드 예제

온라인 판매 시스템에 의존하는 소매 기업이 있다고 가정한다. 백엔드 서비스는 아침에 매장 내 기기의 주석이 달린 위치 (국가, 도시 또는 판매 지역)를 기반으로 서로 다른 요율을 푸시하고, 오후에는 판매 보고서를 수집한다.

Device Attributes API의 도움으로 이 판매 애플리케이션은 getAnnotatedLocation() 메서드를 사용하여 기기 위치를 가져올 수 있다. API 호출이 피싱 애플리케이션, 즉 비슷해 보이지만 예상한 애플리케이션이 아닌 곳에서 트리거되면 작업은 실패한다.

// 현재 환경이 유효한 경우 민감한 데이터를 요청한다.
function successCallback(location) {
  const tariff = backend.requestTariff(location);
  console.log(tariff);
}
 
// 현재 환경이 예상과 다른 경우 워크플로를 중지한다.
function failureCallback(error) {
  backend.reportFailure(error);
  console.error(error.message);
}
 
function PrepareTariff() {
  navigator.managed.getAnnotatedLocation()
                   .then(successCallback, failureCallback);
}

getAnnotatedAssetId() 메서드를 사용하여 기기 일련번호를 포함한 판매 데이터를 보고하는 또 다른 유사한 코드 조각을 작성하기도 쉽다.

참고: 웹사이트는 데이터가 변조되거나 도난당하거나 다른 관리되는 기기에서 재사용될 수 있다고 가정해야 한다. 대체 보안 조치는 웹사이트 자체에서 마련해야 한다.

function ReportSalesData() {
  navigator.managed.getAnnotatedAssetId.then(reportCallback);
}

5. 보안 고려 사항

현대적인 보안 관행에 따라, 이러한 메서드를 사용할 권한은 출처별로 기기 관리자가 제어한다. 또한 이 메서드들은 관리되는 기기의 보안 컨텍스트에서만 사용할 수 있다.

6. 개인정보 보호 고려 사항

이 API는 모든 출처에 대해 동일한 기기 속성에 접근할 수 있게 한다. (관리되는 사이트의 출처별 구성은 [MANAGED-CONFIG]를 참조하라.) 임의로 노출된다면 이는 추적 목적으로 쉽게 사용될 수 있다. 그러나 관리되는 환경에서는 기기 관리자가 특정 직원이나 작업을 위해 기기 집합을 구성하므로, 이러한 기기가 접근할 것으로 예상되는 사이트에 자신을 식별할 수 있는 것이 바람직하다.

이 인터페이스를 관리되지 않는 기기에서 사용하는 것은 목표가 아니다. 최종 사용자는 사이트에 이 정보를 제공하도록 요청받지 않는다. 어떤 출처에 이러한 기기 속성에 접근할 권한을 부여할지에 대한 결정은 해당 기기가 속한 조직의 권한 있는 관리자가 내린다.

불필요한 정보 노출을 방지하기 위해 구성 메커니즘은 기기 관리자가 제한된 출처 집합에만 이러한 속성에 대한 접근을 허용하도록 요구한다. 모든 출처에 접근을 허용하면 기기에서의 모든 웹 탐색에 대한 광범위한 추적 메커니즘이 만들어질 수 있기 때문이다. 접근 권한이 부여된 출처는 추가로 보안 컨텍스트이므로 수동적 네트워크 공격자가 전송 중 이러한 속성을 관찰할 수 없다.

참고: [RFC7258]은 광범위한 감시를 공격으로 다루지만, 이는 관리되는 기기에는 적용되지 않는다. 그러한 경우 관리되는 기기의 실제 소유자는 최종 사용자가 아니라 적절한 권한을 사용하여 모든 최종 사용자를 보호할 것으로 기대되는 기기 관리자이다.

준수

문서 규약

준수 요구 사항은 설명적 주장과 RFC 2119 용어의 조합으로 표현된다. 이 문서의 규범적 부분에 있는 핵심 단어 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL”은 RFC 2119에 설명된 대로 해석해야 한다. 그러나 가독성을 위해 이 단어들이 이 명세에서 모두 대문자로 나타나지는 않는다.

명시적으로 비규범으로 표시된 섹션, 예제, 참고를 제외하고 이 명세의 모든 텍스트는 규범적이다. [RFC2119]

이 명세의 예제는 “예를 들어”라는 단어와 함께 도입되거나, 규범적 텍스트와 구분되어 다음과 같이 class="example"로 표시된다.

이는 참고용 예제의 예이다.

참고용 참고는 “Note”라는 단어로 시작하며, 규범적 텍스트와 구분되어 다음과 같이 class="note"로 표시된다.

참고, 이는 참고용 참고이다.

색인

이 명세가 정의하는 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[DOM]
Anne van Kesteren. DOM 표준. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML 표준. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. 권한. URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. 권한 정책. URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. RFC에서 요구 수준을 나타내는 데 사용하는 핵심 단어. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. Living Standard. URL: https://webidl.spec.whatwg.org/

참고용 참고 문헌

[MANAGED-CONFIG]
Anatoliy Potapchuk. MANAGED-CONFIG. URL: https://wicg.github.io/WebApiDevice/managed_config
[RFC7258]
S. Farrell; H. Tschofenig. 광범위한 감시는 공격이다. 2014년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc7258

IDL 색인

[
  SecureContext,
  Exposed=Window
] interface NavigatorManagedData : EventTarget {
  // Device Attributes API.
  Promise<DOMString> getAnnotatedAssetId();
  Promise<DOMString> getAnnotatedLocation();
  Promise<DOMString> getDirectoryId();
  Promise<DOMString> getHostname();
  Promise<DOMString> getSerialNumber();
};