タッチフィンガープリンティングは、navigator.maxTouchPoints と タッチイベントAPIを読み取り、スマートフォン、タブレット、タッチ対応ラップトップ、 または従来のデスクトップを静かに、クッキーなしで、 JavaScriptの1行で判別するブラウザトラッキング技術です。 自分のデバイスが何を公開しているか、今すぐ whatsmy.fyi で確認できます。
TL;DR
タッチフィンガープリンティングは navigator.maxTouchPoints、TouchEvent コンストラクター、pointer CSSメディアクエリを 使用してデバイスタイプを分類します。タッチスクリーンのないデスクトップはmaxTouchPoints = 0 を返し、iPhoneは 5、 Surface Proは 10 を返します。画面寸法とピクセル比と組み合わせると、 このシグナルはモバイルとデスクトップのトラフィックを確実に分離し、 完全なブラウザフィンガープリントに測定可能なエントロピーを提供します。
タッチフィンガープリンティングとは?
タッチフィンガープリンティングは、デバイスのタッチハードウェアを ターゲットにした ブラウザフィンガープリンティング のサブセットです。すべてのブラウザは、デバイスにタッチスクリーンがあるかどうか、 あるとすれば同時にサポートするタッチポイントの数を説明するJavaScript APIを 公開しています。これらのAPIはアダプティブなインターフェースを構築するために 設計されましたが、同意、ストレージ、ユーザーインタラクションを必要としない デバイスタイプ分類シグナルとしても機能します。
主に関係するプロパティは navigator.maxTouchPoints で、W3C Pointer Events仕様で導入された読み取り専用の整数です。 デバイスが同時に追跡できる最大タッチ接触点数を返します。 0はタッチスクリーンなしを意味します。5または10はスマートフォンまたは タブレットを示します。タッチ対応ラップトップと2-in-1コンバーチブルは 通常10を返します。この値は物理的なハードウェアを反映しているため、 セッション全体で安定しており、閲覧データのクリアに耐性があり、 シークレットモードでも同一です。
タッチフィンガープリンティングは単独ではあなたを一意に識別しません — 分類シグナルであり、一意の識別子ではありません。トラッカーにとっての 価値は、より完全なデバイスプロファイルを構築するために画面解像度、 デバイスピクセル比、ユーザーエージェント、バッテリー状態と組み合わせること にあります。 電子フロンティア財団(EFF)のCover Your Tracks プロジェクトは、完全なブラウザフィンガープリントテストで収集されるシグナルの 一つとしてタッチサポートを特定しています。
タッチフィンガープリンティングはどのように機能するのか?
フィンガープリンティングスクリプトは、デバイスタイプの全体像を構築するために 3つの補完的なシグナルを読み取ります。それぞれは1ミリ秒未満で、 ユーザーパーミッションなしに読み取れます。
シグナル1 — navigator.maxTouchPoints
これは最も直接的なシグナルです。 W3C Pointer Events仕様 によると、値はハードウェアの最大値を反映する必要があり、ソフトウェアで 設定したり、閲覧データをクリアしたりして変更することはできません。 10ポイントのマルチタッチデジタイザーを持つデバイスは常に 10 を 返します。このハードウェア結合が、クッキーやストレージをターゲットにした プライバシーツールの影響を受けず、一貫しており、クロスセッションであることから、 フィンガープリンティングに有用なシグナルとなっています。
シグナル2 — TouchEvent コンストラクターチェック
旧式のフィンガープリンティングコードは、グローバルスコープにTouchEvent コンストラクターが存在するかどうかを確認します。 タッチ対応でないデバイスでは、このコンストラクターは存在せず、undefined が生成されます。iOSとAndroidでは存在します。 この方法はPointer Events APIより以前のものであり、現在は信頼性が低くなっています — Chromiumベースのブラウザはタッチ非対応のデスクトップでもコンストラクターを 公開しています — が、多くのレガシーフィンガープリンティングライブラリに 依然として含まれています。
シグナル3 — JavaScriptを通じたCSSポインターメディアクエリ
window.matchMedia からJavaScriptで読み取れる pointer CSSメディア機能は、粗いポインター(タッチスクリーンの指)、 細かいポインター(マウスまたはスタイラス)、ポインターなしを区別します。maxTouchPoints と異なり、このクエリはタッチハードウェアの有無ではなく プライマリ入力デバイスを反映します。そのため、キーボードマウスで使用している Surface Proは maxTouchPoints が 10 であってもfine を返します。両方の値を一緒に読み取ることで、 より完全な入力プロファイルが得られます。
// Touch fingerprinting: reading all three signals
function getTouchFingerprint() {
// Signal 1: maximum simultaneous touch points (hardware constant)
const maxTouchPoints = navigator.maxTouchPoints ?? 0;
// Signal 2: legacy TouchEvent constructor presence check
const hasTouchEvents = 'TouchEvent' in window;
// Signal 3: CSS pointer media query via matchMedia
const pointerType = window.matchMedia('(pointer: coarse)').matches
? 'coarse' // finger / touchscreen
: window.matchMedia('(pointer: fine)').matches
? 'fine' // mouse / stylus
: 'none'; // no pointer device
// Device classification based on combined signals
const isTouch = maxTouchPoints > 0;
const isMobile = isTouch && window.screen.width <= 768;
const isTablet = isTouch && window.screen.width > 768 && window.screen.width <= 1366;
return {
maxTouchPoints, // 0 = desktop, 5 = smartphone, 10 = tablet / 2-in-1
hasTouchEvents,
pointerType,
isTouch,
isMobile,
isTablet,
};
}
// Example outputs:
// MacBook Pro (no touchscreen) → { maxTouchPoints: 0, pointerType: "fine", isTouch: false }
// iPhone 15 Pro → { maxTouchPoints: 5, pointerType: "coarse", isMobile: true }
// Surface Pro 11 → { maxTouchPoints: 10, pointerType: "fine", isTablet: true }
// iPad Air → { maxTouchPoints: 5, pointerType: "coarse", isTablet: true }デバイスタイプ別のmaxTouchPoints値
以下の表は、一般的なデバイスが navigator.maxTouchPoints に対して 返す値と、タッチイベントおよびポインタークエリの結果を示しています。 これらの値はハードウェア定数を反映しており、ブラウザバージョンや オペレーティングシステムのアップデート間で変化しません。
| デバイスタイプ | maxTouchPoints | ポインターメディアクエリ | TouchEvent in window |
|---|---|---|---|
| デスクトップPC / Mac(タッチスクリーンなし) | 0 | fine | false(Gecko) / true(Chromium) |
| iPhone(すべてのモダンモデル) | 5 | coarse | true |
| Androidスマートフォン | 5 または 10 | coarse | true |
| iPad / Androidタブレット | 5 または 10 | coarse | true |
| Microsoft Surface / タッチラップトップ | 10 | fine(マウス使用時) | true(Chromium) |
| Chromebook(タッチなし) | 0 | fine | false |
| Linuxデスクトップ(任意のブラウザ) | 0 | fine | false(Firefox) / true(Chrome) |
TouchEvent in window 列の不一致はプライバシーに関係します: Chromiumベースのブラウザは、ウェブの互換性の前提を壊さないよう、 タッチ非対応のデスクトップを含むすべてのプラットフォームでTouchEvent コンストラクターを公開しています。Firefoxは 実際のタッチデバイスでのみ公開します。この非対称性自体がブラウザエンジン 識別子となっており — 別のシグナルを読み取ろうとした試みから導出された 独立したフィンガープリンティングシグナルです。
実世界でのタッチフィンガープリンティングの利用者
広告ネットワークとアナリティクス
アドテクプラットフォームは、入札価格と広告クリエイティブ選択のために デバイスタイプでオーディエンスをセグメント化するためにmaxTouchPoints を読み取ります。モバイルとタブレットのインベントリは デスクトップとは異なるCPMレートを持ちます。このシグナルはクッキーも ユーザーインタラクションも必要としないため、フィンガープリントベースの オーディエンスプロファイルのデバイスタイプ次元に直接フィードされます。 開発者がレスポンシブメニューを構築できる同じシグナルが、あなたのデバイスを あなたの知らないうちに価格バケットに割り当てるために転用されます。
不正検出とボット対策
Fingerprint.com やDataDomeのようなセキュリティプラットフォームは、タッチシグナルを 整合性チェックとして使用します。ユーザーエージェントでモバイルブラウザと 主張しながら maxTouchPoints = 0 を報告するボットは、 自動化を明らかにする矛盾です。ヘッドレスChrome、Puppeteer、Seleniumは、 ユーザーエージェントがスマートフォンに偽装されていてもタッチ非対応の値を 返すのが一般的です。タッチシグナルの矛盾は、計算コストの高いチェックの前に 実行される軽量なボット検出ヒューリスティックの一つです。
ペイウォールと地理的制限の実施
一部のパブリッシャーはレイアウトだけでなく、従量制アクセスロジックのために モバイルとデスクトップユーザーに異なるコンテンツバージョンを提供します。 クッキーをクリアして再読み込みするユーザーはセッションを失う可能性がありますが、 デバイスの maxTouchPoints 値は変わらず残ります。 画面解像度とタイムゾーンと組み合わせると、タッチデータはクッキーを 削除した再訪問者を再識別するのに役立ちます。
A/Bテストとパーソナライゼーションエンジン
実験プラットフォームは、実験のバリアントをセグメント化するために タッチシグナルから部分的に導出されたデバイスタイプを使用します。 クッキーなしで「モバイルユーザーのみ」でテストを実行するには、 信頼性の高いデバイスタイプシグナルが必要です。maxTouchPoints は、 セッション全体でユーザーエージェント文字列の解析よりも安定した ハードウェアに基づく値を提供します。
タッチフィンガープリンティングはプライバシーリスクですか?
タッチフィンガープリンティングは キャンバスフィンガープリンティング や オーディオフィンガープリンティング より直接的なプライバシーリスクが低いです。なぜなら、一意の識別子ではなく 低エントロピーの分類データを生成するからです。maxTouchPoints の 値 5 はすべてのiPhoneが共有しています。リスクはタッチデータが 他のシグナルと組み合わされたときに顕在化します:画面解像度、 デバイスピクセル比、ハードウェア同時実行数、タイムゾーン、 WebGLレンダラー 情報。複合フィンガープリントでは、タッチデータはあなたのプロファイルを 共有するデバイスの母集団を数億台から数千万台に絞り込み、後続の高エントロピー シグナルが個人識別をより効果的にします。
GDPRの下では、タッチデータのような低エントロピーシグナルを含む デバイスフィンガープリンティングは、結果のプロファイルが個人に リンクできる場合、個人データの処理と見なされます。フランスのCNILと アイルランドのDPCは、同意目的においてフィンガープリンティングを クッキーベースのトラッキングと同等として扱うガイダンスをそれぞれ 発行しています。実際には、タッチシグナルの収集に対する執行は まれです。なぜなら、そのデータはレスポンシブデザインの検出での 正当な用途があるからです。
タッチフィンガープリンティングから自身を保護する方法
保護の選択肢は、受動的な軽減から積極的な偽装まで範囲があります。 最も効果的な防御策は、タッチシグナルを単独で扱うのではなく、 完全なフィンガープリントサーフェスエリアをターゲットにします。
- Braveブラウザ(日常使用に推奨): BraveのFarbling機能は、 セッションごとおよびサイトごとに様々なフィンガープリンティングシグナルを ランダム化します。Braveは現在
maxTouchPointsを直接ランダム化 していませんが、より広範なフィンガープリントのランダム化により 複合フィンガープリントの安定性と有用性が低下します。 ほとんどのユーザーにとって、Braveは保護と使いやすさの最良のバランスです。 - Firefoxと
privacy.resistFingerprinting:このフラグが有効の場合、Firefoxはハードウェアに関係なくmaxTouchPoints = 0を報告し、タッチイベントAPIを抑制します。 これにより、ブラウザは普遍的にタッチ非対応のデスクトップデバイスとして 報告し、タッチフィンガープリンティングを排除しますが、 実際のタッチスクリーンデバイスで使用する場合はタッチ依存のウェブサイトが 壊れる可能性があります。 - Torブラウザ(最強の保護): TorブラウザはFirefoxの
privacy.resistFingerprintingを継承し、タッチデータを含む 完全なフィンガープリントサーフェスを正規化します。すべてのTorブラウザの ユーザーが同一のタッチプロファイルを持つように見えます。代償は Torネットワークのルーティングによる大幅に低速なブラウジングです。 - 一般的なハードウェアのデバイスを使用する:
maxTouchPointsの匿名集合は、まったく同じ値を共有している 他のデバイスの数によって決まります。iPhoneを使用している場合、 何億台もの他のiPhoneと値を共有しています。珍しいハードウェア — 非標準のデジタイザーを持つカスタム2-in-1 — はより希少な値を生成します。 標準的で人気のあるハードウェアは、タッチ関連のエントロピーを削減します。 - VPNはここでは役立ちません: VPNはトラフィックを 異なるIPアドレスを通じてルーティングしますが、ブラウザのAPI応答を 変更しません。
navigator.maxTouchPointsの値は、VPNが アクティブかどうかに関わらず同一です。フィンガープリンティングを含む ネットワーク情報など、完全なブラウザフィンガープリントが何を公開しているか、 whatsmy.fyi で確認してください。
よくある質問
デスクトップでnavigator.maxTouchPointsは何を返しますか?
タッチスクリーンのない標準的なデスクトップまたはラップトップでは、navigator.maxTouchPoints は 0 を返します。 この値はハードウェア定数であり、デバイスにタッチデジタイザーが ないことを反映しています。ブラウザ履歴のクリア、シークレットモードの使用、 ネットワークの切り替えでもこの値は変わりません。
maxTouchPointsはすべてのブラウザで同じように機能しますか?
プロパティ自体はすべてのモダンブラウザで一貫して動作します — ハードウェアから導出された整数を返します。ただし、TouchEvent コンストラクターの可用性は異なります: Chromiumベースのブラウザはウェブの互換性のためにタッチ非対応のデスクトップでも 公開しており、Firefoxは実際のタッチデバイスでのみ公開します。 この違い自体がフィンガープリンティングシグナルとなり、ユーザーエージェント 文字列とは独立してブラウザエンジンを識別できます。
タッチフィンガープリンティングは私を個人的に識別できますか?
単独ではできません。maxTouchPoints はカテゴリシグナルです — ほとんどのデバイスはいくつかの値の一つに分類されます(0、5、または10)。 何百万台ものデバイスが各値を共有しています。タッチフィンガープリンティングは、 画面解像度、デバイスピクセル比、 WebGLレンダラーデータ、 オーディオフィンガープリンティング などの他のシグナルと組み合わされたときにプライバシーリスクになります。 完全な複合フィンガープリントでは、タッチデータは匿名集合を絞り込みますが、 単独では個人識別には不十分です。
シークレットモードはタッチフィンガープリントを隠しますか?
いいえ。シークレットとプライベートブラウジングモードは、 ブラウザが閲覧履歴、クッキー、フォームデータをディスクに保存するのを防ぎます。 ハードウェアに面するAPIが返す値は変更しません。navigator.maxTouchPoints 値、画面寸法、ポインタータイプは シークレットウィンドウと通常のブラウジングセッションで同一です。
タッチラップトップがスマートフォンと異なる値を報告するのはなぜですか?
タッチ対応ラップトップと2-in-1コンバーチブルは通常10ポイントのデジタイザーを 持つため、maxTouchPoints = 10 を報告します。 ほとんどのスマートフォンは5ポイントのデジタイザーを反映して5 を報告します。iPadも 5 を報告します。 正確な値は、オペレーティングシステムではなく、タッチコントローラーの ハードウェア仕様によって異なります。さらに、マウスで使用しているタッチ ラップトップは maxTouchPoints が0でないにもかかわらず CSSメディアクエリで pointer: fine を報告します — 2つのシグナルは入力設定の異なる側面を捉えています。
タッチフィンガープリンティングはユーザーエージェント検出とどう違いますか?
ユーザーエージェント文字列は簡単に偽装できます — 任意のスクリプト、 拡張機能、開発者ツールが任意のユーザーエージェントを設定できます。navigator.maxTouchPoints はユーザーエージェントのオーバーライドで 変更できないハードウェアレジスタを読み取ります。ユーザーエージェントで iPhoneを主張しながら maxTouchPoints = 0 を返すボットは、 したがって不正として検出可能です。ユーザーエージェントとの主張との タッチシグナルの矛盾は、不正防止プラットフォームが使用する一般的な ボット検出ヒューリスティックです。
外部モニターを接続するとnavigator.maxTouchPointsは変わりますか?
いいえ。外部モニターを接続すると画面解像度と利用可能なディスプレイエリアは 変わりますが、maxTouchPoints には影響しません。その値は ラップトップやタブレットのようなプライマリデバイスのタッチハードウェアを 反映しており、接続されたディスプレイではありません。ただし、 タッチ対応の外部ディスプレイをデバイスに接続すると、OSが追加のタッチ デジタイザーを登録した場合に値が更新されることがありますが、 これは実際にはまれです。
関連記事
- ブラウザフィンガープリンティングとは?クッキーなしでサイトがあなたを追跡する方法 — すべてのフィンガープリンティングシグナルと組み合わせ方についての完全ガイド
- スクリーンフィンガープリンティングとは?画面解像度があなたを追跡する方法 — 画面寸法がデバイス分類のためにタッチデータとどう組み合わされるか
- キャンバスフィンガープリンティングとは?クッキーなしでウェブサイトがあなたを追跡する方法 — GPUレンダリングの違いが固有のデバイス識別子を生成する方法
- オーディオフィンガープリンティングとは?AudioContextがブラウザを追跡する方法 — タッチデータと共によく展開される高エントロピーの補完シグナル
- CPUフィンガープリンティングとは?ハードウェア同時実行がデバイスを追跡する方法 — maxTouchPointsを補完する別のハードウェアに基づくシグナル



