Facebook で App Scoped User ID をもとに無条件ではクローリングできなくなった件


ケンブリッジ・アナリティカ問題で Facebook が急速に仕様を変更していて、特に Instagram を中心として Facebook エコシステム内でのサードパーティビジネスに結構大きなインパクトが出ている。そんな中、さらに個人情報取得に関して大きな変更が入った。


仕様変更概要

日本時間 4/20 (金) 朝に公開された "Facebook Login Changes to Address Abuse" によると、以下の変更点が加わった。

  • App-Scoped User ID を使って生成した URL から各個人のプロフィールページにリダイレクトしなくなった。
  • Facebook ログイン経由で取得された各個人のプロフィールアイコン URL へのアクセスについて、レート制限が加わるようになった。

ASID ベースの URL の扱いの変更

まず変更点のうちの前者だが、2014 年の Graph API v2.0 以降、Facebook ログインでは Facebook ID ではなく Facebook app ごとに異なる一意の App-Scoped User ID (ASID) を返すようになった。これにより、Facebook ログインで返される ASID でユーザの同一性は確認できるものの、そのユーザが Facebook の誰にあたるかを機械的に紐付けることは不可能になった。

実際、Graph API /me にアクセスして ID を取得しても、下のように Facebook app が変わると返される ID も変わる。これが ASID になる。

一方で、Facebook にログインした状態のブラウザで https://www.facebook.com/app_scoped_user_id/<<ASID>>/ にアクセスすると、該当ユーザのプロフィール URL にリダイレクトされるような仕様になっていたが、この仕様が今回撤廃された。撤廃後に上記 URL にアクセスしてもタイムラインが表示される。

プロフィール画像の取得制限

Facebook ログイン後に取得したアクセストークンを使って Graph API /me/picture にアクセスするとプロフィールアイコン URL が取得できるが、ここで取得できる URL がこれまでの CDN 経由のものから ASID ベースの URL に切り替わった。

API のレスポンスに含まれる URL を見ると、

https://lookaside.facebook.com/platform/profilepic/?asid=964613473584209&height=50&width=50&ext=1524478991&hash=AeQEmOQUmveIjr9I

API 呼び出し時間や ASID と並んで、縦横を指定しているように見えるパラメータが含まれる。ここを返るとそのサイズのプロフィールアイコン画像が返されるように思えるが……

$ curl -I "https://lookaside.facebook.com/platform/profilepic/?asid=964613473584209&height=50&width=50&ext=1524478991&hash=AeQEmOQUmveIjr9I"

HTTP/2 404 
access-control-allow-origin: *
x-xss-protection: 0
pragma: no-cache
cache-control: private, no-cache, no-store, must-revalidate
x-frame-options: DENY
strict-transport-security: max-age=15552000; preload
x-content-type-options: nosniff
expires: Sat, 01 Jan 2000 00:00:00 GMT
vary: Accept-Encoding
content-type: text/html; charset=UTF-8
x-fb-debug: 7gIphFixMwLluGid45j0X0aEXrnB5i0a20i9aEA509NrUm510bMI3dNrCxzdXXHKOzTwAdymVXAWT1RsJLNXRQ==
content-length: 0
date: Fri, 20 Apr 2018 10:24:18 GMT

と 404 が返ってきてしまう。どうも 50 x 50 の JPEG 画像のみが取得できるようだ。

影響範囲

ASID ベースの URL の扱いの変更

こちらはインパクトが少ないように見えるが、今回の変更の一番の目玉はむしろこちらになる。

これまで、 情報収集用の Facebook アカウントをいくつか用意しておき、Facebook ログインで収集した ASID を元に生成した URL を Facebook ログインした状態のヘッドレスブラウザなどでクロールすることによって、ユーザが当該 Facebook app に対して許可しているかどうかに係わらず

  • 本来の Facebook プロフィール URL
  • 一般公開になっているプロフィールなどの属性情報
  • 一般公開していれば、写真やウォールへの投稿、友達一覧すべて

を収集可能だった。

連続して何十件か取得すると Facebook 側で制限がかかるので収集用の Facebook アカウントを複数用意したりスロットリングしたりする必要はあるものの、少し工夫することでユーザが Facebook app に対して許可した以上の個人情報を機械的に収集することが可能で、個人情報を取得する上で大きな抜け穴になっていたのだ。

今回、このルートが潰されたことにより、Facebook ログインで取得した以上の情報を Facebook から機械的に取得できなくなった。これは大きな進歩と言っていいだろう。前回までの私の記事で若干ぼかして

いわゆるヘッドレスブラウザ、ブラウザのエンジン部を切り出して実際には表示させずにレンダリング結果を評価できる仕組みを使って Facebook の情報を抜く

と書いた手法の詳細が上記だが、これが塞がれない限りは対策が不十分だと考えていた。今回、これが潰されたことによって、ある程度 Facebook の個人情報の自動抽出が難しくなったと言える。

今回、こちらについても他の対策と同じく移行期間なしの廃止となったが、実際に上記のような手法でデータ取得していたベンダーは薄々気づいていたのではないだろうか。

プロフィール画像の取得制限

こちらは、例えば Facebook ログインで取得したプロフィールアイコン URL をそのままサイト内のプロフィール画像として流用している場合には問題が発生する。ただし、ログイン時に画像をサイト側でダウンロードしておけばいいのでそんなに大きな問題ではない。


今回の変更で、個人情報の不正取得についてはある程度対策が完了した感がある。ただ、近く開催される F8 でさらなる対策が発表される可能性は否定できない。Facebook 上でビジネスをしているすべてのベンダーは F8 のキーノートは見逃せないだろう。

そして、なぜアメリカでこんなに騒がれ、日本ではほぼ騒がれていないか。被害者が少ないこともあるが、この問題の本質は不正利用・不正抽出ではない。

こういう視点の報道が日本ではほぼ出てこないところに若干の違和感を感じている。

2018 年 5 月 2 日追記

Graph API v3.0 にあわせて公開された "Facebook Login Updates to Further Protect Privacy" によると、user_link パーミッションを取得することでリンクを取得できるようになった。

ただし、これまでの ASID ベースのものと異なり、

  • ユーザがパーミッションを取り消すとリンクも機能しなくなる。
  • 同じ Facebook app を使っている他のユーザを除き、このリンクは共有不可。
  • Facebook app の所有者以外、例えば開発者や代理店、被雇用者などはこのリンクを利用不可。
  • サードパーティのアナリティクスサービスや DMP などに共有不可。

という厳しめの制限がかけられていることに気をつける必要がある。