자력계

W3C 워킹 드래프트,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2025/WD-magnetometer-20250212/
최신 공개 버전:
https://www.w3.org/TR/magnetometer/
Editor's Draft:
https://w3c.github.io/magnetometer/
이전 버전:
히스토리:
https://www.w3.org/standards/history/magnetometer/
피드백:
public-device-apis@w3.org 제목 줄에 “[magnetometer] … 메시지 주제 …” 포함 (아카이브)
Magnetometer 이슈 저장소
편집자:
Anssi Kostiainen (Intel Corporation)
Rijubrata Bhaumik (Intel Corporation)
테스트 스위트:
web-platform-tests on GitHub

개요

이 명세서는 X, Y, Z 축의 자기장을 측정하는 구체적인 센서 인터페이스를 정의합니다.

이 문서의 상태

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

본 문서는 기기 및 센서 워킹 그룹에서 추천 경로(Recommendation track)로 발행한 워킹 드래프트입니다. 본 문서는 W3C 권고가 될 예정입니다.

문서 관련 의견이 있으시면 public-device-apis@w3.org (구독, 아카이브) 으로 보내주시기 바랍니다. 이메일 제목에 “magnetometer”라는 단어를 포함해주세요, 예시: “[magnetometer] …의견 요약…”. 모든 의견을 환영합니다.

워킹 드래프트로서의 발행이 W3C 및 회원들의 지지를 의미하는 것은 아닙니다. 이 문서는 초안이며 언제든 업데이트, 대체, 폐기될 수 있습니다. 진행 중인 작업 외에는 인용하기에 부적합합니다.

본 문서는 W3C 특허 정책 하에 운영되는 그룹에 의해 제작되었습니다. W3C는 본 그룹 산출물과 관련된 공개 특허 목록을 유지하고 있습니다. 해당 페이지에는 특허 공개 방법 안내도 포함되어 있습니다. 누군가가 핵심 청구(Essential Claim(s))를 포함한 특허를 알고 있다면, W3C 특허 정책 6항에 따라 정보를 공개해야 합니다.

본 문서는 2023년 11월 3일 W3C 프로세스 문서를 따릅니다.

이 명세서는 개발자 피드백 및 높은 활용도가 예상되는 사용 사례를 찾고 있습니다. 의견은 GitHub를 통해 남겨주세요.

본 문서는 수시로 유지·갱신됩니다. 일부 내용은 진행 중인 작업입니다.

1. 소개

자력계는 Generic Sensor API [GENERIC-SENSOR]를 확장하여, 장치의 기본 자력계 센서가 감지하는 자기장 정보를 제공합니다. 자력계 센서는 세 개의 물리 축(x, y, z)에서 자기장을 μT(마이크로 테슬라) 단위로 측정합니다.

이 명세서에서는 두 가지 신규 인터페이스를 정의합니다:

자기장은 전류, 자성 물질, 또는 지구의 자전과 내부 용융 철의 움직임 등으로 인해 발생하는 자기적 영향에 의해 자력계 센서에 자기력을 가하는 필드입니다.

하드 아이언 왜곡은 자화된 철 등 자기장을 생성하는 물체에 의해 발생합니다.

소프트 아이언 왜곡은 니켈, 철 같은 금속에 의해 자기장이 연장되거나 왜곡되는 현상입니다.

보정된 자기장자기장하드 아이언 왜곡소프트 아이언 왜곡 보정이 적용된 값입니다.

비보정 자기장자기장하드 아이언 왜곡은 보정하지 않고, 소프트 아이언 왜곡은 보정한 값으로, 자력계 근처에 자화된 물체가 이동할 때 발생하는 자기장의 변화를 보고합니다.

2. 예시

let sensor = new Magnetometer();
sensor.start();

sensor.onreading = () => {
    console.log("Magnetic field along the X-axis " + sensor.x);
    console.log("Magnetic field along the Y-axis " + sensor.y);
    console.log("Magnetic field along the Z-axis " + sensor.z);
};

sensor.onerror = event => console.log(event.error.name, event.error.message);

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

자력계는 자기장 정보를 제공하고, 이론적으로는 사용자의 위치가 노출될 수 있습니다. 예를 들어, 특정 장소의 자화된 표면이나, 건물에서 발생하는 지속적인 자기장 변화와 위치 간의 매핑이 공격 벡터가 될 수 있습니다. 지구 자기장의 세기가 지역마다 다르기 때문에, 또 다른 공격 방식은 사용자의 위치 노출이나 검증일 수 있습니다. 예를 들어, 최종 사용자가 VPN을 통해 연결된 경우, 지리적 IP 정보에 해당하는 자기장과 실제 위치에서 측정한 자기장 값을 비교해, 사용자가 VPN을 사용 중인지 확인할 수도 있습니다. 또한 자기장 세기와 CPU 실행 등 다른 요소와의 상관관계를 통한 부채널(side-channel) 유출 위험도 있으니, 구현자는 특정 경우 애플리케이션 정보, 다른 탭 방문 웹사이트 정보 등이 유출될 수 있음을 인지해야 합니다. [MAGSPY]

비보정 자력계 측정값은 주변의 자화된 물체(예: 악세서리)에 영향을 받을 수 있으므로, 키 입력 감시 등으로 활용될 수 있습니다.

이러한 위협에 대응하기 위해, 사용자 에이전트는 다음 대응 전략 중 하나 이상을 사용해야 합니다:

이러한 대응책은 Generic Sensor API 일반적 대응 [GENERIC-SENSOR]을 보완합니다.

4. 권한 정책 연동

이 명세서는 정책 제어 기능을 사용하며, [DEVICE-ORIENTATION]에 "magnetometer"로 정의되어 있습니다.

5. 모델

자력계 센서 유형은 다음의 데이터를 가집니다:

확장 센서 인터페이스

Magnetometer

센서 권한 이름

"magnetometer"

센서 기능 이름

"magnetometer"

권한 해제 알고리즘

일반 센서 권한 해제 알고리즘을 "magnetometer"로 호출함.

가상 센서 유형

"magnetometer"

최신 측정값 (Sensor) 의 센서 유형자력계일 경우:

비보정 자력계 센서 유형은 다음의 데이터를 가집니다:

확장 센서 인터페이스

UncalibratedMagnetometer

센서 권한 이름

"magnetometer"

센서 기능 이름

"magnetometer"

권한 해제 알고리즘

일반 센서 권한 해제 알고리즘을 "magnetometer"로 호출함.

가상 센서 유형

"uncalibrated-magnetometer"

최신 측정값 (Sensor) 의 센서 유형비보정 자력계일 경우:

자기장 값의 부호는 로컬 좌표계에서 오른손 법칙을 따라야 합니다(아래 그림 참조).

Magnetometer coordinate system.

5.1. 참고 기준

로컬 좌표계MagnetometerUncalibratedMagnetometer 측정값의 기준 프레임입니다. 이는 장치 좌표계 또는 스크린 좌표계일 수 있습니다.

6. API

6.1. Magnetometer 인터페이스

[SecureContext,
  Exposed=Window]
interface Magnetometer : Sensor {
  constructor(optional MagnetometerSensorOptions sensorOptions = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
};

enum MagnetometerLocalCoordinateSystem { "device", "screen" };

dictionary MagnetometerSensorOptions : SensorOptions {
  MagnetometerLocalCoordinateSystem referenceFrame = "device";
};
new Magnetometer(sensorOptions) 생성자 단계는 자력계 객체 생성 추상 연산을 thissensorOptions와 함께 호출하는 것이다.

Magnetometer에서 지원하는 옵션은 "frequency" 와 "referenceFrame"입니다.

6.1.1. Magnetometer.x

x 속성은 Magnetometer 인터페이스에서 X축 방향의 자기장을 나타냅니다. 즉, 이 속성은 get value from latest readingthis와 "x" 인수로 호출한 결과를 반환합니다.

6.1.2. Magnetometer.y

y 속성은 Magnetometer 인터페이스에서 Y축 방향의 자기장을 나타냅니다. 즉, 이 속성은 get value from latest readingthis와 "y" 인수로 호출한 결과를 반환합니다.

6.1.3. Magnetometer.z

z 속성은 Magnetometer 인터페이스에서 Z축 방향의 자기장을 나타냅니다. 즉, 이 속성은 get value from latest readingthis와 "z" 인수로 호출한 결과를 반환합니다.

6.2. UncalibratedMagnetometer 인터페이스

[SecureContext,
  Exposed=Window]
interface UncalibratedMagnetometer : Sensor {
  constructor(optional MagnetometerSensorOptions sensorOptions = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
  readonly attribute double? xBias;
  readonly attribute double? yBias;
  readonly attribute double? zBias;
};
new UncalibratedMagnetometer(sensorOptions) 생성자 단계는 자력계 객체 생성 추상 연산을 thissensorOptions와 함께 호출하는 것이다.

UncalibratedMagnetometer에서 지원하는 옵션은 "frequency" 와 "referenceFrame"입니다.

6.2.1. UncalibratedMagnetometer.x

x 속성은 UncalibratedMagnetometer 인터페이스에서 X축 방향의 비보정 자기장을 나타냅니다. 즉, 이 속성은 get value from latest readingthis와 "x" 인수로 호출한 결과를 반환합니다.

6.2.2. UncalibratedMagnetometer.y

y 속성은 UncalibratedMagnetometer 인터페이스에서 Y축 방향의 비보정 자기장을 나타냅니다. 즉, 이 속성은 get value from latest readingthis와 "y" 인수로 호출한 결과를 반환합니다.

6.2.3. UncalibratedMagnetometer.z

z 속성은 UncalibratedMagnetometer 인터페이스에서 Z축 방향의 비보정 자기장을 나타냅니다. 즉, 이 속성은 get value from latest readingthis와 "z" 인수로 호출한 결과를 반환합니다.

6.2.4. UncalibratedMagnetometer.xBias

xBias 속성은 UncalibratedMagnetometer 인터페이스에서 X축 방향의 하드 아이언 왜곡 보정값을 나타냅니다. 즉, 이 속성은 get value from latest readingthis와 "xBias" 인수로 호출한 결과를 반환합니다.

6.2.5. UncalibratedMagnetometer.yBias

yBias 속성은 UncalibratedMagnetometer 인터페이스에서 Y축 방향의 하드 아이언 왜곡 보정값을 나타냅니다. 즉, 이 속성은 get value from latest readingthis와 "yBias" 인수로 호출한 결과를 반환합니다.

6.2.6. UncalibratedMagnetometer.zBias

zBias 속성은 UncalibratedMagnetometer 인터페이스에서 Z축 방향의 하드 아이언 왜곡 보정값을 나타냅니다. 즉, 이 속성은 get value from latest readingthis와 "zBias" 인수로 호출한 결과를 반환합니다.

7. 추상 연산

7.1. 자력계 객체 생성

input

object, Magnetometer 또는 UncalibratedMagnetometer 객체

options, MagnetometerSensorOptions 객체입니다.

  1. allowed정책 제어 기능 확인object센서 유형으로 호출한 결과로 둔다.

  2. allowed가 false이면:

    1. throw SecurityError DOMException을 발생.

  3. 센서 객체 초기화objectoptions로 호출.

  4. options.referenceFrame 이 "screen"이면:

    1. object로컬 좌표계스크린 좌표계로 설정한다.

  5. 그 외에는 object로컬 좌표계장치 좌표계로 정의한다.

8. 자동화

이 절에서는 Generic Sensor API § 9 Automation을 확장하여 Magnetometer에 특화된 가상 센서 메타데이터를 제공합니다.

8.1. 자력계 자동화

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

key

"magnetometer"

value

가상 센서 메타데이터로, reading parsing algorithmparse XYZ reading이어야 합니다.

8.2. Uncalibrated Magnetometer 자동화

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

key

"uncalibrated-magnetometer"

value

가상 센서 메타데이터로, reading parsing algorithmuncalibrated magnetometer reading parsing algorithm이어야 합니다.

8.2.1. Uncalibrated Magnetometer 읽기 파싱 알고리즘

input

parameters, JSON Object

output

센서 측정값 또는 undefined

  1. readingparse XYZ readingparameters를 인자로 호출한 결과로 둔다.

  2. readingundefined이면,

    1. undefined를 반환한다.

  3. keys에 « "xBias", "yBias", "zBias" » 값을 리스트로 담는다.

  4. key에 대하여 반복

    1. valueparse single-value number readingparameters, key 인자로 호출한 결과로 둔다.

      1. valueundefined이면,

        1. undefined를 반환한다.

    2. reading[key]를 value[key]로 설정한다.

  5. reading을 반환한다.

9. 자력계 센서의 제한사항

이 절은 비규범적입니다.

지구장의 방향과 세기는 특히 위도에 따라 위치에 따라 변합니다. 예를 들어, 적도 근처가 세기가 가장 약하고 극지방이 가장 강합니다. 하드 아이언 간섭(예: 센서 근처의 영구 자석, 예를 들면 휴대폰 스피커의 자석)도 측정 정확도에 영향을 미칩니다. 전자기기, 노트북, 배터리 등이 있으면 소프트 아이언 간섭에 영향을 줄 수 있습니다. 휴대전화의 비행기 탑승 모드(Flight Mode) 옵션은 전자기 간섭을 줄이는 데 도움이 될 수 있습니다.

위와 같은 공간적 변동 외에도, 자기장은 시간에 따른 변동(예: 태양풍, 자기 폭풍)으로 인해, 지구 외부의 자기장이 왜곡될 수 있습니다.

10. 사용 사례 및 요구사항

이 절은 비규범적입니다.

자력계는 다음과 같은 다양한 사용 사례에 활용될 수 있습니다:

데이터 정밀도(coarseness)와 샘플링 빈도 요구사항은 사용 사례에 따라 달라질 수 있습니다. 예를 들어, 금속 탐지나 자석 버튼 입력 등은 제스처 인식, 실내 네비게이션, VR/AR 등과 비교해 상대적으로 낮은 빈도와 정밀도로도 구현이 가능할 수 있습니다. 센서 융합 활용에서는 최적의 샘플링 빈도 역시 알고리즘 또는 타 센서 특성에 따라 달라질 수 있습니다.

11. 자력계를 활용한 나침반 방향

이 절은 비규범적입니다.

자기 북극에 정렬되는 나침반은 수세기 동안 위치 탐색에 활용되었습니다. 지구의 자전축은 지도 기준의 북극·남극(지리적 극)을 정의하며, 실제 자북극은 지리 극과 약 11.5도(약 1000마일) 차이가 있습니다. 편각(declination angle)을 보정하여 실제 북극 방향을 계산합니다.

기기가 항상 지표면에 수평인 경우, 지구 자기장의 X, Y축(x, y만으로 방위를 계산할 수 있습니다. 지정위치(진북)로 방향을 측정하려면 해당 위치의 편각을 더하면 됩니다.

편각(magnetic declination) 또는 편각각(declination angle)은 자북과 실제북 사이의 수평면 각도로, 위치와 시간에 따라 달라집니다. 보통 자북이 진북 기준 동쪽이면 양수, 서쪽이면 음수로 나타냅니다. NOAA(미국해양대기청)에서 제공하는 자기 편각 계산기 등으로 실시간 값을 얻을 수 있습니다.

자북 계산식 예:

let sensor = new Magnetometer();
sensor.start();
let heading = Math.atan2(sensor.y, sensor.x) * (180 / Math.PI);
console.log('Heading in degrees: ' + heading);

위도·경도 기준의 진북 계산식 예:

// 위도 경도 값 취득(생략)
let latitude = 0, longitude = 0;

// 해당 위경도의 자기 편각 취득
fetch('https://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination' +
      '?lat1=' + latitude + '&lon1=' + longitude + '&resultFormat=csv')
  .then(response => response.text()).then(text => {
    let declination = parseFloat(text.replace(/^#.*$/gm, '').trim().split(',')[4]);

    // 편각 보정 적용
    console.log('True heading in degrees: ' + (heading + declination));
});

참고: 기기가 수평이 아닌 경우, 개발자는 틸트(기울기) 보정 기술을 적용해야 하며, 이를 위해 3축 가속도계가 필요합니다. 가속도계와 자력계 융합을 통한 방향 센서 데이터가 이 경우 필수적으로 활용됩니다.

12. 감사의 글

Generic Sensor API에 기여한 Tobie Langel에게 감사드립니다.

13. 적합성

적합성 요구사항은 설명적 진술과 RFC 2119 용어의 조합으로 표현됩니다. 규범 부분에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" 및 "OPTIONAL"은 RFC 2119에 따라 해석해야 합니다. 그러나 가독성을 위해 이 명세에서는 모두 대문자로 표기하지 않습니다.

명시적으로 비규범, 예시, 참고사항 등으로 표시된 부분을 제외하고, 모든 텍스트는 규범적입니다. [RFC2119]

적합한 user agent는 해당하는 모든 규정(요구 사항)을 준수해야 합니다.

이 명세의 IDL 조각은 Web IDL 명세에서 요구하는 바와 같이 해석해야 합니다. [WEBIDL]

색인

이 명세서에서 정의된 용어

참조 용어

참고 문헌

규범적 참고문헌

[ACCELEROMETER]
Anssi Kostiainen. Accelerometer. 2024년 10월 9일. CRD. URL: https://www.w3.org/TR/accelerometer/
[DEVICE-ORIENTATION]
Reilly Grant; Marcos Caceres. Device Orientation and Motion. 2025년 2월 12일. CRD. URL: https://www.w3.org/TR/orientation-event/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[GENERIC-SENSOR]
Rick Waldron. Generic Sensor API. 2024년 2월 22일. CRD. URL: https://www.w3.org/TR/generic-sensor/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. 2024년 12월 20일. WD. URL: https://www.w3.org/TR/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. 2025년 2월 10일. WD. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. 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/

비규범적 참고문헌

[MAGINDOORPOS]
Janne Haverinen, Anssi Kemppainen. Global indoor self-localization based on the ambient magnetic field. Informational. URL: https://doi.org/10.1016%2Fj.robot.2009.07.018
[MAGITACT]
Hamed Ketabdar, Kamer Ali Yüksel, Mehran Roshandel. Magitact. Informational. URL: https://dl.acm.org/doi/10.1145/1719970.1720048
[MAGSPY]
Nikolay Matyunin, Yujue Wang, Tolga Arul, Kristian Kullmann, Jakub Szefer, Stefan Katzenbeisser. MagneticSpy: Exploiting Magnetometer in Mobile Devices for Website and Application Fingerprinting. Informational. URL: https://dl.acm.org/doi/abs/10.1145/3338498.3358650
[MOTION-SENSORS]
Kenneth Christiansen; Alexander Shalamov. Motion Sensors Explainer. 2017년 8월 30일. NOTE. URL: https://www.w3.org/TR/motion-sensors/
[VRBUTTON]
Boris Smus. Google Cardboard용 자기 입력. Informational. URL: https://bugs.chromium.org/p/chromium/issues/detail?id=445926

IDL 인덱스

[SecureContext,
  Exposed=Window]
interface Magnetometer : Sensor {
  constructor(optional MagnetometerSensorOptions sensorOptions = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
};

enum MagnetometerLocalCoordinateSystem { "device", "screen" };

dictionary MagnetometerSensorOptions : SensorOptions {
  MagnetometerLocalCoordinateSystem referenceFrame = "device";
};

[SecureContext,
  Exposed=Window]
interface UncalibratedMagnetometer : Sensor {
  constructor(optional MagnetometerSensorOptions sensorOptions = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
  readonly attribute double? xBias;
  readonly attribute double? yBias;
  readonly attribute double? zBias;
};