Copyright © 2024 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 문서는 웹 애플리케이션이 디바이스의 자세 변화를 요청하고 알림을 받을 수 있도록 하는 API를 명세합니다.
이 섹션은 문서가 발행될 당시의 상태를 설명합니다. 현재 W3C 발간 목록과 이 기술 보고서의 최신 판은 W3C 기술 보고서 색인에서 확인할 수 있습니다: https://www.w3.org/TR/
이 명세를 도입하려는 벤더는 후보 권고 단계에 진입하기 전이라도 GitHub 저장소를 구독하고 논의에 참여하는 것이 좋습니다.
이 문서는 디바이스 및 센서 작업 그룹에서 권고 트랙을 따라 후보 권고안 스냅샷으로 공개되었습니다.
후보 권고안으로 발표된다고 해서 W3C 및 회원의 승인이나 보증을 의미하지는 않습니다. 후보 권고안 스냅샷은 폭넓은 검토를 받았고, 구현 경험을 수집하며, 작업 그룹 구성원의 로열티 프리 라이선스 약속을 받았습니다.
이 후보 권고안은 2024년 12월 24일 이전에 제안 권고안으로 진전될 것으로 기대되지 않습니다.
이 문서는 W3C 특허 정책을 준수하는 그룹에서 작성되었습니다. W3C는 공개 특허 공개 목록을 관리하며, 그룹 산출물과 관련해 공개된 모든 특허 내역을 확인할 수 있습니다. 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 개별적으로 관련 특허를 알고 있는 경우 필수 청구가 포함된다고 생각되면, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.
이 문서는 2023년 11월 3일 W3C 프로세스 문서의 적용을 받습니다.
디바이스 자세(device posture)는 디바이스가 물리적으로 놓여 있는 위치로, 각도뿐만 아니라 센서에서 얻은 정보를 통해 유추될 수 있습니다. 새로운 유형의 모바일 디바이스들이 등장하고 있으며, 이들은 자세를 변경할 수 있는 기능을 가지고 있습니다. 가장 흔한 형태는 화면이나 화면 주변을 접을 수 있는(폴딩이 가능한) 디바이스로, 실제로 폼 팩터를 물리적으로 변경할 수 있습니다. 디바이스의 자세를 아는 주된 목적은 반응형 디자인을 통해 새로운 사용자 경험을 구현하는 데 있습니다.
언급된 "폴딩" 디바이스에는 주로 두 가지 물리적 폼 팩터가 있습니다: 하나는 하나의 유연한 화면(심리스), 또 하나는 두 개의 화면(이음새 있음)입니다. 두 종류 모두 경첩(hinge)을 중심으로 접을 수 있으며, 현재 명세는 두 유형 모두에 적용됩니다. 또한 심리스와 이음새 있는 디바이스 모두 모바일, 태블릿, 노트북 등 다양한 크기일 수 있습니다. 각 디바이스마다 기본 방향(세로/가로)이 다를 수 있으며, 접힘이 수직 또는 수평으로 일어날 수 있다는 점도 유의해야 합니다.
웹사이트에서 접힘 영역을 피해 가독성을 높이거나, 웹에서 혁신적인 사용 사례를 구현하기 위해 디바이스의 자세를 아는 것은 개발자가 다양한 디바이스에 맞춰 콘텐츠를 최적화하는 데 도움이 됩니다.
디바이스가 평평하지 않은 상태에서도 콘텐츠를 소비하고 탐색할 수 있으므로, 개발자는 디바이스의 자세 상태에 따라 다른 레이아웃을 제공하고자 할 수 있습니다.
다음 내부 슬롯이 Document
인터페이스에 추가됩니다.
내부 슬롯 | 설명 |
---|---|
[[CurrentPosture]] | 디바이스의 현재 자세. |
WebIDL[SecureContext, Exposed=(Window)]
interface DevicePosture
: EventTarget {
readonly attribute DevicePostureType
type
;
attribute EventHandler onchange
;
};
enum DevicePostureType
{
"continuous
",
"folded
"
};
type 속성을 가져올 때, 사용자 에이전트는 MUST this의 관련 글로벌 객체의
연결된
Document의
내부 슬롯 [[CurrentPosture]]
값을 반환해야
합니다.
onchange
속성은 이벤트 핸들러
IDL 속성
이며, onchange
이벤트 핸들러에 해당합니다.
이 이벤트 핸들러의 이벤트 타입은
"change"입니다.
이 명세는 다음 자세 값을 정의합니다:
연속(Continuous) 자세: 연속 자세는 "평평한" 위치를 의미합니다. 이는 대부분의 디바이스에서 기본 상태이며, 다양한 자세를 허용하지 않는 경우입니다.
접힘, 경첩 또는 유사 기능이 없는 디바이스가 포함됩니다.
하드웨어 혁신의 특성상, 듀얼, 폴더블, 롤러블 또는 곡면 화면을 가진 디바이스도 화면이 평평하게 표시되는 자세라면 모두 포함됩니다.
예시:
어떤 경우에는 디바이스가 여러 앱을 실행하거나 물리적으로 평평하지 않은 상태일 수 있지만, 브라우저가 여러 화면/섹션에 걸쳐 있지 않으면 해당 자세는 연속으로 간주됩니다.
예시:
API에서는 자세 값이
DevicePostureType
열거형 값으로 표현됩니다.
미디어 기능은 CSS 미디어 쿼리 [MEDIAQ]를 통해 디바이스의 자세를 나타냅니다. 모든
네비게이블(navigables)은
자신의 자세를
최상위 탐색 가능 객체와
반영합니다.
device-posture
continuous
| folded
사용자 에이전트는 MUST 웹 애플리케이션에 적용된 자세를 CSS 미디어 쿼리 [MEDIAQ]로 반영해야 합니다.
모든 Document
인스턴스에는 내부 슬롯 [[CurrentPosture]]
가 있으며,
Document
가 생성될 때 초기화되어야 하며,
그렇지 않은 경우 MUST 처음 접근 시, 값을 읽기 전에 반드시 초기화되어야 합니다.
사용자
에이전트는 MUST
디바이스 자세 변경 단계를 실행하여,
document를 Document
로,
disallowRecursion을 true로 설정하여 초기화해야 합니다.
특정 Document
의 현재 자세는
현재 경첩 각도와 화면 방향,
그리고 구현별 추가 신호 등에서 파생됩니다.
이 표는 규범적이지 않습니다.
값은 대략적인 것으로, 디바이스마다 다를 수 있습니다. 예를 들어, 평평하게 놓았을 때 정확히 180°가 아니라 175°~185° 범위일 수 있습니다. 디바이스 제작사는 SHOULD 물리적 디바이스 자세가 본 명세에 정의된 자세에 정확히 매핑되도록 해야 합니다. 또한 경첩 각도 외에 더 많은 센서를 사용해 자세를 결정할 수도 있습니다. 예를 들어, 키보드가 화면 하단에 결합되어 있는지, 킥스탠드가 펼쳐져 있는지 여부도 감지할 수 있습니다.
물리적 제약이나 디자인에 따라 일부 자세가 없는 디바이스도 있을 수 있으며, 이 경우 디바이스는 SHOULD 모든 각도와 디바이스 방향(호스트 OS 및 [SCREEN-ORIENTATION]에 의해 고정될 수 있음), 그리고 디바이스 특화 신호가 반드시 정의된 자세 중 하나에 매핑되도록 해야 합니다.
자세 | 각도 값 |
---|---|
continuous | < ~180° |
folded | ~180° |
디바이스 자세 정보를 계산하는 단계는
Document
document에 대해 다음과 같습니다:
DevicePostureType
값을 구현자 정의 방식으로
자세 값 표에 따라 반환한다.
사용자 에이전트가 최상위 탐색 가능 객체의 화면(들) 접힘 각도, 방향 또는 디바이스 특화 신호가 변경되었다고 판단하면, MUST 디바이스 자세 변경 단계를 해당 최상위 탐색 가능 객체의 활성 document로 실행해야 한다.
디바이스
자세 변경 단계는 Document
document와
선택적 boolean disallowRecursion(기본값 false)로 다음과 같이 실행된다:
[[CurrentPosture]]
와 같다면, 이 단계를 중단한다.
[[CurrentPosture]]
를
posture로 설정한다.
change
", 대상은
DevicePosture
객체(해당 document의 관련
글로벌 객체의 Navigator
에
연결됨).
이 명세는 visibility state와 document에 대해 다음 페이지 가시성 변경 단계를 정의합니다:
https://html.spec.whatwg.org/#update-the-visibility-state에서 발췌
명세 작성자는 페이지 가시성 변경 단계 hook을 사용하지 말고, 직접 명세에 call을 추가하는 pull request를 보내는 것이 더 좋습니다. 이렇게 하면 명확한 cross-specification 호출 순서를 보장할 수 있습니다. 이 글 작성 시점에서 다음 명세들은 페이지 가시성 변경 단계를 가지고 있으며, 이 단계들은 정의되지 않은 순서로 실행됩니다: Device Posture API 및 Web NFC. [DEVICEPOSTURE] [WEBNFC]
본 명세에 대해 새로운 보안 고려사항이 보고된 바는 없습니다. 하지만 이 문서에서 기술된 10. 개인정보 보호 고려사항을 참고하는 것이 권장됩니다.
이 섹션은 규범적이지 않습니다.
이 API가 동일한 디바이스의 서로 다른 브라우징 컨텍스트에서 동시에 사용될 때, 두 컨텍스트 간에 사용자를 연관시켜 예기치 않은 추적 메커니즘이 만들어질 수 있습니다. 하지만 자세 값은 일반적으로 오랜 시간 동안 안정적이기 때문에, 두 사용자가 동일하지 않음을 확인하는 데 사용할 수는 있지만, 다양한 폴더블 디바이스의 타입과 모델이 존재한다는 점에서 특정 사용자를 식별하는 데에는 도움이 되지 않습니다.
추가된 엔트로피는 사용자의 주요 입력이 터치 기반인지 여부를 알려주는 pointer API에 비견할 수 있습니다. 이러한 주요 입력은 키보드가 분리/결합되거나 태블릿 모드가 활성화/비활성화될 때 변경될 수 있습니다.
이론적 공격은 10.2.1 데이터 최소화, 10.2.2 사용자 주의 및 10.2.3 사용자 중재 행동으로 완화됩니다.
교차 출처 iframe도 이 API를 통해 자세에 접근할 수 있으므로, 10.1.1 컨텍스트 간 사용자 식별에서 언급된 것과 유사하게 사용자를 식별하는 데 정보를 사용할 수 있습니다. 동일한 완화책이 적용됩니다.
iframe을 통해 악의적 행위자가 자신의 코드를 주입하여 자세 정보를 접근하고, 이를 이용해 사용자를 추적할 수 있습니다.
이론적 공격은 10.2.1 데이터 최소화 및 자세 값 자체가 담고 있는 정보가 적고 장기간 안정적으로 유지된다는 사실에 의해 완화됩니다.
API는 "자세"라는 고수준 추상화만 노출하며,
"continuous
" 또는
"folded
" 중 하나입니다. 다양한 자세를 지원하지 않는
디바이스는 기본적으로 "continuous
"로 설정됩니다.
즉, 핑거프린트에 최대 1비트의 엔트로피만 더해집니다.
또한 이 1비트가 노출되려면 사용자가 디바이스의 물리적 자세를 명확하고 큰 동작으로 바꿔야만 합니다.
구현은 다양한 저수준 정보를 활용해 가장 적합한 고수준 자세를 결정할 수 있지만, 저수준 세부 정보는 이 API를 통해 노출되지 않습니다. 또한 어떤 세밀한 센서 값도 고수준 자세 상태에 1:1로 매핑되지 않습니다. 구현은 경첩 각도 센서, 다른 센서, 키보드 결합 여부, 킥스탠드 펼침 여부, 또는 이들의 조합 등을 활용해 폼 팩터에 맞는 가장 적합한 자세를 결정할 수 있습니다. 이러한 추상화 덕분에 필요한 최소 정보만 노출되어 데이터 최소화 원칙을 준수하게 됩니다.
자세 값 변경 이벤트는 활성 document이 visibility state가 "visible"일 때만 발송됩니다(디바이스 자세 변경 단계 참고). 이 상태가 아닐 때 값을 폴링하면 오래된 값이 반환되며, 값은 "visible" 상태거나 "visible"로 변경될 때만 갱신됩니다.
자세 변경에는 사용자의 명확하고 큰 물리적 행동이 요구됩니다. "큰"이란 자세 값 표에 따라 구현자 정의 임계값을 넘어야 하며, "명확하다"는 것은 OS가 자세 변화에 맞게 적절히 반응하고 사용자의 기대에 부합하는 결과가 나타나야 한다는 뜻입니다.
Window
의
너비와 높이에 맞게 확장합니다.
디바이스가 접혀 있으면 해당 요소가 접힘 영역을 가로질러 배치되어 사용자 경험이 저하됩니다. 대안으로 해당 요소를 접힘 영역 위나 아래에 표시할 수 있습니다.
자세
만을 위해 설계되어서는 안 됩니다: 폴더블 디바이스의 핵심은 사용자에 따라
자세를 자유롭게 변경할 수 있다는 점입니다. 방향(orientation)과 유사하게, 항상
사용자를 대신해 선택하기보다는 사용자가 자신의 필요에 따라 UI를 직접 선택할 수 있도록 하는 것이 중요합니다. 이상적으로는 UI를 설정 가능하게 만드는 것이 바람직합니다.
Device Posture API는 테스트 작성자에게 도전 과제를 제시합니다. 인터페이스를 완전히 테스트하려면 실제 하드웨어 디바이스가 필요하기 때문입니다. 이를 해결하기 위해 본 문서는 [WEBDRIVER2] 확장 명령어를 정의하여 사용자가 보고되는 디바이스 자세를 제어하고 실제 디바이스를 시뮬레이션할 수 있도록 합니다.
아래 확장 명령어 및 8. 알고리즘과의 통합을 지원하기 위해, 최상위 탐색 가능 객체에는 다음과 같은 내부 슬롯이 필요합니다:
내부 슬롯 | 설명 |
---|---|
[[PostureOverride]] |
하드웨어가 제공하는 현재 자세를 재정의합니다.
가능한 값:
|
HTTP 메서드 | URI 템플릿 |
---|---|
POST | /session/{session id}/deviceposture |
이 확장 명령어는 디바이스 자세를 특정 DevicePostureType
로
변경합니다.
파라미터 이름 | 값 타입 | 필수 여부 |
---|---|---|
posture | 문자열 | 예 |
remote end steps는 다음과 같습니다:
continuous
" 또는
"folded
"가 아니면, error를 WebDriver error code invalid argument와 함께 반환한다.
null
과 함께
반환한다.
HTTP 메서드 | URI 템플릿 |
---|---|
DELETE | /session/{session id}/deviceposture |
이 확장 명령어는 디바이스 자세 오버라이드를 제거하고, 디바이스 자세 제어를 하드웨어로 되돌립니다.
remote end steps는 다음과 같습니다:
null
이면, success를
data null
과 함께 반환한다.
null
로 설정한다.
null
과 함께
반환한다.
이 섹션은 규범적이지 않습니다.
이것은 자세를 콘솔에 출력하는 간단한 사용 예입니다.
navigator.devicePosture.addEventListener("change", () => {
console.log(`현재 자세는: ${navigator.devicePosture.type}!`);
})
디바이스가 영상통화 웹 서비스에 사용되고 있습니다. 표면에 올려놓으면 노트북 자세로 접혀 핸즈프리 경험을 할 수 있습니다. UA가 자세를 감지하여 UI를 개선합니다. 모든 자세에 맞춰 콘텐츠를 적응시키는 유사 예시도 작성할 수 있습니다. 다른 주요 시나리오는 설명서를 참고하세요.
@media (device-posture: folded) and (vertical-viewport-segments: 2) {
body {
display: flex;
flex-flow: column nowrap;
}
.videocall-area, .videocall-controls {
flex: 1 1 env(viewport-segment-bottom 0 0);
}
}
유효한 device-posture 값 중 하나는 항상 true가 되므로, 다음 코드로 미디어 기능 지원 여부를 감지할 수 있습니다:
@media (device-posture) {
/*브라우저가 device-posture 기능을 지원함*/
}
규범적이지 않은 섹션뿐만 아니라, 본 명세서의 모든 작성 지침, 다이어그램, 예시, 참고사항은 모두 규범적이지 않습니다. 그 외의 모든 내용은 규범적입니다.
이 문서에서 MUST와 SHOULD라는 키워드는 BCP 14 [RFC2119] [RFC8174] 에 설명된 대로, 그리고 오직 이 문서에서처럼 대문자로 표시된 경우에만 해석합니다.
이 명세는 하나의 제품에 대한 준수 기준을 정의합니다: 이 명세서가 포함하는 인터페이스를 구현하는 사용자 에이전트.
WebIDL[SecureContext, Exposed=(Window)]
partial interface Navigator {
[SameObject] readonly attribute DevicePosture
devicePosture
;
};
[SecureContext, Exposed=(Window)]
interface DevicePosture
: EventTarget {
readonly attribute DevicePostureType
type
;
attribute EventHandler onchange
;
};
enum DevicePostureType
{
"continuous
",
"folded
"
};
이 섹션은 규범적이지 않습니다.
Daniel Appelquist, Jo Balletti, Michael Blix, Paul Grenier, Laura Morinigo님께 본 작업에 기여해주신 점 진심으로 감사드립니다.
이 섹션은 규범적이지 않습니다.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: