JS memo

お洒落にJavaScript。

2019年3月20日20:15

AppleのITP2.1のリリースと対策を分かりやすく解説

メインビジュアル

AppleのITP2.1のリリースと対策を分かりやすく解説

2019年2月21日、AppleのWebKit公式ページにて、ITP2.1をリリースすると発表がありました。

ITP2.1はiOS12.2とmacOS High SierraとMojaveのSafari12.1のアップデートに伴い施行されます。このリリースでユーザーのプライバシーの保護強化に向けてcookieの扱い方が大きく変わります。 では実際に何が変わるのか、その対策などみていきたいと思います。

目次
  1. そもそもITPとは?
  2. ITP2.0からITP2.1への変更点
  3. ITP2.1に伴う影響と解決策
  4. まとめ

そもそもITPとは?

ITPとは「Intelligent Tracking Prevention」の略で、safariを使用するユーザーのプライバシー保護を目的とし、cookieの扱い方などを規定したApple社が開発したブラウザのセキュリティー機能です。ITPは2017年5月にWebkitの公式ブログで発表され、2017年9月のsafari11.0のリリースに伴い、初めて搭載されました。

そもそもAppleはクロスサイトトラッキング(Cross-Site Tracking)を減らすことで、サードパーティークッキー(third-party cookie)を抑制し、ユーザーのプライバシー保護につながると考えており、その結果ITPが作成されました。

今回のITP2.1に伴う変更点を説明する前にクロスサイトトラッキングとサードパーティークッキーとは一体何なのかを説明しておきます。

クロスサイトトラッキング

例えば、ECサイト(ex.com)で食品と衣類をそれぞれ別々のサブドメイン、food.ex.comとfashion.ex.comで売っているとします。それぞれの商品を買うまでには会員ログインページを経由する仕組みになっており、同じドメイン、member.ex.comを使用しています。このサイトをgoogleアナリティクスでCVRなどの数値を記録していた場合、会員ログインで計測ができなくなりますよね。そのため、それぞれのサブドメインに同じgaタグを読み込むことで複数のサブドメインを跨いで数値を取れるようなります。

このような例をクロスサイトトラッキングと言います。

サードパーティークッキー

上記で説明したgaタグは主にcookieに情報が保存され、このcookieを違うドメイン間で受け渡しすることによってユーザーを追跡することが可能になります。このように複数のドメイン間で使用されるcookieをサードパーティークッキーと言います。

ちなみにクッキーの発行元のドメイン、またクッキーを利用可能なドメインはgoogle developer toolで確認できます。

確認方法

クッキーの発行元のドメイン

  • 調べたいページで右クリック、検証を選択し、google developer toolを開く
  • ApplicationのStorageのcookiesを参照

上記に記載のドメインがcookieを発行したドメインです。

クッキーの取得が有効なドメイン

  • 右クリックで検証を選択し、google developer toolを開く
  • ApplicationのStorageのcookieをクリック
  • Domainの列を確認

それぞれのクッキーの取得に有効なドメインがDomainの列に表示されています。このドメインが現在のページのドメインと異なるクッキーがサードパーティークッキーです。

ITP2.0からITP2.1への変更点

1. クッキーの一本化

トラッキングのために使用されるとみなされたサードパーティークッキーはpartitioned cookieとして保存することが可能でしたが、ITP2.1では禁止されます。

partitioned cookieとは主にhtmlタグのiframeで実装することができます。

iframeは任意のサイトで別サイトのコンテンツをそのまま読み込むことができる仕様になっていて、
ブログ記事にyoutubeやgoogle アドセンスの広告を貼る時などに利用されます。

このiframeは他サイトのコンテンツをそのまま読み込むだけでなく、cookie情報のやりとりもできてしまいます。

例えば、サイトBのコンテンツをiframeでサイトAに貼り付けた場合、ユーザーにとって、ただ貼り付けられたコンテンツを見ているような感覚ですが、実はサイトBにも訪れているということになります。

この時にサイトBがcookieを利用して、このユーザーがサイトAを閲覧したという情報を取得できます。さらにA同様、サイトBのコンテンツをiframeで読み込んでいるサイトの閲覧履歴は全てBによってトラッキングされる可能性があります。

そのためITP2.0ではこのcookieを本当に必要な情報だけに分割して保存しておくこと(partitioned cookie)が可能でした。
しかしながらpartitioned cookieの実装は不具合が多かったので、ITP2.1ではpartitioned cookieのような特別扱いがなくなり、トラッキングと認定されたcookieはすぐに削除されるようになります。

2. document.cookieで作成したクッキーの保管期間が7日間になる

クッキーの作成は主にサーバーサイドからhttpヘッダーに送る方法と、JavaScriptのdocument.cookie APIで作成する2パターンがあります。

後者のJavascriptのdocument.cookieで作成したcookieは盗まれる可能性などセキュリティー面で脆弱性があるため、クッキー情報は7日間のみ有効になります。

3. キャッシュを使ったクロスサイトトラッキング禁止機能の強化

Appleはブラウザがもつキャッシュを利用したユーザーのトラッキングを5年前から禁止していました。

しかし、未だに不正にキャッシュを利用したトラッキングが行われているため、強化しようといったものです。

4. サードパーティーによるストレージのアクセス拒否

何かダウンロードしたりする際に「ストレージへのアクセスへ権限を与えてください。」と表示されたことはありませんか?ITP2.0では一時的にサードパーティーが自動的にストレージへアクセスすることを許可していました。

ITP2.1ではユーザーがクリックやタップなど何かしら動作を行う前にストレージへアクセスすることを禁止するそうです。

5. DNT(「追跡しない」)信号のサポートを削除

Appleはユーザーが知識なしにcookieを使用してトラッキングされるのは人権侵害だとし、(DNT)Do Not Trackをサポートしてきました。

しかし、日々普及するトラッキング技術にDNTの技術が追いつかなくなり、不必要となったためDNTを停止します。

ITP2.1に伴う影響と解決策

ITP2.1に伴い起こりうる問題をあげてみます。

サードパーティーによるユーザーにとって必要な情報が表示できない

上記の1のサードパーティーによるトラッキングクッキー(partitioned cookie)の使用が不可になった時の問題を考えてみます。例えば、SNSのいいねボタンを自分のサイトで設置した時に、いいねをユーザーがクリックすると一回ブラウザを閉じても記録は消えないですよね?これはSNS(サードパーティー)がユーザーのクッキー情報を取得しているからです。

しかしITP2.1ではサードパーティーがトラッキングクッキーを使えなくなり、いいねの情報は記録されなくなります。

こういった現象が起こるのはまずいので、ユーザーが特定のコンテンツに対してアクセスしている時だけ、クッキー情報をサードパーティーが利用できるようにしたものがStorage Access APIです。

Storage Access APIについて

document.requestStorageAccess()はユーザーが何かしらの動作を行った時に、その情報にアクセスをリクエストを送ることができます。そしてPromiseを用いて、アクセスが許可された場合と拒否された場合の仕様をかえします。

document.requestStorageAccess()

<script>
function makeRequestWithUserGesture() {
  var promise = document.requestStorageAccess();
  promise.then(
    function () {
      // Storage access was granted.
    },
    function () {
      // Storage access was denied.
    }
  );
}
</script>
<button onclick="makeRequestWithUserGesture()">Play video</button>

すでにファーストパーティーからアクセスが許可されているか確認する場合にはdocument.hasStorageAccess()を使用します。

document.hasStorageAccess()

var promise = document.hasStorageAccess();
promise.then(
  function (hasAccess) {
    // Boolean hasAccess says whether the document has access or not.
  },
  function (reason) {
    // Promise was rejected for some reason.
  }
);

iframeタグにおいては注意が必要です。

先ほど説明したiframeですが、サードパーティーのcookie情報を格納することができます。が、iframeのsandbox属性のデフォルトがcookieにアクセスできないようになっているので、"allow-storage-access-by-user-activation"を追加して上げることが必要です。

<iframe sandbox="allow-storage-access-by-user-activation allow-scripts allow-same-origin"></iframe>

Google Analyticsのユーザーのトラッキング情報が変わる

上記の2のクライアントサイドでのクッキーの保管期間が7日間になることで問題となりうるのは、Google Analyticsで7日後に再訪問したユーザーは新規になることです。

この対策としてはlocalStorageでcookie情報をクライアントIDで保持することがあげられます。

Google Analyticsで推進されている方法なので詳しくは以下を参照してください。

Cookie とユーザーの識別  |  ウェブ向けアナリティクス(analytics.js)

まとめ

iPhoneの普及率を考えるとユーザー情報を必要とするアフィリエイトやWEBマーケティングをする人はITPの仕様変更を理解しておかないと大変なことになりそうです。

ITP2.1の規制は厳しいと思いますが、ユーザーのプライバシー保護のためにはITP2.1の仕様に沿って正しくcookieを使用する必要があり、またcookieでどのように自分の情報が使われているかを理解しておく必要を感じました。