あなたのブラウザは何ができるか
この端末の答え
画面がついたら調べます。JavaScript が動いていないと、ここは空のままです。
調べているのは「その名前があるかどうか」だけです。この確認は、許可なしで行います。結果は、お使いのブラウザの中だけで処理します。
| 機能 | この端末 |
|---|---|
| クリップボードコピーした文字を受け取ったり、ボタンひとつで書き写したりする仕組みです。navigator.clipboard | 調べる前 |
| 位置情報いまいる場所の緯度と経度を教えてもらう仕組みです。使うたびに許可を聞かれます。navigator.geolocation | 調べる前 |
| 通知そのページを見ていないときでも、画面のすみにお知らせを出す仕組みです。Notification | 調べる前 |
| 読み上げ画面の文字を声にして読み上げる仕組みです。speechSynthesis | 調べる前 |
| 音声認識マイクに向かって話した言葉を、文字にする仕組みです。SpeechRecognition | 調べる前 |
| スポイト画面のどこかの色をつまみ取って、その色の番号を教えてもらう仕組みです。EyeDropper | 調べる前 |
| 電池の残り電池がどれだけ残っているか、充電中かどうかを教えてもらう仕組みです。navigator.getBattery | 調べる前 |
| サービスワーカーページを閉じたあとも裏で働いて、電波が無いときでも表示できるようにする仕組みです。navigator.serviceWorker | 調べる前 |
| WebGL絵を描く部品に直接指示を出して、立体や3Dのゲームを描く仕組みです。WebGLRenderingContext | 調べる前 |
| WebGL 2WebGL の新しいほうです。描き方の指示をもっと細かく書けます。WebGL2RenderingContext | 調べる前 |
| ウェブオーディオ音を作ったり、混ぜたり、その場で加工したりする仕組みです。AudioContext | 調べる前 |
| ローカルストレージ短い文字をこの端末の中に置いておく仕組みです。ページを閉じても残ります。localStorage | 調べる前 |
| IndexedDBたくさんのデータを端末の中にしまって、あとから探し出す仕組みです。indexedDB | 調べる前 |
| ポインターイベント指・ペン・マウスのどれで触られたのかを、同じ書き方で受け取る仕組みです。PointerEvent | 調べる前 |
| 傾きと動き端末が動いた向きや、傾いた角度を受け取る仕組みです。DeviceMotionEvent | 調べる前 |
| 振動端末をぶるっと震わせる仕組みです。navigator.vibrate | 調べる前 |
| 共有端末が持っている「共有」の画面を呼び出して、ほかのアプリに渡す仕組みです。navigator.share | 調べる前 |
| ファイルの読み書き端末の中のファイルを選んで、そのまま書き換えて保存し直す仕組みです。window.showOpenFilePicker | 調べる前 |
| 画面を消さないレシピを見ながら料理するときなどに、画面が勝手に暗くならないようにする仕組みです。navigator.wakeLock | 調べる前 |
| 支払い支払いの入力画面を、ページではなくブラウザ側が出す仕組みです。PaymentRequest | 調べる前 |
| パスキーパスワードの代わりに、指紋や端末そのもので本人だと確かめる仕組みです。PublicKeyCredential | 調べる前 |
| WebRTC相手のブラウザと直接つないで、声や映像をやりとりする仕組みです。RTCPeerConnection | 調べる前 |
| WebTransportサーバーと速くやりとりするための、新しい通信の仕組みです。WebTransport | 調べる前 |
| WebCodecs動画や音を、細かい指示つきで圧縮したり、元に戻したりする仕組みです。VideoEncoder | 調べる前 |
| 画面の外で描く見えないところで絵を描いておいて、できてから貼り付ける仕組みです。OffscreenCanvas | 調べる前 |
| 大きさの見張り画面の部品の大きさが変わったことを教えてもらう仕組みです。ResizeObserver | 調べる前 |
| 画面に入ったかの見張りその部品が画面の中に入ってきたことを教えてもらう仕組みです。IntersectionObserver | 調べる前 |
| まるごと複製入れ子になったデータを、奥の奥まで写し取る命令です。structuredClone | 調べる前 |
| 大きな整数けたがいくつになっても正確に計算できる整数です。BigInt | 調べる前 |
| 言葉の区切り空白で区切らない日本語の文でも、単語や文字のまとまりに切り分ける仕組みです。Intl.Segmenter | 調べる前 |
| WebAssemblyほかの言語で書いた速いプログラムを、ブラウザの中で動かす仕組みです。WebAssembly | 調べる前 |
| ブラウザの名乗りブラウザの名前や版を、長い文字列ではなく整理された形で答える仕組みです。navigator.userAgentData | 調べる前 |
| 積んでいるメモリこの端末のメモリがおよそ何ギガバイトかを答えるものです。navigator.deviceMemory | 調べる前 |
| 同時に動かせる数計算をいくつ同時に進められるかという数を答えるものです。navigator.hardwareConcurrency | 調べる前 |
| 回線の速さいまつないでいる回線がどれくらい速いかを答えるものです。navigator.connection | 調べる前 |
| Bluetooth近くにある機器と、ページから直接つなぐ仕組みです。navigator.bluetooth | 調べる前 |
| 電子楽器(MIDI)電子ピアノなどの楽器と、ページを直接つなぐ仕組みです。navigator.requestMIDIAccess | 調べる前 |
よくある質問
調べた結果は、どこかに送られていますか?
送っていません。調べているのは全部あなたのブラウザの中だけで、結果を外へ出す処理は1行も書いていません。ページを閉じれば消えますし、保存もしていません。信じてもらう必要はなくて、自分で確かめられます。キーボードのF12(または右クリックから「検証」)で開発者ツールを開き、「ネットワーク」を選んだままページを読み直してください。この画面を作るためのファイル以外に、どこかへ送っている通信が並ばないはずです。
「あり」と出ているのに、その機能が動きません。
このページが調べているのは「その名前がブラウザにあるか」だけで、「実際に使えるか」は分かりません。名前があっても動かない理由はいくつもあります。許可を聞かれて断ったとき、安全な接続(https)でないと動かない決まりのとき、名前だけ先に用意されていて中身がまだ整っていないときなどです。だからこの表には「あり」「なし」とだけ書いています。「使えます」とは書いていません。
「調べられません」と出るのはどういうときですか?
読もうとしただけで断られたときです。たとえばローカルストレージは、端末の設定によっては名前を読むだけで拒否されることがあります。そこで「なし」と書いてしまうと「この端末にはローカルストレージが無い」という嘘になります。分からなかったことは、分からなかったと書きます。
対応している数が少ないと、そのブラウザは劣っているのですか?
そうとは限りません。少ないのには理由があることが多いからです。Safari の中身であるWebKitは、指紋や安全性の心配があると考えた機能について「いまのところ実装しない」と決めていて、その例を名前を挙げて公開しています。この表に入っているものでは、電池の残り・Bluetooth・電子楽器(MIDI)・積んでいるメモリ・回線の速さの5つがその一覧に載っています。数が多いほうが便利ではありますが、多い=良いとは言い切れません。
プライベートウィンドウで開けば、指紋は変わりますか?
この表の答えはほとんど変わらないはずです。プライベートウィンドウは、履歴やクッキーを端末に残さないための仕組みであって、ブラウザの中身を入れ替えるものではないからです。実際に、ふだんの窓とプライベートウィンドウの両方でこのページを開いて、記号を見比べてみてください。ほぼ同じ記号が出ると思います。クッキーを消しても同じ人だと分かってしまうのが、指紋という手口のやっかいなところです。
ユーザーエージェント(UA)を見れば、ブラウザの種類は分かるのでは?
UAの文字列は書き換えられます。別のブラウザのふりをする拡張機能もありますし、ブラウザ側も細かい情報を減らす方向へ動いてきました。だからこのページはUAを1文字も見ていません。見ているのは「その名前があるかどうか」だけです。なお、整理された形でブラウザ名を答えるnavigator.userAgentDataはChromiumの系統にしかなく、FirefoxにもSafariにもありません。皮肉なことに、それがあるかどうかを見ること自体が、また1つの手がかりになっています。
いま開いているブラウザに何ができるかを、37項目ぶん調べて並べます。調べた結果はこの画面の中だけで、どこにも送りません。だから、自分の「指紋」を安全に見ることができます。
この表そのものが、あなたの「指紋」です
ここが、このページのいちばん大事なところです。上の表は対応表であると同時に、あなたを見分けるための手がかりになっています。37個の「あり・なし」の並び方は、全部で137,438,953,472通りあるからです。
どれくらいの数か、人の数と比べてみます。国連は2022年11月15日に世界の人口が80億人に達した(新しいタブで開きます)と書いています。80億人に1人ずつ違う番号を配るには、「はい・いいえ」が33個あれば足ります。33個なら8,589,934,592通りで80億を超えますが、 1つ減らして32個にすると4,294,967,296通りしかなく、足りません。この表の質問は37個です。数のうえでは、もう超えています。
ただし、これは「並び方が何通りあるか」の話であって、 あなたが必ず1人に絞られるという意味ではありません。同じブラウザの同じ版を使っている人どうしは、答えがそっくり同じになります。 指紋を採る側は、この表に画面の大きさ・時計のずれ・入っている文字の種類・ 絵の描かれ方のくせ、といったものを何十個も足していきます。 この表はその材料の、ほんの一部です。
面白いのは、手がかりになるのは「できること」だけではないところです。できないことも、同じだけ手がかりになります。表のどこかが「なし」であることは、それだけで 「このブラウザではない」という情報を渡していることになります。
だから、このページは結果をどこにも送りません
指紋を見せるページは、ふつう指紋を集めます。研究サイトのAmIUnique(新しいタブで開きます)は、訪れた人の指紋をサーバーに保存すると自分で書いています。 世界中の指紋がどれくらいばらついているかを調べるのが目的なので、 集めなければ成り立たない作りです。
このページは集めません。調べるのも数えるのも記号にするのも、 全部あなたのブラウザの中で終わります。だから安心して、自分の指紋を見ることができます。
信じてもらう必要はありません。開発者ツールの「ネットワーク」を開いたまま このページを読み直せば、どこかへ送っている通信が無いことを自分で確かめられます。 許可も1つも求めていません。位置情報も通知も、名前があるかどうかを見ただけで、呼び出してはいません。
「あり」と出ても、「使える」とは限りません
この調べ方は存在検出といって、 「その名前がブラウザにあるか」を見ているだけです。 名前があっても実際には動かないことがあります。
- 許可を聞かれて、断られた(通知・位置情報・マイクなど)
- 安全な接続(https)でないと動かない決まりになっている
- 名前だけ先に用意されていて、中身がまだ整っていない
だからこの表は「あり」「なし」としか書いていません。 「使えます」とは書いていません。 逆に、読もうとしただけで断られることもあります。そのときは「調べられません」と出します。 分からなかったものを「なし」に倒すと、持っていないという嘘を画面に書くことになるからです。
Safariに無い機能には、無い理由があります
分かりやすい例が電池の残り(Battery Status API)です。 SafariはmacOSでもiOSでも、一度も実装していません。 Firefoxは一度入れて、あとから取り上げました── 43で使えるようにして、52でウェブページからは使えなくしています。そのときの記録(新しいタブで開きます)には、トラッカーによる指紋採取を減らすためだ、と書かれています。
WebKit(Safariの中身)は2016年10月に、「Remove Battery Status API from the tree」(新しいタブで開きます)という記録でコードごと消しています。理由はそこに「プライバシー(追跡と指紋採取)の危険」と書かれていて、 電池の情報が追跡に使えると指摘した研究があることも挙げられています。
そして今も、WebKitは指紋採取や安全性などの心配から「いまのところ実装しないと決めた機能」の例(新しいタブで開きます)として、この API を名前を挙げて載せています。 上の表に入っているものでは、 次の5つがその一覧に載っています。
- 電池の残り(navigator.getBattery)
- 積んでいるメモリ(navigator.deviceMemory)
- 回線の速さ(navigator.connection)
- Bluetooth(navigator.bluetooth)
- 電子楽器(MIDI)(navigator.requestMIDIAccess)
つまり、あなたのブラウザでこの5つが「なし」と出ているなら、 それは作りが遅れているからではなく、指紋を取られにくくするために、わざと持っていない可能性があります。
スポイトは、それ1つで「パソコンのChrome」だと分かります
EyeDropper(スポイト)は、画面のどこかの色をつまみ取れる機能です。 これはChromeのデスクトップ版にしかありません。 Chrome 95から入りましたが、AndroidのChromeにも、Firefoxにも、Safariにも無いのです。
ここが指紋の話につながります。上の表でスポイトが「あり」なら、それだけで「パソコンで Chrome の系統を使っている」と ほぼ言えてしまいます。 37個の質問のうち、たった1個です。 全部の質問が同じ重さではなく、1個で大きく絞り込めるものがあるのが、指紋という手口の怖いところです。
ブラウザの「名乗り」は、もうあてになりません
ブラウザは昔から、自分の名前と版を書いた文字列を送っていました。ユーザーエージェント(UA)と呼ばれるものです。 ところが、これは書き換えられます。 別のブラウザのふりをする拡張機能もありますし、 ブラウザ側も細かい情報を減らす方向へ動いてきました。
だからこのページはUAを1文字も見ていません。 見ているのは「その名前があるかどうか」だけです。 名乗りは書き換えられますが、機能があるかどうかは書き換えにくい── これが、指紋を採る側が名乗りより機能を見る理由でもあります。
整理された形でブラウザ名を答えるnavigator.userAgentDataは、Chromiumの系統にしかありません(Chrome 90から。FirefoxにもSafariにも無い)。 皮肉なことに、それがあるかどうかを見ること自体が、また1つの手がかりになっています。 上の表にこの行が入っているのは、そのためです。
出どころ: 電池の残りの扱いは Mozilla と WebKit の記録(Bugzilla 1313580 / WebKit 164213)と、WebKit の「Tracking Prevention in WebKit」。 スポイトと navigator.userAgentData がどのブラウザにあるかはMDN の対応表(新しいタブで開きます)(EyeDropper は Chrome 95・Android の Chrome と Firefox と Safari は無し、 userAgentData は Chrome 90・Firefox と Safari は無し)。 世界の人口は国連。 調べる項目の一覧と計算は core/features.ts にあり、 単体テストが重複や説明の抜けを見張っています。