追記:ユーザートラッキングに関するStripeの対応
先週、私はStripeが顧客のウェブサイトで訪問者の行動を記録している仕組みについてブログ記事を公開しました。端的に言えば、StripeのJavaScriptライブラリは、サイト上でStripeの決済フォームが一度も表示されない場合でも、ユーザーが訪れたURLの情報やマウスの動きに関するテレメトリーを収集していました。私は、ほとんどのStripe顧客がこの事実を把握していないのではないかと考え、Stripeはデータ収集の実態をより目立つ形で、より詳細に開示すべきだと論じました。
この記事はHacker Newsで活発な議論を呼びました。中でもStripeの共同創業者兼CEOであるPatrick Collison氏から複数のコメントが寄せられています。彼は最も注目を集めたコメントの中で次のように述べました。
提起された疑問(「Stripeは広告のためにこのデータを収集しているのか?」)については、はっきりと否とお答えできます。このデータが広告主に販売・貸与等されたことは過去に一度もなく、今後も決してありません。
何人かのコメント投稿者は、彼の説明はありがたいとしつつも、Stripeの利用規約やプライバシーポリシーに、法的拘束力を持つ公式な文言として明記してほしいと求めました。
私の記事が公開されてから1週間も経たないうちに、Stripeはデータ収集の実態やユーザーのプライバシーに関する保証について、より適切に開示するために実施した変更点をまとめたブログ投稿を公開しました。
私は新しいドキュメントを確認しました。以下では、Stripeの変更が私が提起した課題にどの程度応えているかを検証します。
Stripeの変更点
開発者向けドキュメントでトラッキングの挙動を明示
私にとって最も重要な変更は、Stripeの開発者向けドキュメントでJavaScriptライブラリのトラッキングの挙動が開示されるようになったことです。今回の変更以前は、この2文が唯一の手がかりでした。
Stripeの高度な不正検出機能を最大限に活用するため、決済ページだけでなく、すべてのページでStripe.jsを読み込むようにしてください。これにより、顧客がウェブサイトを閲覧する際の不審な挙動をStripeが検出し、不正の兆候を捉えることが可能になります。
この説明では重要な情報が欠けており、ライブラリがどのような情報を収集し、そのデータをどのようにStripeのサーバーと共有しているかが伝わっていませんでした。
現在のドキュメントでは、ライブラリの説明に「高度な不正検出シグナルの無効化」というセクションが設けられ、そこから不正防止のためにStripeが収集する情報の種類を明確に定義したページへリンクが張られています。

Stripeの新しい不正検出に関するドキュメントでは、Stripeがユーザーデータをどのように収集するかがより明確に説明されています。
Stripeの顧客はトラッキングを無効化できるように
StripeはJavaScriptライブラリを更新し、顧客が詳細なデータ収集をオプトアウトできるようにしました。<script>タグにadvancedFraudSignals=falseパラメータを付けて読み込むことで、この機能を無効化できます。
<script src="https://js.stripe.com/v3/?advancedFraudSignals=false"></script>@stripe/stripe-js npmパッケージを利用している顧客も、ライブラリの初期化時に{advancedFraudSignals: false}を指定することで同じ機能を利用できます。
import { loadStripe } from "@stripe/stripe-js/pure";
loadStripe.setLoadParameters({ advancedFraudSignals: false });
const stripe = await loadStripe("pk_test_TYooMQauvdEDq54NiTphI7jx");これは前向きな変更です。ウェブサイトの所有者が、より高度な不正防止を実現するためにどれだけのデータを提供するかを自ら判断できるようになったからです。
プライバシーポリシーでユーザーデータの販売を明確に禁止
水曜日に、Stripeはプライバシーポリシーを大幅に改定しました。改定により、Stripeがユーザーデータをどのように扱い、外部パートナーと共有するかについて、より厳しい制限が設けられました。
私はプライバシーポリシーの変更点の差分を作成しましたが、ここでは特に注目すべき点を紹介します。
- 広告ネットワークとユーザーデータの販売に関する記述を削除
元のブログ記事で、私はStripeのプライバシーポリシーにある次の懸念すべき一節を取り上げました。
当社のサイトまたはオンラインサービスにアクセスすると、当社および特定の第三者は、時間をかけて、また異なるサイトを横断して、あなたのオンライン活動に関する情報を収集し、あなたの個々の興味に合わせた商品やサービスに関する広告(この種の広告は「インタレストベース広告」と呼ばれます)を提供します。
Stripeはまた、AdWordsやAdRollといった広告パートナーとデータを共有する許可を自らに与える次のような文言も掲載していました。
当社はGoogle AdWords、Doubleclick、AdRoll、その他の広告ネットワークと提携しています。
Stripeはこれらの記述をいずれも削除しました。新しい文言は、Stripeが顧客データを広告主に販売しないことを、明確かつ直接的に示しています。
当社は、ユーザーの顧客の個人データをインタレストベース広告のために使用、共有、貸与、販売することはありません。当社は、ユーザー、その顧客、またはサイト訪問者の個人データを販売または貸与することはありません。
- 企業売却後もユーザーデータは保護される
Hacker Newsでの議論の中で、あるユーザーが、Stripeの現在の善意にもかかわらず、仮に別の企業がStripeを買収した場合にユーザーデータが不適切に扱われるのではないかと懸念を示しました。Patrick Collison氏は次のように返答しています。
清算などの事態が起きた場合でもこのデータを共有しないよう、契約上で自らを拘束できないか、あるいは何らかの形で有用な縛りを設けられないか、法務チームに確認してみます…
おそらくこのやり取りに直接応える形で、新しいプライバシーポリシーには次の条項が追加されています。
当社または当社の事業の一部を買収するその他の事業体は、あなたの個人データを引き続き使用する権利を有しますが、それはあなたが別途同意しない限り、本プライバシーポリシーに定められた方法に限られます。
今後さらに改善してほしい点
Stripeの迅速かつ徹底した対応には感心していますが、まだ改善が必要だと感じる点も残っています。これらの懸念はStripeにも直接伝えており、将来的に対応する予定があるとの回答を得ています。
URL収集についてより明示的に開示する
Stripeは不正検出に関する専用ページに「シグナルの種類」というセクションを設け、不正検出の一環としてエンドユーザーからどのような情報を収集しているかを説明しています。
私のブログ記事では、Stripeがユーザーが訪れたページの完全なURLを、クエリ文字列(例:example.com?userId=michael)やURLフラグメント(例:example.com#key=1234)を含めて収集していることを指摘しました。Stripeはこの情報の収集について、依然として明確にしていません。最も近い記述は次の箇所です(強調は筆者によるもの)。
高度な不正検出シグナルには、正規の購入者と不正な購入者やボットを区別するのに役立つ、ショッピング体験における行動指標も含まれます…これらのシグナルには、マウスの動きの指標や、ショッピング体験の中でユーザーが各ページに滞在した時間が含まれ、いずれもセッション全体を通じたボットのような挙動を予測する手がかりとなります。
この文面から、Stripeが完全なURLを収集していると合理的に推測できるでしょうか。私は難しいと思います。
クエリ文字列に機密データを格納するウェブアプリケーションには同情の余地がないと感じる方もいるかもしれません。なぜなら、それは安全でないパターンとして広く知られているからです。しかしURLフラグメントはより深刻です。こちらは本来、機密情報を安全に格納できる方法であり、サードパーティのライブラリがそのコピーを外部サーバーに送信しているのは憂慮すべき事態です。
Firefox SendやMega.nzは、いずれもURLフラグメントにクライアントサイドの暗号化キーを格納している人気のウェブアプリケーションの例です。これにより、ユーザーはサーバーが元データに一切アクセスできない形で、エンドツーエンドで暗号化されたファイルをクラウドに保存できます。もしStripeのJavaScriptライブラリが同様の仕組みを採用しているサイトで動作した場合、機密性の高い暗号化キーがStripeのサーバーに漏えいしてしまいます。

人気のファイル共有アプリケーションMega.nzは、機密性の高い暗号化キーをURLフラグメントに格納しています
ライブラリのアンロードへの対応
loadStripe関数や/pureのインポートパスによって、いつStripeを有効にするかを導入側が決められるようになりましたが、Stripeを無効にする方法は依然として存在しません。
たとえば、チェックアウトの流れの間だけStripeの高度な不正検出を有効にし、取引が完了したらStripeとのデータ共有を止めたいとします。現状でこれを実現する唯一の方法は、ページを強制的に再読み込みすることです。
アプリがStripeを必要としなくなったタイミングでトラッキングを動的に無効化できる、unloadStripeのようなシンプルな関数が提供されれば、より望ましいでしょう。
なぜこれが重要なのか
サードパーティのJavaScriptパッケージを組み込むことで、ウェブサイトの所有者はそのライブラリに大きな信頼を寄せることになります。ユーザーのブラウザ上でコードを実行できるJavaScriptライブラリは、いわば王国の鍵を握っています。ユーザーが閲覧できるすべての情報にアクセスでき、ユーザーの権限でサイト上の操作を実行できるからです。
ウェブサイトの所有者には、自らのサイトが直接的あるいはサードパーティのライブラリを通じてどのような情報を収集しているかを把握する責任があります(法域によっては法的な責任でもあります)。Stripeが責任あるデータ管理を示しているのは良いことですが、ウェブサイトの所有者は、外部パートナーがどのようなデータを収集し、そのデータについてどのような制限を保証しているのかを把握する権利を主張し続けなければなりません。
記事をランダムに読む
