Chrome 94 で有効化されたデバイスのアイドル状態を取得する Idle Detection API

投稿: 2021年10月05日
タグ: 
  Web  ニュースネタ  技術メモ
  • Google Chrome(デスクトップ/Android 版) の新しいリリースでデバイス状態を取得する JavaScript API が既定で利用できる状態になった
  • 追加された Idle Detection API でデバイス利用有無が取得できる
  • デバイス利用状況を基にユーザー追跡などが可能になる懸念
  • 追加された API を各サイトで実行するにはユーザーの許可(ポップアップ許可) が必要
  • プライバシーに課題のある JavaScript API を Chrome が既定で有効化

    2週間ほど前にリリースされた、Google Chrome の最新バージョンである Chrome 94 で「Idle Detection API」が既定で有効化され、実行できる状態になりました。(Chrome 84-86, 88 で Origin Trial としてテストできる状態になっていたようです)

    対象はデスクトップ、Android 向けです。

    画像_2021-10-05_24.jpg

    この API、物議をかもす内容で、Chrome には導入されましたが、Firefox(Mozilla) は「Harmful(有害である)」、Safari(Apple) は「Negative」という評価をしており、コンセンサスは得られていない状態です。

    画像_2021-10-05_2.jpg
    Chrome Platform Status - Idle Detection
    https://www.chromestatus.com/feature/4590256452009984open_in_new
    https://www.chromestatus.com/features/4590256452009984open_in_new

    既に英語圏では話題になっており、Twitter や Reddit でもネガティブなコメントがすぐに見つかります。

    Idle Detection API とは?

    Chrome 94 で追加された Idle Detection API は簡単には次の 2つのことができます。

  • ユーザーが少なくとも指定時間デバイスを操作していないことを検知(逆に言うと、指定時間以内にデバイス操作があったことも検知できる)
  • ユーザーのデバイスが(スクリーンセイバー、またはロック画面を使って)ロック、もしくはアンロックされたことを検知
  • 実際の JavaScript 実装では、『PC がロック/アンロックされた』、『指定時間(60秒以上) アイドル状態になった』時点で IdleDetector オブジェクトの change イベントがトリガーされるようになっています。 EventListener で拾っていけば、履歴的にユーザーのデバイス状態を確認できます。

    ブラウザのタブを開きっぱなしにしている人もいると思うので、やろうと思えば、『ユーザーがいつ PCの操作をしているか』が簡単に取得できるようになります。

    この API は何を目的にしているのか?

    W3C が公開しているドラフトドキュメントの以下説明部分が分かりやすいので意訳をつけて引用します。

    Making these distinctions is important for applications which have the option of delivering notifications across multiple devices, such as a desktop and smartphone. Users may find it frustrating when notifications are delivered to the wrong device or are disruptive. For example, if they switch from a tab containing a messaging application to one for a document they are editing, the messaging application, not being able to observe that the user is still interacting with their device, may assume that they have left to grab a coffee and start delivering notifications to their phone, causing it to buzz distractingly, instead of displaying notifications on their desktop or incrementing a badge count.

    (ユーザーがどのデバイスを操作しているかを) 区別することは、複数のデバイス間で通知を行うアプリケーションにとって重要です。 通知が間違ったデバイスに配信されたり、混乱するような状態はユーザーをイライラさせることがあります。 例えば、メッセージアプリのタブからドキュメントを編集中のタブに切り替えた場合、メッセージアプリ側はユーザーがまだデバイスを操作していることを認識できず、 「ユーザーはコーヒーを飲みに離席したのかな」と推測し、携帯に通知を送り始めるかもしれません。 本来であればデスクトップに通知を出したり、未読件数を更新すべきところを、代わりに不必要な通知を行うことになります。
    W3C - Idle Detection API
    https://wicg.github.io/idle-detection/open_in_new

    ドラフトドキュメント内では『タブの切り替え』がユースケースとして挙げられていますが、 現状の動きを見る限りタブ単位ではなく、『デバイスのアイドル』を検知するようになっているようです。

    やりたいことはわかりますが、プライバシーの課題に加えて、果たしてそれをブラウザ(JavaScript) 内でやるのが望ましいのかという疑問も持ちます。

    デバイスアクティブ状態を取得することによって懸念されていること

    W3C のドキュメント内で懸念事項も挙げられています。簡単に言うとユーザーの特定・追跡に対する懸念であり、ネット上での Negative な声もこの点に集中しています。

    例えば、サイトA と サイトB 双方で Idle Detection API を使ってユーザーのデバイス利用状態を記録したとして、アイドルになった時刻を突き合わせることで同一ユーザーであることを特定することは難しくないでしょう。

    実際に Idle Detection API を動かす、クライアントサイドだけで動くデモページ

    実装も簡単にできたので Idle Detection API を実行するデモページ(HTML) を作ってみました。以下リンクを押すと新しいページが開きます。

    https://let-value.com/test-script/idle-detection-api.htmlopen_in_new

    デモページには 2つのボタンを設置しており、1つ目は『対象ブラウザで Idle Detection API が許可されているか』を確認するボタンです。

    画像_2021-10-05_4.jpg

    このボタンを押下するとブラウザ上で以下の JavaScript コードが実行されます。

    JavaScript
    let state = await IdleDetector.requestPermission();

    もう1つのボタンは実際に Idle Detection API の実行を開始するボタンです。

    画像_2021-10-05_5.jpg

    このボタンを押下するとブラウザ上で以下のようなコードを実行しボタンの下に追記していきます。

    JavaScript
    let idleDetector = new IdleDetector(); let controller = new AbortController(); const signal = controller.signal; idleDetector.addEventListener('change', () => { const userState = idleDetector.userState; const screenState = idleDetector.screenState; text.innerHTML = text.innerHTML + "<br/>[" + new Date().toISOString() + " (UTC)] デバイス状態が変わりました:" + userState + ", " + screenState; }); await idleDetector.start({ threshold: 60000, signal, });

    実際の出力結果は以下のようになります。 以下の場合、09:46:14 に PC をロック、09:46:17 にログインした後に操作をせずに 60秒経過して 09:47:19 にアイドルを検知しています。

    [2021-10-04T09:46:11.933Z (UTC)] デバイスアクティブ状態の取得を開始しました。
    [2021-10-04T09:46:14.960Z (UTC)] デバイス状態が変わりました:active, locked
    [2021-10-04T09:46:17.983Z (UTC)] デバイス状態が変わりました:active, unlocked
    [2021-10-04T09:47:19.540Z (UTC)] デバイス状態が変わりました:idle, unlocked
    [2021-10-04T09:48:01.864Z (UTC)] デバイス状態が変わりました:active, unlocked
    Google としては Chrome に機能として入れてしまってフィードバックを集めるフェーズということのようで、 短いスパン(4週間) のリリースでダメなら修正 or 引っ込めるというスタンスなのかもしれません。
    利用にユーザーの同意は必要ですが、一般的な殆どのユーザーは内容を理解せずにポップアップを許可するでしょうから、これを免罪符にするのは微妙そうです。

    この APIで得られるメリットが多少あるのは分かりますが、悪意のある使い方もそれ以上に考えられそうで、今後修正が加えられる可能性は高いと思うので、もう少し様子見した方がよさそうです。