情報漏洩しない WEB ショッピングサイトの案(または情報漏洩しても謝らなくて済むサイト)
オンラインショッピングサイトに限定すれば、少なくとも個人情報を持つ必要はない。持っていなければ情報が漏洩することもない。
この観点から、個人情報を持たずにできるだけ現在よくあるオンラインショッピングサイトのサービスを低下させないでサービスを提供する方法を考える。
前提
オンラインショッピングサイトであるので、以下の顧客サービスとマーケティングが必要である、と考える。
- 顧客サービス
- 登録済みのお客さまはログインすれば自宅住所やカード番号などの入力を省略できる。
- ショッピングカートなどにより、手軽に商品の選択と決済ができる。
- お客さまの購買履歴に基いて、お勧め商品を表示できる。
- お客さま個人の会員ポイントなど、優待サービスを提供できる。
- マーケティング
- お客さまの年齢層、性別、居住地域に基いた購買傾向をマーケティングできる。
表題にぶち上げた通り、個人情報は取得しない。
WEBアプリケーションの他の問題(XSSによるセッションハイジャック、セッション固定、セッション推測、CSRFなどによる情報漏洩)はWEBアプリケーションの適切な実装によって回避する。
(ここで考察しているのは、データベースからの情報漏洩である)
サービス形態
ありがちなサービス形態を想定。お客さまはまずサービスに登録を行い、会員番号の発行を受ける。以後はユーザIDとパスワードによってログインを行う。これら三つの値はそれぞれ別のものとする。
会員番号単位に買い物金額の5%がポイントとして溜められ、ポイントは1点を1円に換算して商品購入のために利用することができる。
商品購入はショッピングカートシステム(バスケットシステム)によって行い、商品をピックアップした後に決済を行う。
決済時には、登録時に記載したクレジットカード番号を用いてカード決済を行う。
住所、カード番号についてはログイン後に変更できる。
実装
面倒くさくなってきたのでいきなり答えを書く。
要するに、一箇所のデータベースに住所氏名年齢にカード番号を書いているからマズいわけだ。
ならどこに保存するか。答えはユーザの端末だ。
公開カギ方式とCookieを利用する。秘密カギはオンラインショッピングサーバに用意しておき、公開カギを各クライアントにCookieの形で配布する。
ユーザがオンラインショッピングに登録するとき、SSL な通信路でまず保護をかけてサーバの証明を行い、公開カギを配布。ユーザが入力したID(重複の恐れがないのでなんでもいい)、PASS、配送先(住所)、カード番号、有効期限、システム側で一意に作成した会員番号をJavaScriptを用いて公開カギで暗号化、Cookieに保存。
あ、これじゃXSSに弱いな。サーバ側にいちど送って暗号化したあとCookieにセットするか。これなら暗号化のためのキーも知られずに済むからXSSで配送先を書き換えられるとかも避けられそうだ。
ログイン操作は、SSL保護下においてIDとPASSとCookieをサーバに送り、サーバ側でCookieの内容を復号して照合、適合すれば会員番号を活性化。セッション管理を行う。
以後は通常のオンラインショッピングと大差ない。配送先やカード番号を表示する場合には、Cookieの中身を復号することになる。
お客さまが登録情報を更新する場合は、Cookieの中身を更新する。地域が変わった場合にはサーバ側で会員番号に紐付く地域を変更する。
サーバ側でマーケティングに使うデータは、会員番号に紐付けた地域と年齢と性別。このセットなら漏洩しても個人と紐付けることができないため、個人のプライバシーは守られる(=個人情報ではなくなる)。
個人のポイントや購買履歴は会員番号で管理を行い、Cookieの個人情報は会員番号で紐付く。
このスタイルなら、こういった感じで全て実現できる。
- 顧客サービス
- 登録済みのお客さまはログインすれば自宅住所やカード番号などの入力を省略できる。
(Cookieの情報をベースに省略できるようになる。)
-
- ショッピングカートなどにより、手軽に商品の選択と決済ができる。
(従来のシステムがそのまま使える)
-
- お客さまの購買履歴に基いて、お勧め商品を表示できる。
(会員番号ベースで購買履歴を管理できる)
-
- お客さま個人の会員ポイントなど、優待サービスを提供できる。
(会員番号ベースでポイントなどを管理できる)
(会員番号ベースでマーケティングデータを得られる)
問題点
いくつかの問題点がある。
まず、別のパソコンからはログインできない。この場合、出先では買い物ができない、ということになる。サービスの形態として、「パソコンにあなた専用オンラインショップを持ってくる」といったイメージが作れれば、そういうものだというコンセンサスが得られるかも。
Cookieに保存するため、情報が消える可能性がある。この場合、再度セットアップしてもらうことになるが会員ポイントなどが失われる。合言葉やパスフレーズなどで会員番号を再紐付けできる仕組みが必要かもしれない。
メールアドレスも持ちたくないので、ログインできなくなったときの対処は難しい。
注意点もいくつかある。
Cookieは高度に暗号化しなければならない。生データだとセッションハイジャック狙いで持ち出されたときに無残なことになる。そのため、公開カギ方式が望ましいと判断した。これならCookieの解読も困難だし、パスワード強度に依存するものの簡単にはログインできないはずだ。CSRF対策が充分なら、ついでにセッションハイジャックにも耐性がついているはずなので(セッションパラメータの二重化によって強制的な画面遷移を防ぐと、セッションハイジャックしてから飛び込むことが難しい)
また、Cookie には Secure 属性をつけた上で、SSL の徹底が必要。フィッシングに弱いという点は従来とかわらない。
Cookieの容量には上限があるため、扱える情報量が少ない。
一般的なセッションハイジャックやXSS、CSRFなどの対策は必要。
決済時に取得したカード番号は決済確定後に破棄する必要がある。でなければカード番号の漏洩を防げない。
メリット。
情報の大部分をクライアントに持たせるため、万が一情報漏洩がおきてもダメージが最小限度(せいぜいマーケティングデータの漏洩で、お客さまにはダメージを与えずに済む)に抑えられる。
「個人情報は収集いたしません」と公言できる。
てな感じ
持ってないものは盗まれない、ってことで個人情報を持たないでショッピングサイトする方法を考えてみた。
五分のライトニングトークネタにはちょうどよかったかもしれないけど、質疑応答で泣かされそうだったからな(笑