주변 광 센서

W3C 작업 초안,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2025/WD-ambient-light-20250212/
최신 공표 버전:
https://www.w3.org/TR/ambient-light/
편집자 초안:
https://w3c.github.io/ambient-light/
이전 버전:
히스토리:
https://www.w3.org/standards/history/ambient-light/
피드백:
public-device-apis@w3.org 제목에 “[ambient-light] … 메시지 주제 …” 포함 (아카이브)
GitHub
테스트 스위트:
https://github.com/web-platform-tests/wpt/tree/master/ambient-light
편집자:
Anssi Kostiainen (Intel Corporation)
Rijubrata Bhaumik (Intel Corporation)
이전 편집자:
Tobie Langel (Codespeaks, 과거 Intel Corporation 소속)
Doug Turner (Mozilla Corporation)
이슈 추적:
Level 2 이슈

요약

이 명세서는 장치 환경의 주변 광 수준 또는 조도를 모니터링하는 구체적인 센서 인터페이스를 정의합니다.

문서 현황

이 섹션은 이 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정본은 W3C 기술 보고서 인덱스 https://www.w3.org/TR/에서 확인할 수 있습니다.

이 문서는 디바이스 및 센서 워킹 그룹에서 권고안 트랙을 사용하여 작업 초안으로 발행되었습니다. 이 문서는 W3C 권고안이 되는 것을 목표로 합니다.

이 문서에 대한 의견을 보내고자 한다면 public-device-apis@w3.org (구독, 아카이브)로 보내주시기 바랍니다. 이메일을 보낼 때, 제목에 “ambient-light”라는 텍스트를 포함해 주시고, 가능하다면 다음과 같이 작성해 주세요: “[ambient-light] …의견 요약…”. 모든 의견을 환영합니다.

작업 초안으로 발행된다고 해서 W3C 및 그 회원의 지지를 의미하지는 않습니다. 이 문서는 초안 문서이며 언제든지 업데이트, 교체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 것으로 이 문서를 인용하는 것은 적절하지 않습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹의 산출물과 관련하여 공개적으로 특허 공개 목록을 유지합니다. 해당 페이지에는 특허 공개 방법도 포함되어 있습니다. 어떤 개인이 필수 청구를 포함한다고 믿는 특허에 대해 실제로 알고 있다면 W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

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

디바이스 및 센서 워킹 그룹은 이 명세서에 대해 최신 보안 및 프라이버시 검토를 진행 중입니다. 이는 명세서 자체와 프라이버시·보안 검토 관행 모두에서 많은 변화가 있었음을 고려한 것입니다. 또한, 그룹은 최신 아키텍처 검토 관행을 반영하기 위해 기술 아키텍처 그룹(TAG) 검토의 업데이트도 추진 중입니다.

1. 소개

주변 광 센서는 Generic Sensor API [GENERIC-SENSOR]를 확장하여, 장치의 주요 광 감지기가 감지한 주변 광 수준 정보를 lux 단위로 제공합니다.

1.1. 범위

이 문서는 사용 사례 중에서 세밀한 조도 데이터와 낮은 지연 시간, 그리고 높은 빈도로 샘플링이 필요한 경우를 위한 API를 명세합니다.

대부분의 웹 페이지에서 대비 수준이나 주변 광 수준에 따라 영향을 받을 수 있는 선호 색상 테마 등, 소수의 조도 값만 필요로 하는 일반적인 사용 사례는 prefers-contrastprefers-color-scheme CSS 미디어 기능 [MEDIAQUERIES-5] 그리고 matchMedia API [CSSOM-VIEW-1]로 처리하는 것이 더 적합하며, 이 API의 범위에는 포함되지 않습니다.

참고: [MEDIAQUERIES-5] 명세에는 과거에 주변 광 판독값과 직접적으로 연동된 light-level 미디어 기능이 있었으나, 이후 삭제 되었으며, 보다 상위 개념인 prefers-color-schemeprefers-contrast 미디어 기능이 채택되었습니다.

2. 예시

이 간단한 예제에서는 주변 광 센서가 기본 설정으로 생성됩니다. 새로운 판독값이 제공될 때마다 콘솔에 출력됩니다.
const sensor = new AmbientLightSensor();
sensor.onreading = () => console.log(sensor.illuminance);
sensor.onerror = event => console.log(event.error.name, event.error.message);
sensor.start();
이 예제에서는 ISO 100에서의 노출값(EV)을 주변 광 센서 판독값으로부터 계산합니다. 처음에는 사용자 에이전트가 주변 광 센서 판독값에 접근 권한이 있는지 확인합니다. 그 후 illuminance 값을 가장 가까운 노출값으로 변환합니다.
navigator.permissions.query({ name: 'ambient-light-sensor' }).then(result => {
    if (result.state === 'denied') {
        console.log('Permission to use ambient light sensor is denied.');
        return;
    }

    const als = new AmbientLightSensor({frequency: 20});
    als.addEventListener('activate', () => console.log('Ready to measure EV.'));
    als.addEventListener('error', event => console.log(`Error: ${event.error.name}`));
    als.addEventListener('reading', () => {
        // 기본 ISO 값.
        const ISO = 100;
        // 입사광 보정 상수.
        const C = 250;

        let EV = Math.round(Math.log2((als.illuminance * ISO) / C));
        console.log(`Exposure Value (EV) is: ${EV}`);
    });

    als.start();
});
이 예제는 주변 광 센서 판독값을 권장 작업장 조도 수준에 매핑하는 방법을 보여줍니다.
const als = new AmbientLightSensor();

als.onreading = () => {
    let str = luxToWorkplaceLevel(als.illuminance);
    if (str) {
        console.log(`Light level is suitable for: ${str}.`);
    }
};

als.start();

function luxToWorkplaceLevel(lux) {
    if (lux > 20 && lux < 100) {
        return '공공 장소, 짧은 방문';
    } else if (lux > 100 && lux < 150) {
        return '간헐적으로 수행하는 시각 작업';
    } else if (lux > 150 && lux < 250) {
        return '간단한 사무 작업, 강의실, 가정, 극장';
    } else if (lux > 250 && lux < 500) {
        return '일반 사무 작업, 식료품점, 실험실';
    } else if (lux > 500 && lux < 1000) {
        return '기계 작업장, 제도, 대형마트';
    } else if (lux > 1000 && lux < 5000) {
        return '정밀 제도 작업, 저대비 시각 작업';
    }

    return;
}

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

There is a tracking vector here. 주변 광 센서는 장치 환경 근처의 조명 상태에 대한 정보를 제공합니다. 잠재적인 프라이버시 위험은 다음과 같습니다:

[ALSPRIVACYANALYSIS], [PINSKIMMINGVIASENSOR], [STEALINGSENSITIVEDATA], [VIDEORECOGNITIONAMBIENTLIGHT], 그리고 [IMAGINGPRIVACY] 등의 연구가 이러한 이슈를 더 깊이 다룹니다.

주변 광 센서에 특화된 위협을 완화하기 위해, 사용자 에이전트는 센서 판독값의 정확도를 낮춰야 합니다. 또한, 사용자 에이전트는 최대 샘플링 빈도 제한을 적용할 수 있습니다.

이러한 완화 전략은 Generic Sensor API [GENERIC-SENSOR]에서 정의된 일반적인 완화책을 보완하는 역할을 합니다.

3.1. 센서 판독 정확도 낮추기

센서 판독값의 정확도를 낮추기 위해, 이 명세서는 임계값 확인 알고리즘(Ambient Light 임계값 확인 알고리즘)과 판독값 양자화 알고리즘(Ambient Light 판독값 양자화 알고리즘)을 정의합니다.

이 알고리즘들은 illuminance rounding multipleilluminance threshold value를 사용합니다. 구현체는 다음의 요구사항을 따라야 합니다:

참고: illuminance rounding multiple 값을 선택할 때는 판독값을 지나치게 정밀하게 노출하지 않으면서도 API 사용자에게 유용한 값을 제공하는 균형이 필요합니다. 최소값으로 50 lux가 적합하다는 것은 GitHub 이슈 #13에서 다양한 조도 조건에서의 측정 결과를 수집하여, [STEALINGSENSITIVEDATA]에서 설명된 공격을 차단할 수 있음을 확인한 결과입니다. 50 lux는 또한, 주변 광 센서 판독값을 이용한 비디오 인식 ([VIDEORECOGNITIONAMBIENTLIGHT])을 어렵게 만드는 5 lux보다 훨씬 높은 값입니다.

참고: illuminance threshold value는 판독값이 특정 값 근처에서 양자화로 인해 값이 바뀌는 사실이 누출되는 것을 막기 위해 사용됩니다. 예를 들어, illuminance rounding multiple이 50일 때, 원시 판독값이 24와 26 사이를 오갈 때 illuminance 값이 0과 50 사이에서 바뀌는 것을 방지합니다. 임계값 확인 알고리즘의 보조 지문 방지 효과는 수학적으로 증명되지는 않았으나, 구현 경험에 따라 이 명세에 추가되었습니다. 자세한 내용은 Chromium 버그 1332536Chromium 리뷰 3666917에서 확인할 수 있습니다.

4. 모델

주변 광 센서 센서 타입의 관련 Sensor 서브클래스는 AmbientLightSensor 클래스입니다.

주변 광 센서에는 기본 센서가 있으며, 이는 장치의 주요 광 감지기입니다.

주변 광 센서강력한 기능에 해당하며, 이름 "ambient-light-sensor"로 식별됩니다. 이는 해당 센서 권한 이름이기도 합니다. 권한 취소 알고리즘Generic Sensor 권한 취소 알고리즘을 "ambient-light-sensor"로 호출한 결과입니다.

주변 광 센서는 "ambient-light-sensor"라는 문자열로 식별되는 정책 제어 기능입니다. 기본 허용 목록'self'입니다.

주변 광 센서가상 센서 타입으로, "ambient-light"입니다.

현재 광 수준 또는 조도(illuminance)는 호스트 장치 주변의 주변 광 수준을 나타내는 값입니다. 단위는 lux(lx) [SI]입니다.

참고: 동일한 조명 환경에서도 장치마다 보고되는 lux 값이 다를 수 있습니다. 이는 감지 방식, 센서 구조 등의 차이 때문입니다.

주변 광 센서에는 lux 단위로 측정되는 illuminance rounding multiple이 있으며, 이는 illuminance 판독값이 올림 처리되는 배수 값을 나타냅니다.

주변 광 센서에는 lux 단위로 측정되는 illuminance threshold value도 있으며, 이는 Ambient Light 임계값 확인 알고리즘에서 사용됩니다.

참고: 위 값들의 최소 요구사항은 § 3.1 센서 판독 정확도 낮추기에서 확인하세요.

5. API

5.1. AmbientLightSensor 인터페이스

[SecureContext, Exposed=Window]
interface AmbientLightSensor : Sensor {
  constructor(optional SensorOptions sensorOptions = {});
  readonly attribute double? illuminance;
};

AmbientLightSensor 객체를 생성하려면, 사용자 에이전트가 Ambient Light Sensor 객체 생성 추상 연산을 호출해야 합니다.

5.1.1. illuminance 속성

illuminance getter 단계는 다음과 같습니다:

  1. illuminanceget value from latest readingthis와 "illuminance"를 인자로 호출한 결과로 설정합니다.

  2. illuminance를 반환합니다.

6. 추상 연산

6.1. Ambient Light Sensor 객체 생성

input

options, SensorOptions 객체.

output

AmbientLightSensor 객체.

  1. allowedcheck sensor policy-controlled featuresAmbientLightSensor를 인자로 호출한 결과로 설정합니다.

  2. allowed가 false이면:

    1. Throw SecurityError DOMException을 발생시킵니다.

  3. ambient_light_sensor를 새로운 AmbientLightSensor 객체로 설정합니다.

  4. ambient_light_sensoroptions를 인자로 하여 initialize a sensor object를 호출합니다.

  5. ambient_light_sensor를 반환합니다.

6.2. Ambient Light 임계값 확인 알고리즘

주변 광 센서 센서 타입은 다음 임계값 확인 알고리즘을 정의합니다:

input

newReading, 센서 판독값

latestReading, 센서 판독값

output

두 판독값의 차이가 충분히 의미 있는지 나타내는 boolean 값.

  1. newReading["illuminance"]가 null이면 true를 반환합니다.

  2. latestReading["illuminance"]가 null이면 true를 반환합니다.

  3. newIlluminancenewReading["illuminance"]로 설정합니다.

  4. latestIlluminancelatestReading["illuminance"]로 설정합니다.

  5. abs(latestIlluminance - newIlluminance) < illuminance threshold value이면 false를 반환합니다.

  6. roundedNewReadingAmbient Light 판독값 양자화 알고리즘newIlluminance를 인자로 호출한 결과로 설정합니다.

  7. roundedLatestReadingAmbient Light 판독값 양자화 알고리즘latestIlluminance를 인자로 호출한 결과로 설정합니다.

  8. roundedNewReading["illuminance"]와 roundedLatestIlluminance["illuminance"] 값이 같으면 false를 반환합니다.

  9. 그 외에는 true를 반환합니다.

참고: 이 알고리즘은 Ambient Light 판독값 양자화 알고리즘을 호출하여, 동일한 값으로 올림 처리된 판독값이 최신 update latest reading 알고리즘에서 업데이트를 트리거하지 않도록 보장합니다. 만약 이 과정을 거치지 않으면, 원시 illuminance 판독값이 illuminance threshold value 이상의 차이가 있지만 illuminance rounding multiple로 올림 처리된 값이 다르지 않은 범위 내에 있다는 것을 사용자에게 알릴 수 있습니다.

6.3. Ambient Light 판독값 양자화 알고리즘

주변 광 센서 센서 타입은 다음 판독값 양자화 알고리즘을 정의합니다:

input

reading, 센서 판독값

output

센서 판독값

  1. quantizedReadingreading으로 설정합니다.

  2. quantizedReading["illuminance"]를 illuminance rounding multiple의 배수 중에서 reading["illuminance"]에 가장 가까운 값으로 설정합니다.

  3. quantizedReading을 반환합니다.

7. 자동화

이 섹션은 Generic Sensor API § 9 자동화를 확장하여 주변 광 센서 전용 가상 센서 메타데이터를 제공합니다.

illuminance 판독값 파싱 알고리즘은 JSON Object parameters가 주어졌을 때, parameters와 "illuminance"를 인자로 parse single-value number reading을 호출한 결과를 반환해야 합니다.

타입별 가상 센서 메타데이터 에는 다음 항목(entry)이 있어야 합니다:

key

"ambient-light"

value

가상 센서 메타데이터이며, 판독값 파싱 알고리즘illuminance 판독값 파싱 알고리즘입니다.

8. 사용 사례 및 요구사항

일부 사용 사례는 정밀한 주변 광 측정값을 얻는 데 이점이 있을 수 있지만, 주변 광 수준의 변동을 사용자 입력 이벤트로 변환하는 사용 사례는 더 높은 샘플링 빈도의 이점을 누릴 수 있습니다.

9. 감사의 글

초기 프로토타입의 Doug Turner와 테스트 스위트의 Marcos Caceres에게 감사를 표합니다.

LightLevelSensor 아이디어를 제공한 Paul Bakaus에게 감사합니다.

사용 사례 및 요구사항에 기여한 Mikhail Pozdnyakov와 Alexander Shalamov에게 감사합니다.

프라이버시 위험 평가에 기여한 Lukasz Olejnik에게 감사합니다.

적합성

문서 관례

적합성 요구사항은 설명적 주장과 RFC 2119 용어의 조합으로 표현됩니다. "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL"과 같은 주요 단어는 이 문서의 규범적 부분에서 RFC 2119에 명시된 대로 해석되어야 합니다. 단, 가독성을 위해 이 명세서에서는 해당 단어들이 모두 대문자가 아닌 형태로 나타납니다.

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

이 명세서의 예시는 "for example"이라는 단어로 시작하거나 class="example"와 같이 규범적 텍스트와 구분됩니다, 예시:

이것은 정보 제공용 예시입니다.

정보성 참고는 "Note"라는 단어로 시작하며, class="note"로 규범적 텍스트와 구분됩니다, 예시:

Note, 이것은 정보성 참고입니다.

적합 알고리즘

알고리즘의 일부로 명령형으로 표현된 요구사항 (예: "앞부분의 공백을 제거한다" 또는 "false를 반환하고 이 단계들을 중단한다") 는 알고리즘을 소개하는 키워드("must", "should", "may" 등)의 의미로 해석되어야 합니다.

알고리즘이나 특정 단계로 표현된 적합성 요구사항은 최종 결과가 동일하기만 하면 어떤 방식으로든 구현할 수 있습니다. 특히, 이 명세서에 정의된 알고리즘은 이해하기 쉽게 작성된 것이며 성능을 의도하지는 않았습니다. 구현자는 최적화를 권장합니다.

색인

이 명세서에서 정의된 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[ECMASCRIPT]
ECMAScript 언어 명세. URL: https://tc39.es/ecma262/multipage/
[GENERIC-SENSOR]
Rick Waldron. Generic Sensor API. URL: https://w3c.github.io/sensors/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 표준. 현행 표준. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. 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 표준. 현행 표준. URL: https://webidl.spec.whatwg.org/

참고용 참고 문헌

[ALSPRIVACYANALYSIS]
Lukasz Olejnik. 주변 광 센서의 프라이버시 분석. 2016년 8월 31일. URL: https://blog.lukaszolejnik.com/privacy-of-ambient-light-sensors/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM View 모듈. URL: https://drafts.csswg.org/cssom-view/
[IMAGINGPRIVACY]
Yang Liu; 외. 주변 광 센서에서의 영상 프라이버시 위협. 2024년 1월 10일. URL: https://www.science.org/doi/10.1126/sciadv.adj3608
[MEDIAQUERIES-5]
Dean Jackson; 외. Media Queries Level 5. URL: https://drafts.csswg.org/mediaqueries-5/
[PINSKIMMINGVIASENSOR]
Raphael Spreitzer. PIN Skimming: 모바일 장치에서 주변 광 센서 활용. 2014년 5월 15일. URL: https://arxiv.org/abs/1405.3760
[SI]
SI 브로셔: 국제 단위계(SI), 8판. 2014년. 8판. URL: http://www.bipm.org/en/publications/si-brochure/
[STEALINGSENSITIVEDATA]
Lukasz Olejnik. W3C Ambient Light Sensor API로 민감한 브라우저 데이터 탈취. 2017년 4월 19일. URL: https://blog.lukaszolejnik.com/stealing-sensitive-browser-data-with-the-w3c-ambient-light-sensor-api/
[VIDEORECOGNITIONAMBIENTLIGHT]
Raphael Spreitzer. 주변 광 센서를 활용한 영상 인식. 2016년 4월 21일. URL: https://doi.org/10.1109/PERCOM.2016.7456511

IDL 색인

[SecureContext, Exposed=Window]
interface AmbientLightSensor : Sensor {
  constructor(optional SensorOptions sensorOptions = {});
  readonly attribute double? illuminance;
};