Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 문서는 웹 애플리케이션이 디바이스의 자세 변화를 요청하고 알림을 받을 수 있도록 하는 API를 명세합니다.
이 절은 이 문서가 공개된 시점의 상태를 설명한다. 현재 W3C 공개 문서 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있다.
이 명세는 Chromium 기반 브라우저에서 구현되어 있다. WebKit 및 Mozilla는 아직 이 명세에 대한 공식 입장을 발표하지 않았다.
이 명세가 최종적으로 후보 권고안 단계에 도달하기 전에 구현하는 데 관심이 있는 벤더는 GitHub에서 저장소를 구독하고 논의에 참여해야 한다.
이 문서는 Devices and Sensors Working Group이 권고안 트랙을 사용하여 후보 권고안 초안으로 공개했다.
후보 권고안으로 공개되었다고 해서 W3C와 그 회원들이 승인했음을 의미하지 않는다. 후보 권고안 초안은 워킹 그룹이 이후의 후보 권고안 스냅샷에 포함하려는 이전 후보 권고안의 변경 사항을 통합한다.
이 문서는 초안 문서이며 언제든지 다른 문서로 업데이트, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업이 아닌 것으로 인용하는 것은 적절하지 않다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었다. W3C는 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지하며, 해당 페이지에는 특허 공개에 대한 지침도 포함되어 있다. 개인이 필수 청구항을 포함한다고 믿는 특허에 대해 실제 지식을 가지고 있는 경우, 그 개인은 W3C 특허 정책의 6절에 따라 정보를 공개해야 한다.
이 문서는 2025년 8월 18일 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 속성을 가져올 때, 사용자 에이전트는 this의
관련
전역 객체의 연관된
Document의
내부 슬롯 [[CurrentPosture]] 값을
반환해야 MUST 한다.
onchange 속성은 이벤트
핸들러 IDL 속성이며,
onchange 이벤트 핸들러에
대응하고, 그 이벤트 핸들러
이벤트 유형은 "change"이다.
이 명세는 다음 자세 값을 정의합니다:
연속(Continuous) 자세: 연속 자세는 "평평한" 위치를 의미합니다. 이는 대부분의 디바이스에서 기본 상태이며, 다양한 자세를 허용하지 않는 경우입니다.
접힘, 경첩 또는 유사 기능이 없는 디바이스가 포함됩니다.
하드웨어 혁신의 특성상, Document가 평면 레이아웃으로
표시될 것으로 예상되는
자세에 있는 한, 듀얼, 접이식, 롤러블 또는 곡면 화면이 있는
장치도 포함한다.
예시:
어떤 경우에는 디바이스가 여러 앱을 실행하거나 물리적으로 평평하지 않은 상태일 수 있지만, 브라우저가 여러 화면/섹션에 걸쳐 있지 않으면 해당 자세는 연속으로 간주됩니다.
예시:
API에서는 자세 값이
DevicePostureType 열거형 값으로 표현됩니다.
미디어 특성은 CSS
미디어 쿼리 [MEDIAQ]를 통해 장치의 자세를 나타낸다. 모든
navigable은
자신의
최상위
traversable의 자세를 반영한다.
device-posture
continuous | folded
사용자 에이전트는 MUST 웹 애플리케이션에 적용된 자세를 CSS 미디어 쿼리 [MEDIAQ]로 반영해야 합니다.
Document의 모든 인스턴스는 내부 슬롯
[[CurrentPosture]]을 가지며, 이는
Document가 생성될 때 초기화되어야 한다. 그렇지 않은 경우,
그 값이 읽히기 전에 처음 접근될 때 MUST 초기화되어야 한다. 사용자
에이전트는 이를 초기화하기 위해, document를 Document로 설정하고 disallowRecursion를 true로 설정하여 장치 자세
변경 단계를 MUST 실행해야 한다.
주어진 Document에 대해, 현재 자세는 현재 힌지 각도와 화면 방향,
그리고 잠재적으로 그 밖의 구현별 신호로부터 도출된다.
이 표는 규범적이지 않습니다.
값은 대략적인 것으로, 디바이스마다 다를 수 있습니다. 예를 들어, 평평하게 놓았을 때 정확히 180°가 아니라 175°~185° 범위일 수 있습니다. 디바이스 제작사는 SHOULD 물리적 디바이스 자세가 본 명세에 정의된 자세에 정확히 매핑되도록 해야 합니다. 또한 경첩 각도 외에 더 많은 센서를 사용해 자세를 결정할 수도 있습니다. 예를 들어, 키보드가 화면 하단에 결합되어 있는지, 킥스탠드가 펼쳐져 있는지 여부도 감지할 수 있습니다.
물리적 제약이나 디자인에 따라 일부 자세가 없는 디바이스도 있을 수 있으며, 이 경우 디바이스는 SHOULD 모든 각도와 디바이스 방향(호스트 OS 및 [SCREEN-ORIENTATION]에 의해 고정될 수 있음), 그리고 디바이스 특화 신호가 반드시 정의된 자세 중 하나에 매핑되도록 해야 합니다.
| 자세 | 각도 값 |
|---|---|
| continuous | < ~180° |
| folded | ~180° |
Document document의 장치 자세 정보를 계산하는 단계는 다음과 같다:
DevicePostureType
값을
자세 값 표에 따라 반환한다.
사용자 에이전트가 최상위 traversable에 대해 화면(들)의 접힘 각도, 방향 또는 장치별 신호가 변경되었다고 판단하면, 사용자 에이전트는 최상위 traversable의 활성 document와 함께 장치 자세 변경 단계를 MUST 실행해야 한다.
Document
document와
선택적 boolean disallowRecursion(기본값 false)에 대한
장치 자세
변경 단계는 다음과 같다:
[[CurrentPosture]]와 같으면, 이 단계를 중단한다.
[[CurrentPosture]]를
posture로 설정한다.
Navigator와
연결된
DevicePosture
객체에서 "change"라는 이름의
이벤트를
발화한다.
이 명세는 visibility state와 document가 주어졌을 때 다음 페이지 가시성 변경 단계를 정의한다:
출처: https://html.spec.whatwg.org/#update-the-visibility-state
잘 정의된 명세 간 호출 순서를 보장하려면, 명세 작성자가 페이지 가시성 변경 단계 훅을 사용하는 대신, 여기에서 직접 자신의 명세로 호출을 추가하는 풀 리퀘스트를 보내는 편이 더 낫다. 이 글을 작성하는 시점에, 지정되지 않은 순서로 실행될 페이지 가시성 변경 단계를 가진 것으로 알려진 명세는 다음과 같다: 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 중 가시성 상태가 "visible"인 각 항목에 대해서만 발화된다. 이는 장치 자세 변경 단계에서 설명한 바와 같다. 그리고 그렇지 않은 동안 값을 폴링하면 오래된 값이 반환된다. 값은 가시성 상태가 "visible"이거나 방금 "visible"로 변경된 경우에만 업데이트되기 때문이다.
자세 변경에는 사용자의 명확하고 큰 물리적 행동이 요구됩니다. "큰"이란 자세 값 표에 따라 구현자 정의 임계값을 넘어야 하며, "명확하다"는 것은 OS가 자세 변화에 맞게 적절히 반응하고 사용자의 기대에 부합하는 결과가 나타나야 한다는 뜻입니다.
Window의
너비와
높이로 확장하는 것이다.
장치가 접혀 있으면,
요소가 접힘을 가로질러 배치되어 좋지 않은 사용자
경험으로 이어진다. 대안은 해당 요소를 접힘 영역의 위쪽
또는 아래쪽에 표시하는 것이다.
posture만을 위해 설계되어서는 안 된다: 접이식 장치의 개념은
그
다재다능함과 사용자가 적합하다고 생각하는 대로 자세를 변경할 수 있는
능력에 있다. 방향과 유사하게,
사용자에게 다른 요구가 있을 수 있으므로 항상 사용자를 대신해 선택하지 않고,
사용자가 자신의 요구에 더 잘 맞는 UI를 선택할 수 있도록 하는 것이 중요하다.
이상적으로는 UI를 구성 가능하게 만드는 것이 선호된다.
Device Posture API는 테스트 작성자에게 어려움을 제기한다. 인터페이스를 완전히 테스트하려면 물리적 하드웨어 장치가 필요하기 때문이다. 이 문제를 해결하기 위해, 이 문서는 사용자가 보고되는 장치 자세를 제어하고 실제 장치를 시뮬레이션할 수 있도록 하는 [WEBDRIVER2] 확장 명령을 정의한다.
아래의 확장 명령과 8. 알고리즘과의 통합을 지원하기 위해, 최상위 traversable은 다음 내부 슬롯을 가져야 한다:
| 내부 슬롯 | 설명 |
|---|---|
| [[PostureOverride]] |
하드웨어가 제공하는 현재 자세를 재정의합니다.
가능한 값:
|
| HTTP 메서드 | URI 템플릿 |
|---|---|
| POST | /session/{session id}/deviceposture |
이 확장 명령은
장치 자세를 특정
DevicePostureType으로
변경한다.
| 매개변수 이름 | 값 유형 | 필수 여부 |
|---|---|---|
| posture | 문자열 | 예 |
원격 엔드 단계는 다음과 같다:
continuous"도 아니고
"folded"도 아니면, 오류를 WebDriver 오류 코드 유효하지 않은
인자와 함께 반환한다.
null 데이터를 포함하여 성공을
반환한다.
| HTTP 메서드 | URI 템플릿 |
|---|---|
| DELETE | /session/{session id}/deviceposture |
이 확장 명령은 장치 자세 재정의를 제거하고 장치 자세 제어를 하드웨어로 되돌린다.
원격 엔드 단계는 다음과 같다:
null이면, 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"
};
이 섹션은 규범적이지 않습니다.
창립 편집자로서 명세에 큰 기여를 하고, 이 명세와 Devices and Sensors Working Group 모두에 대한 시각적 정체성을 만들어 준 Diego González에게 감사드린다.
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: