주변광 센서

W3C 작업 초안,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-ambient-light-20260514/
최신 공개 버전:
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 기술 보고서 색인에서 찾을 수 있다.

이 문서는 Devices and Sensors Working GroupRecommendation 트랙을 사용하여 작업 초안으로 공개했다. 이 문서는 W3C Recommendation이 되는 것을 목적으로 한다.

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

작업 초안으로 공개되었다고 해서 W3C와 그 회원의 지지를 의미하는 것은 아니다. 이 문서는 초안 문서이며 언제든지 다른 문서로 업데이트, 대체 또는 폐기될 수 있다. 진행 중인 작업 이외의 것으로 이 문서를 인용하는 것은 적절하지 않다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹이 작성했다. W3C는 이 그룹의 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지한다. 해당 페이지에는 특허를 공개하기 위한 지침도 포함되어 있다. 개인이 필수 청구항을 포함한다고 믿는 특허에 대해 실제 지식을 가지고 있는 경우, 그 개인은 W3C 특허 정책 6절에 따라 해당 정보를 공개해야 한다.

이 문서는 2025년 8월 18일 W3C Process Document의 적용을 받는다.

이 명세는 어떤 브라우저 엔진에서도 기본적으로 사용할 수 없다. 현재 형태로는 W3C Recommendation으로 진전될 것으로 예상되지 않는다.

Devices and Sensors Working Group은 이 명세와 개인정보 및 보안 검토 관행 양쪽 모두에서 2017년 10월 3일에 이루어진 수평 검토 이후 변경된 정도를 고려하여, 이 명세에 대한 현대적인 보안 및 개인정보 검토를 진행하고 있다. 마찬가지로, 이 그룹은 최신 아키텍처 검토 관행을 반영하기 위해 이 명세에 대한 Technical Architecture Group 검토의 업데이트를 추진하고 있다.

1. 소개

Ambient Light Sensor는 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', () => {
        // Defaut ISO value.
        const ISO = 100;
        // Incident-light calibration constant.
        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 'public areas, short visits';
    } else if (lux > 100 && lux < 150) {
        return 'occasionally performed visual tasks';
    } else if (lux > 150 && lux < 250) {
        return 'easy office work, classes, homes, theaters';
    } else if (lux > 250 && lux < 500) {
        return 'normal office work, groceries, laboratories';
    } else if (lux > 500 && lux < 1000) {
        return 'mechanical workshops, drawing, supermarkets';
    } else if (lux > 1000 && lux < 5000) {
        return 'detailed drawing work, visual tasks of low contrast';
    }

    return;
}

3. 보안 및 개인정보 고려사항

여기에 추적 벡터가 있다. Ambient Light Sensor는 기기 환경 근처의 조명 조건에 대한 정보를 제공한다. 잠재적인 개인정보 위험은 다음을 포함한다:

[ALSPRIVACYANALYSIS], [PINSKIMMINGVIASENSOR], [STEALINGSENSITIVEDATA], [VIDEORECOGNITIONAMBIENTLIGHT], 및 [IMAGINGPRIVACY]와 같은 작업은 이러한 문제를 더 깊이 다룬다.

Ambient Light Sensor에 특화된 이러한 위협을 완화하기 위해 사용자 에이전트는 센서 판독값의 정확도를 낮춰야 한다. 사용자 에이전트는 최대 샘플링 빈도를 제한할 수도 있다.

이러한 완화 전략은 Generic Sensor API [GENERIC-SENSOR]에 정의된 일반적 완화를 보완한다.

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

센서 판독값의 정확도를 낮추기 위해, 이 명세는 임계값 검사 알고리즘( 주변광 임계값 검사 알고리즘)과 판독값 양자화 알고리즘( 주변광 판독값 양자화 알고리즘)을 정의한다.

이 알고리즘들은 조도 반올림 배수조도 임계값을 사용한다. 구현은 그 값에 대해 다음 요구사항을 준수해야 한다:

참고: 조도 반올림 배수를 선택하려면 너무 정밀한 판독값을 노출하지 않는 것과 API 사용자에게 여전히 유용한 판독값을 제공하는 것 사이의 균형을 맞춰야 한다. 조도 반올림 배수의 최솟값으로서 50 lux 값은 서로 다른 조명 조건에서의 다양한 주변광 수준 측정값이 수집되고 [STEALINGSENSITIVEDATA]에 설명된 공격을 좌절시키는 것으로 나타난 뒤, GitHub 이슈 #13에서 결정되었다. 50 lux는 또한 주변광 센서 판독값을 사용한 비디오 인식 ([VIDEORECOGNITIONAMBIENTLIGHT])을 실행 불가능하게 만드는 데 필요한 5 lux보다도 높다.

참고: 조도 임계값은 판독값이 특정 값 주변에서 맴돌지만 서로 다른 값으로 양자화된다는 사실이 누출되는 것을 방지하는 데 사용된다. 예를 들어, 조도 반올림 배수가 50인 경우, 원시 판독값이 24와 26 사이에서 전환되더라도 조도 값이 0과 50 사이에서 전환되는 것을 방지한다. 보조 지문채취 완화 전략으로서 임계값 검사 알고리즘의 효과는 수학적으로 증명되지 않았지만, 구현 경험에 근거하여 이 명세에 추가되었다. Chromium 버그 1332536Chromium 리뷰 3666917에는 이에 대한 더 많은 정보가 포함되어 있다.

4. 모델

Ambient Light Sensor 센서 타입의 연결된 Sensor 서브클래스는 AmbientLightSensor 클래스이다.

Ambient Light Sensor에는 기본 센서가 있으며, 이는 기기의 주 광 검출기이다.

Ambient Light Sensor는 "ambient-light-sensor"라는 이름으로 식별되는 강력한 기능이며, 이는 또한 연결된 센서 권한 이름이기도 하다. 그 권한 철회 알고리즘은 "ambient-light-sensor"로 일반 센서 권한 철회 알고리즘을 호출한 결과이다.

Ambient Light Sensor는 문자열 "ambient-light-sensor"로 식별되는 정책 제어 기능이다. 그 기본 허용 목록'self'이다.

Ambient Light Sensor에는 "ambient-light"인 가상 센서 타입이 있다.

현재 광 수준 또는 조도는 호스팅 기기 주변의 주변광 수준을 나타내는 값이다. 그 단위는 lux (lx) [SI]이다.

참고: 동일한 빛 아래에서 서로 다른 기기가 보고하는 정확한 lux 값은 검출 방법, 센서 구성 등의 차이로 인해 다를 수 있다.

Ambient Light Sensor에는 lux 단위로 측정되는 조도 반올림 배수가 있으며, 이는 조도 판독값이 올림될 배수를 나타내는 숫자이다.

Ambient Light Sensor에는 lux 단위로 측정되는 조도 임계값이 있으며, 이는 주변광 임계값 검사 알고리즘에서 사용된다.

참고: 위에서 설명한 값들의 최솟값 요구사항은 § 3.1 센서 판독값 정확도 낮추기를 보라.

5. API

5.1. AmbientLightSensor 인터페이스

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

AmbientLightSensor 객체를 구성하려면 사용자 에이전트는 주변광 센서 객체 구성 추상 연산을 호출해야 한다.

5.1.1. illuminance 속성

illuminance getter 단계는 다음과 같다:

  1. this와 "illuminance"를 인자로 사용하여 최신 판독값에서 값 가져오기를 호출한 결과를 illuminance라고 하자.

  2. illuminance를 반환한다.

6. 추상 연산

6.1. 주변광 센서 객체 구성

입력

options, SensorOptions 객체.

출력

AmbientLightSensor 객체.

  1. AmbientLightSensor센서 정책 제어 기능 검사를 호출한 결과를 allowed라고 하자.

  2. allowed가 false이면:

    1. SecurityError DOMException던진다.

  3. AmbientLightSensor 객체를 ambient_light_sensor라고 하자.

  4. ambient_light_sensoroptions센서 객체 초기화를 호출한다.

  5. ambient_light_sensor를 반환한다.

6.2. 주변광 임계값 검사 알고리즘

Ambient Light Sensor 센서 타입은 다음 임계값 검사 알고리즘을 정의한다:

입력

newReading, 센서 판독값

latestReading, 센서 판독값

출력

판독값의 차이가 충분히 유의미한지를 나타내는 boolean.

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

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

  3. newReading["illuminance"]를 newIlluminance라고 하자.

  4. latestReading["illuminance"]를 latestIlluminance라고 하자.

  5. abs(latestIlluminance - newIlluminance) < 조도 임계값이면, false를 반환한다.

  6. newIlluminance주변광 판독값 양자화 알고리즘 알고리즘을 호출한 결과를 roundedNewReading이라고 하자.

  7. latestIlluminance주변광 판독값 양자화 알고리즘 알고리즘을 호출한 결과를 roundedLatestReading이라고 하자.

  8. roundedNewReading["illuminance"]와 roundedLatestIlluminance["illuminance"]가 같으면, false를 반환한다.

  9. 그렇지 않으면, true를 반환한다.

참고: 이 알고리즘은 주변광 판독값 양자화 알고리즘을 호출하여 같은 값으로 올림되는 판독값이 주 최신 판독값 업데이트 알고리즘에서 업데이트를 트리거하지 않도록 보장한다. 그렇게 하지 않으면 원시 조도 판독값이 조도 임계값만큼은 차이가 나지만 서로 다른 조도 반올림 배수로 올림되지는 않는 범위 안에 있다는 사실을 사용자에게 나타내게 된다.

6.3. 주변광 판독값 양자화 알고리즘

Ambient Light Sensor 센서 타입은 다음 판독값 양자화 알고리즘을 정의한다:

입력

reading, 센서 판독값

출력

센서 판독값

  1. readingquantizedReading이라고 하자.

  2. quantizedReading["illuminance"]를 reading["illuminance"]에 가장 가까운 조도 반올림 배수의 배수로 설정한다.

  3. quantizedReading을 반환한다.

7. 자동화

이 절은 Generic Sensor API § 9 자동화를 확장하여 Ambient Light Sensor에 특화된 가상 센서 메타데이터를 제공한다.

JSON Object parameters가 주어졌을 때, 조도 판독값 구문 분석 알고리즘parameters 및 "illuminance"로 단일 값 숫자 판독값 구문 분석을 호출한 결과를 반환해야 한다.

타입별 가상 센서 메타데이터 map은 다음 항목을 가져야 한다:

"ambient-light"

조도 판독값 구문 분석 알고리즘판독값 구문 분석 알고리즘으로 갖는 가상 센서 메타데이터.

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]

이 명세의 예제는 “예를 들어”라는 말로 도입되거나 class="example"을 사용하여 다음과 같이 규범적 텍스트와 구분된다:

이것은 정보성 예제의 예이다.

정보성 참고는 “참고”라는 말로 시작하며 class="note"를 사용하여 다음과 같이 규범적 텍스트와 구분된다:

참고, 이것은 정보성 참고이다.

적합한 알고리즘

알고리즘의 일부로 명령형으로 표현된 요구사항 (예: "strip any leading space characters" 또는 "return false and abort these steps")은 그 알고리즘을 도입할 때 사용된 핵심 단어 ("must", "should", "may" 등)의 의미로 해석되어야 한다.

알고리즘 또는 특정 단계로 표현된 적합성 요구사항은 최종 결과가 동등하기만 하면 어떤 방식으로든 구현할 수 있다. 특히 이 명세에 정의된 알고리즘은 이해하기 쉽도록 의도된 것이며 성능을 목적으로 한 것은 아니다. 구현자는 최적화할 것이 권장된다.

색인

이 명세에서 정의하는 용어

참조에서 정의하는 용어

참조문헌

규범적 참조문헌

[ECMASCRIPT]
ECMAScript Language Specification. 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 Standard. Living Standard. 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. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

비규범적 참조문헌

[ALSPRIVACYANALYSIS]
Lukasz Olejnik. Privacy analysis of Ambient Light Sensors. 31 August 2016. URL: https://blog.lukaszolejnik.com/privacy-of-ambient-light-sensors/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View Module. URL: https://drafts.csswg.org/cssom-view/
[IMAGINGPRIVACY]
Yang Liu; et al. Imaging privacy threats from an ambient light sensor. 10 January 2024. URL: https://www.science.org/doi/10.1126/sciadv.adj3608
[MEDIAQUERIES-5]
Tab Atkins Jr.; et al. Media Queries Level 5. URL: https://drafts.csswg.org/mediaqueries-5/
[PINSKIMMINGVIASENSOR]
Raphael Spreitzer. PIN Skimming: Exploiting the Ambient-Light Sensor in Mobile Devices. 15 May 2014. URL: https://arxiv.org/abs/1405.3760
[SI]
SI Brochure: The International System of Units (SI), 8th edition. 2014. 8th Edition. URL: http://www.bipm.org/en/publications/si-brochure/
[STEALINGSENSITIVEDATA]
Lukasz Olejnik. Stealing sensitive browser data with the W3C Ambient Light Sensor API. 19 April 2017. URL: https://blog.lukaszolejnik.com/stealing-sensitive-browser-data-with-the-w3c-ambient-light-sensor-api/
[VIDEORECOGNITIONAMBIENTLIGHT]
Raphael Spreitzer. Video recognition using ambient light sensors. 21 April 2016. URL: https://doi.org/10.1109/PERCOM.2016.7456511

IDL 색인

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