1. 소개
주변 광 센서는 Generic Sensor API [GENERIC-SENSOR]를 확장하여, 장치의 주요 광 감지기가 감지한 주변 광 수준 정보를 lux 단위로 제공합니다.
1.1. 범위
이 문서는 사용 사례 중에서 세밀한 조도 데이터와 낮은 지연 시간, 그리고 높은 빈도로 샘플링이 필요한 경우를 위한 API를 명세합니다.
대부분의 웹 페이지에서 대비 수준이나 주변 광 수준에 따라 영향을 받을 수 있는 선호 색상 테마 등, 소수의 조도 값만 필요로 하는 일반적인 사용 사례는
prefers-contrast
및 prefers-color-scheme
CSS 미디어 기능 [MEDIAQUERIES-5]
그리고 matchMedia
API [CSSOM-VIEW-1]로 처리하는 것이 더 적합하며, 이 API의 범위에는 포함되지 않습니다.
참고: [MEDIAQUERIES-5] 명세에는 과거에 주변 광 판독값과
직접적으로 연동된 light-level
미디어 기능이 있었으나, 이후
삭제
되었으며, 보다 상위 개념인 prefers-color-scheme
및 prefers-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();
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. 보안 및 프라이버시 고려사항
주변 광 센서는 장치 환경 근처의 조명 상태에 대한 정보를 제공합니다. 잠재적인 프라이버시 위험은 다음과 같습니다:
-
프로파일링. 주변 광 센서는 사용자의 사용 패턴과 주변 환경에 대한 정보를 누출할 수 있습니다. 이러한 정보는 사용자 프로파일링과 행동 분석을 강화하는 데 사용될 수 있습니다.
-
디바이스 간 연결. 두 장치가 동일한 타사 스크립트가 포함된 웹사이트에 접속하면, 시간에 따라 조명 수준을 상관시킬 수 있습니다.
-
디바이스 간 통신. 간단한 브로드캐스트 통신 방식으로, 장치의 화면이나 카메라 LED 플래시를 사용해 메시지를 전송하고 인근 장치의 주변 광 센서로 읽을 수 있습니다.
-
교차 출처(Origin) 정보 누출. 화면에서 방출된 빛이 근처의 반사 표면에 반사되어 센서로 다시 돌아올 수 있습니다. 악의적인 사이트는 다른 출처의 리소스를 임베드하고 특정 픽셀을 표시하도록 콘텐츠 크기를 조절해, 개별 픽셀 단위로 콘텐츠를 구분할 수 있습니다.
-
브라우징 기록 탈취. 방문한 링크와 방문하지 않은 링크에 따라 조명 수준을 구분할 수 있도록 스타일링함으로써, 예를 들어 방문한 링크는 검은색 블록, 방문하지 않은 링크는 흰색으로 스타일링할 수 있습니다.
[ALSPRIVACYANALYSIS], [PINSKIMMINGVIASENSOR], [STEALINGSENSITIVEDATA], [VIDEORECOGNITIONAMBIENTLIGHT], 그리고 [IMAGINGPRIVACY] 등의 연구가 이러한 이슈를 더 깊이 다룹니다.
주변 광 센서에 특화된 위협을 완화하기 위해, 사용자 에이전트는 센서 판독값의 정확도를 낮춰야 합니다. 또한, 사용자 에이전트는 최대 샘플링 빈도 제한을 적용할 수 있습니다.
이러한 완화 전략은 Generic Sensor API [GENERIC-SENSOR]에서 정의된 일반적인 완화책을 보완하는 역할을 합니다.
3.1. 센서 판독 정확도 낮추기
센서 판독값의 정확도를 낮추기 위해, 이 명세서는 임계값 확인 알고리즘(Ambient Light 임계값 확인 알고리즘)과 판독값 양자화 알고리즘(Ambient Light 판독값 양자화 알고리즘)을 정의합니다.
이 알고리즘들은 illuminance rounding multiple과 illuminance threshold value를 사용합니다. 구현체는 다음의 요구사항을 따라야 합니다:
-
illuminance rounding multiple 값은 최소 50 lux 이상이어야 합니다.
-
illuminance threshold value 값은 illuminance rounding multiple의 절반 이상이어야 합니다.
참고: 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 버그 1332536과 Chromium 리뷰 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 단계는 다음과 같습니다:
-
illuminance를 get value from latest reading에 this와 "illuminance"를 인자로 호출한 결과로 설정합니다.
-
illuminance를 반환합니다.
6. 추상 연산
6.1. Ambient Light Sensor 객체 생성
- input
-
options,
SensorOptions
객체. - output
-
allowed를 check sensor policy-controlled features에
AmbientLightSensor
를 인자로 호출한 결과로 설정합니다. -
allowed가 false이면:
-
Throw
SecurityError
DOMException
을 발생시킵니다.
-
-
ambient_light_sensor를 새로운
AmbientLightSensor
객체로 설정합니다. -
ambient_light_sensor와 options를 인자로 하여 initialize a sensor object를 호출합니다.
-
ambient_light_sensor를 반환합니다.
6.2. Ambient Light 임계값 확인 알고리즘
주변 광 센서 센서 타입은 다음 임계값 확인 알고리즘을 정의합니다:
-
newReading["illuminance"]가 null이면 true를 반환합니다.
-
latestReading["illuminance"]가 null이면 true를 반환합니다.
-
newIlluminance를 newReading["illuminance"]로 설정합니다.
-
latestIlluminance를 latestReading["illuminance"]로 설정합니다.
-
abs(latestIlluminance - newIlluminance) < illuminance threshold value이면 false를 반환합니다.
-
roundedNewReading를 Ambient Light 판독값 양자화 알고리즘에 newIlluminance를 인자로 호출한 결과로 설정합니다.
-
roundedLatestReading를 Ambient Light 판독값 양자화 알고리즘에 latestIlluminance를 인자로 호출한 결과로 설정합니다.
-
roundedNewReading["illuminance"]와 roundedLatestIlluminance["illuminance"] 값이 같으면 false를 반환합니다.
-
그 외에는 true를 반환합니다.
참고: 이 알고리즘은 Ambient Light 판독값 양자화 알고리즘을 호출하여, 동일한 값으로 올림 처리된 판독값이 최신 update latest reading 알고리즘에서 업데이트를 트리거하지 않도록 보장합니다. 만약 이 과정을 거치지 않으면, 원시 illuminance 판독값이 illuminance threshold value 이상의 차이가 있지만 illuminance rounding multiple로 올림 처리된 값이 다르지 않은 범위 내에 있다는 것을 사용자에게 알릴 수 있습니다.
6.3. Ambient Light 판독값 양자화 알고리즘
주변 광 센서 센서 타입은 다음 판독값 양자화 알고리즘을 정의합니다:
-
quantizedReading을 reading으로 설정합니다.
-
quantizedReading["illuminance"]를 illuminance rounding multiple의 배수 중에서 reading["illuminance"]에 가장 가까운 값으로 설정합니다.
-
quantizedReading을 반환합니다.
7. 자동화
이 섹션은 Generic Sensor API § 9 자동화를 확장하여 주변 광 센서 전용 가상 센서 메타데이터를 제공합니다.
Object
parameters가 주어졌을 때, parameters와 "illuminance
"를 인자로 parse single-value number reading을 호출한 결과를 반환해야 합니다.
타입별 가상 센서 메타데이터 맵에는 다음 항목(entry)이 있어야 합니다:
- key
- value
8. 사용 사례 및 요구사항
-
웹 애플리케이션이 스마트홈 시스템에 조명 제어 입력을 제공합니다.
-
웹 애플리케이션이 작업 공간의 광 수준이 충분한지 확인합니다.
-
웹 애플리케이션이 수동 조절(조리개, 셔터속도, ISO)이 가능한 카메라의 설정을 계산합니다.
-
웹 애플리케이션이 현재 광 수준을 확인하여, 카메라 스트림이 목적(예: 사람 존재 확인)에 충분히 정확한 데이터를 포함하는지 판단합니다.
일부 사용 사례는 정밀한 주변 광 측정값을 얻는 데 이점이 있을 수 있지만, 주변 광 수준의 변동을 사용자 입력 이벤트로 변환하는 사용 사례는 더 높은 샘플링 빈도의 이점을 누릴 수 있습니다.
9. 감사의 글
초기 프로토타입의 Doug Turner와 테스트 스위트의 Marcos Caceres에게 감사를 표합니다.
LightLevelSensor 아이디어를 제공한 Paul Bakaus에게 감사합니다.
사용 사례 및 요구사항에 기여한 Mikhail Pozdnyakov와 Alexander Shalamov에게 감사합니다.
프라이버시 위험 평가에 기여한 Lukasz Olejnik에게 감사합니다.