자력계

W3C 작업 초안,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-magnetometer-20260514/
최신 발행 버전:
https://www.w3.org/TR/magnetometer/
편집자 초안:
https://w3c.github.io/magnetometer/
이전 버전:
이력:
https://www.w3.org/standards/history/magnetometer/
피드백:
public-device-apis@w3.org 에 제목 줄 “[magnetometer] … 메시지 주제 …”를 사용해 보내십시오(아카이브)
자력계 이슈 저장소
편집자:
Anssi Kostiainen (Intel Corporation)
Rijubrata Bhaumik (Intel Corporation)
테스트 스위트:
GitHub의 web-platform-tests

초록

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

이 문서의 상태

이 절은 이 문서가 발행된 시점의 상태를 설명한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 기술 보고서 색인에서 확인할 수 있다.

이 문서는 Devices and Sensors Working GroupRecommendation track을 사용하여 작업 초안으로 발행하였다. 이 문서는 W3C 권고안이 되는 것을 목적으로 한다.

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

작업 초안으로 발행되었다고 해서 W3C 및 그 회원들이 이를 승인했다는 의미는 아니다. 이는 초안 문서이며 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹이 작성하였다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지한다. 그 페이지에는 특허를 공개하기 위한 지침도 포함되어 있다. 본인이 Essential Claim(s)을 포함한다고 믿는 특허에 대해 실제 지식이 있는 개인은 W3C 특허 정책 제6절에 따라 그 정보를 공개해야 한다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받는다.

여러 브라우저 엔진이 이 명세에 대해 우려를 표명하였다. 이 명세는 어떤 브라우저 엔진에서도 기본적으로 사용할 수 없다. 현재 형태로는 W3C 권고안으로 진행될 것으로 예상되지 않는다.

이 명세는 개발자 피드백과 가치가 높은 사용 사례를 찾고 있다. 피드백은 GitHub를 통해 제공하기 바란다.

이 문서는 언제든지 유지관리되고 갱신된다. 이 문서의 일부는 진행 중인 작업이다.

1. 소개

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

이 명세는 두 개의 새 인터페이스를 정의한다:

자기장은 전류, 자기 물질 또는 행성의 자전과 지구 핵의 용융 철 운동이 결합되어 생기는 지구의 자기력에 의해 생성되는 자기 효과로 인해 자력계 센서에 자기력을 가하는 장이다.

Hard iron 왜곡은 자화된 철과 같이 자기장을 만들어 내는 물체에 의해 생성된다.

Soft iron 왜곡자기장을 늘리거나 왜곡하며, 니켈 및 철과 같은 금속에 의해 발생한다.

보정된 자기장자기장hard iron 왜곡soft iron 왜곡 보정을 적용한 것이다.

보정되지 않은 자기장자기장hard iron 왜곡 보정은 적용하지 않고 soft iron 왜곡 보정은 적용한 것이며, 따라서 자력계 주변에서 움직이는 자화된 물체로 인해 생기는 자기장의 변화를 보고한다.

2. 예제

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

sensor.onreading = () => {
    console.log("X축 방향의 자기장 " + sensor.x);
    console.log("Y축 방향의 자기장 " + sensor.y);
    console.log("Z축 방향의 자기장 " + sensor.z);
};

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

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

Magnetometer는 자기장에 관한 정보를 제공하며, 이론적으로는 사용자의 위치를 노출할 수 있다. 예를 들어 공격 벡터는 특정 위치의 사전 자화된 표면이 될 수도 있고, 건물로 인해 생긴 일정한 자기장 교란과 위치 사이의 매핑이 될 수도 있다. 지구 자기장의 세기가 균일하지 않기 때문에, 또 다른 공격 벡터는 사용자의 위치를 노출하거나 검증하는 것이 될 수 있다. 예를 들어 최종 사용자가 VPN을 통해 연결되어 있다면, 지리적 IP 정보와 관련된 자기장을 실제 위치의 자력계 판독값과 비교하여 사용자가 VPN을 사용 중인지 여부를 알 수 있다. 구현자는 자기장 세기와 CPU 실행 같은 다른 측면 사이의 상관관계를 통한 사이드 채널 누출의 잠재적 위험을 인식해야 한다. 특정 상황에서는 이러한 누출이 다른 탭에서 사용된 애플리케이션이나 방문한 웹사이트에 관한 정보를 잠재적으로 누출할 수 있다. [MAGSPY]

보정되지 않은 자력계 판독값은 보석과 같은 주변의 자화된 물체에 영향을 받을 수 있으며, 그로 인해 키 입력 모니터링에 사용될 수 있는 정보가 노출될 수 있다.

이러한 특정 위협을 완화하기 위해 사용자 에이전트는 다음 완화 전략 중 하나 또는 둘 모두를 사용해야 한다:

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

4. 권한 정책 통합

이 명세는 정책 제어 기능을 사용하며, 이 기능은 [DEVICE-ORIENTATION]에 정의된 문자열 "magnetometer"로 식별된다.

5. 모델

Magnetometer 센서 타입은 다음 관련 데이터를 가진다:

확장 센서 인터페이스

Magnetometer

센서 권한 이름

"magnetometer"

센서 기능 이름

"magnetometer"

권한 취소 알고리즘

"magnetometer"와 함께 일반 센서 권한 취소 알고리즘을 호출한다.

가상 센서 타입

"magnetometer"

latest reading은, 센서 타입MagnetometerSensor에 대해 다음을 포함해야 한다:

Uncalibrated Magnetometer 센서 타입은 다음 관련 데이터를 가진다:

확장 센서 인터페이스

UncalibratedMagnetometer

센서 권한 이름

"magnetometer"

센서 기능 이름

"magnetometer"

권한 취소 알고리즘

"magnetometer"와 함께 일반 센서 권한 취소 알고리즘을 호출한다.

가상 센서 타입

"uncalibrated-magnetometer"

latest reading은, 센서 타입Uncalibrated MagnetometerSensor에 대해 다음을 포함해야 한다:

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

자력계 좌표계.

5.1. 참조 프레임

로컬 좌표계MagnetometerUncalibratedMagnetometer reading의 참조 프레임을 나타낸다. 이는 장치 좌표계 또는 화면 좌표계 중 하나일 수 있다.

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축 주위의 자기장을 나타낸다. 다시 말해 이 속성은 this와 "x"를 인수로 하여 get value from latest reading을 호출한 결과를 반환한다.

6.1.2. Magnetometer.y

y 속성은 Magnetometer 인터페이스에서 Y축 주위의 자기장을 나타낸다. 다시 말해 이 속성은 this와 "y"를 인수로 하여 get value from latest reading을 호출한 결과를 반환한다.

6.1.3. Magnetometer.z

z 속성은 Magnetometer 인터페이스에서 Z축 주위의 자기장을 나타낸다. 다시 말해 이 속성은 this와 "z"를 인수로 하여 get value from latest reading을 호출한 결과를 반환한다.

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축 주위의 보정되지 않은 자기장을 나타낸다. 다시 말해 이 속성은 this와 "x"를 인수로 하여 get value from latest reading을 호출한 결과를 반환한다.

6.2.2. UncalibratedMagnetometer.y

y 속성은 UncalibratedMagnetometer 인터페이스에서 Y축 주위의 보정되지 않은 자기장을 나타낸다. 다시 말해 이 속성은 this와 "y"를 인수로 하여 get value from latest reading을 호출한 결과를 반환한다.

6.2.3. UncalibratedMagnetometer.z

z 속성은 UncalibratedMagnetometer 인터페이스에서 Z축 주위의 보정되지 않은 자기장을 나타낸다. 다시 말해 이 속성은 this와 "z"를 인수로 하여 get value from latest reading을 호출한 결과를 반환한다.

6.2.4. UncalibratedMagnetometer.xBias

xBias 속성은 UncalibratedMagnetometer 인터페이스에서 X축 주위의 hard iron 왜곡 보정을 나타낸다. 다시 말해 이 속성은 this와 "xBias"를 인수로 하여 get value from latest reading을 호출한 결과를 반환한다.

6.2.5. UncalibratedMagnetometer.yBias

yBias 속성은 UncalibratedMagnetometer 인터페이스에서 Y축 주위의 hard iron 왜곡 보정을 나타낸다. 다시 말해 이 속성은 this와 "yBias"를 인수로 하여 get value from latest reading을 호출한 결과를 반환한다.

6.2.6. UncalibratedMagnetometer.zBias

zBias 속성은 UncalibratedMagnetometer 인터페이스에서 Z축 주위의 hard iron 왜곡 보정을 나타낸다. 다시 말해 이 속성은 this와 "zBias"를 인수로 하여 get value from latest reading을 호출한 결과를 반환한다.

7. 추상 연산

7.1. 자력계 객체 구성

입력

object, Magnetometer 또는 UncalibratedMagnetometer 객체

options, MagnetometerSensorOptions 객체.

  1. allowedobject센서 타입으로 check sensor policy-controlled features를 호출한 결과로 둔다.

  2. allowed가 false라면:

    1. SecurityError DOMExceptionthrow한다.

  3. objectoptions를 사용하여 initialize a sensor object를 호출한다.

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

    1. object로컬 좌표계화면 좌표계로 설정한다.

  5. 그렇지 않으면 object로컬 좌표계장치 좌표계로 정의한다.

8. 자동화

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

8.1. Magnetometer 자동화

타입별 가상 센서 메타데이터 map은 다음 entry를 가져야 한다:

key

"magnetometer"

value

가상 센서 메타데이터로서, 그 reading 파싱 알고리즘parse XYZ reading이다.

8.2. Uncalibrated Magnetometer 자동화

타입별 가상 센서 메타데이터 map은 다음 entry를 가져야 한다:

key

"uncalibrated-magnetometer"

value

가상 센서 메타데이터로서, 그 reading 파싱 알고리즘uncalibrated magnetometer reading 파싱 알고리즘이다.

8.2.1. Uncalibrated Magnetometer reading 파싱 알고리즘

입력

parameters, JSON Object

출력

sensor reading 또는 undefined

  1. readingparametersparse XYZ reading을 수행한 결과로 둔다.

  2. readingundefined라면.

    1. undefined를 반환한다.

  3. keys를 « "xBias", "yBias", "zBias" » list로 둔다.

  4. keys의 각 key에 대해 for each를 수행한다

    1. valueparameterskey를 사용하여 parse single-value number reading을 호출한 결과로 둔다.

      1. valueundefined라면.

        1. undefined를 반환한다.

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

  5. reading을 반환한다.

9. Magnetometer 센서의 한계

이 절은 비규범적이다.

지구 자기장의 방향과 크기는 위치, 특히 위도에 따라 변한다. 예를 들어 크기는 적도 부근에서 가장 낮고 극지방 부근에서 가장 높다. 센서 주변에 영구 자석(예: 휴대폰 스피커의 자석)이 존재한다는 의미의 일부 hard-iron 간섭도 판독값의 정확도에 영향을 준다. 전자 제품, 노트북, 배터리 등의 존재 역시 soft iron 간섭에 기여한다. 휴대전화의 비행기 모드 옵션은 전자기 간섭을 줄이는 데 도움이 될 수 있다.

위와 같은 자기장의 공간적 변화 외에도, 태양풍이나 자기 폭풍과 같은 시간 기반 변화도 지구의 자기권 또는 외부 자기장을 왜곡한다.

10. 사용 사례 및 요구사항

이 절은 비규범적이다.

자력계는 다양한 사용 사례에 사용할 수 있다. 예를 들면 다음과 같다:

데이터 거칠기와 샘플링 주파수에 관한 요구사항은 해당 사용 사례에 따라 달라질 수 있다. 예를 들어 금속 탐지 또는 자기 버튼을 사용한 입력은 제스처 인식, 실내 내비게이션, 또는 VR 및 AR 사용 사례에 비해 더 거친 데이터와 더 낮은 샘플링 주파수로 구현할 수 있을 가능성이 높다. 센서 융합 사용 사례에서 최적 결과를 산출하는 샘플링 주파수는 예를 들어 센서 융합 알고리즘과 관련된 다른 모션 센서의 특성에 따라 달라진다.

11. Magnetometer를 사용한 나침반 방위

이 절은 비규범적이다.

나침반은 지구의 자극에 맞춰 정렬되는 도구로, 수 세기 동안 항해에 사용되어 왔다. 지구의 자전축은 우리가 지도 기준에 사용하는 지리적 북극과 남극을 정의한다. 지리적 극과 자기 극 사이에는 약 11.5도(약 1000마일)의 차이가 있다. 이러한 상황을 보정하기 위해 자기 방향에 편각을 적용한다.

장치가 항상 지표면에 대해 수평이라면, 지구 자기장의 xy 성분만 사용하여 나침반 방위를 결정할 수 있다. 즉, 지표면과 평면을 이루는 방향을 사용하는 것이다. 지리적 북쪽(또는 진북) 방위를 결정하려면 적절한 편각을 더한다.

자기 편각 또는 편각은 수평면에서 자북과 진북 사이의 각도이며, 지표면의 위치에 따라 달라지고 시간이 지남에 따라 변한다. 관례상 편각은 자북이 진북의 동쪽에 있을 때 양수이고, 서쪽에 있을 때 음수이다. 자기 편각의 실시간 값은 예를 들어 National Oceanic and Atmospheric Administration(NOAA)이 제공하는 자기 편각 계산기를 사용하여 얻을 수 있다.

자북은 다음과 같이 계산한다:

let sensor = new Magnetometer();
sensor.start();
let heading = Math.atan2(sensor.y, sensor.x) * (180 / Math.PI);
console.log('방위(도): ' + 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('진방위(도): ' + (heading + declination));
});

참고: 장치가 지표면에 대해 수평이 아니라면, 개발자는 다양한 기울기 보정 기법을 적용해야 하며, 이를 위해 3축 가속도계가 필요하다. 이 특정 사용 사례를 구현하려면 가속도계와 자력계 센서의 융합인 orientation sensor의 데이터가 필요하다.

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]

적합한 사용자 에이전트는 사용자 에이전트에 적용 가능한 이 명세의 모든 요구사항을 구현해야 한다.

이 명세의 IDL 조각은 Web IDL 명세에 설명된 대로 적합한 IDL 조각에 요구되는 방식으로 해석해야 한다. [WEBIDL]

색인

이 명세에서 정의하는 용어

참조에 의해 정의되는 용어

참고문헌

규범적 참고문헌

[ACCELEROMETER]
Anssi Kostiainen. Accelerometer. 2025년 2월 12일. 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. 2026년 1월 21일. 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. 2025년 10월 6일. WD. URL: https://www.w3.org/TR/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. 2025년 10월 6일. 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. Magnetic input for 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;
};