Amazonアソシエイト(アフィリエイト)の広告をクリックしたときの動きを考えてみた。

Amazonアソシエイトの広告がクリックされたときの動きを考えてみました。サイトを見ている人が広告をクリックして商品を購入したら、紹介料として数パーセントの手数料がもらえる仕組みです。Amazonのサイトが表示されるまでを絵で書くと以下のようになるかと思います。

①.顧客がサイトにアクセスする(リクエスト)。
②.ブラウザに結果が表示される(レスポンス)。
③.顧客が画面上の広告をクリックする。
④.Amazonのサイトにアクセスする(リクエスト)。
⑤.ブラウザに結果が表示される(レスポンス)。

これをHTTP通信を踏まえて考えてみました。①から⑤の順で書いてみます。

顧客がAmazonのサイトにまだログインしていないとき

■①顧客がサイトにアクセスする。

ブラウザがHTTPで自分のサイトにアクセスします。HTTPのリクエスト行には GET メソッドを使います。

GET /index.html HTTP/1.1

■②ブラウザに結果が表示される。

自分のサイトから画面表示のHTMLがブラウザに返されます。HTTPのステータス行は「200 OK」です。

HTTP/1.1 200 OK

■③顧客が画面上の広告をクリックする。

Amazonアソシエイトでは、Amazonアソシエイトプログラムにサインインして広告のHTMLコードを取得します。取得したHTMLコードを自分のサイトに貼り付けます。このHTMLコードの中にはアソシエイトIDが埋め込まれており顧客がAmazonの広告をクリック際に、ブラウザはアソシエイトIDをAmazonのサイトに送ります。以下はAmazonアソシエイトプログラムで広告のHTMLコードを取得したときのスナップショットです。

この広告を顧客がクリックします。

■④Amazonのサイトにアクセスする。

ブラウザは GET メソッドでAmazonのサイトにアクセスします。その際にクエリストリング(「?tag=xxx」のところ)を付与して連携します。xxxはアソシエイトIDが入ります。

GET /index.html?tag=xxx HTTP/1.1
Referer:(自分のサイトのURL)

※Amazonの場合、顧客が広告をクリックした時のリンク先URLは「https://www.amazon.co.jp/?tag=・・」となっているようです。

■⑤ブラウザに結果が表示される。

Amazonのサイトではリクエストを受付けセッションを新たに発行します。セッションはセッションIDで管理しています。Amazonのサイトからログイン画面表示のHTMLがブラウザに返されます。

HTTP/1.1 200 OK
Set-Cookie:(発行したセッションIDをクッキーに格納)

顧客はログインのアカウント/パスワードを入力し、再度、Amazonのサイトに情報を送ります。Amazonのサイトでは認証を行いOKであれば、そのセッションを有効にします。
※厳密に言うと、認証前のセッションIDと認証後のセッションIDはセキュリティを考慮すると別のものになっていると思います。認証前は仮のIDで認証後のセッションIDを本来のものとして使う。

これ以降、顧客がAmazonのサイトにアクセする際はブラウザがセッションIDをクッキーに設定して送信するようになります。AmazonのサイトではセッションIDとアソシエイトIDの紐付けを持ちます(ココが重要)

顧客がAmazonのサイトにログイン済みだったとき

■①〜③までは「顧客がAmazonのサイトにまだログインしていないとき」と同じです。

■④Amazonのサイトにアクセスする。

ログイン済みであるためブラウザは認証OKだった際に取得したセッションIDをすでに保持しています。そのためセッションIDをクッキーに設定してアクセスします。

GET /index.html?tag=xxx HTTP/1.1
Referer:(自分のサイトのURL)
Cookie:(認証OKの際にSet-Cookieで受け取ったセッションIDを格納)

■⑤ブラウザに結果が表示される。

AmazonのサイトではセッションIDで認証を行うため(ログイン画面表示のHTMLではなく)商品サイトのHTMLを返します。その際、クッキーの有効期限を延長しています。
※クッキーの有効期限を延長する際にセッションIDを使いまわしているか、新たなセッションIDを発行しているか、どちらかかと思います。

HTTP/1.1 200 OK
Set-Cookie:(セッションIDを格納、クッキーの有効期限を延長)

なおAmazonアソシエイトの場合、クッキーの有効期限は24時間です(再訪問期間と言われているものです)。

顧客が商品を購入したら?

顧客はAmazonの商品サイトを見ていて気に入った商品があれば購入します。ブラウザはカートに入れられた商品をHTTPの POST メソッドでAmazonのサイトに送ります。その際のリクエストは以下となります。

POST ・・
Cookie:(セッションIDを格納)

ブラウザはセッションIDをクッキーに設定してAmazonのサイトにアクセスしています。クッキーが有効な間(再訪問期間の間)であれば、商品を購入したときのセッションIDに紐付くアソシエイトIDを持つ方に紹介料が支払われることになります。

なお、広告に掲示した商品が特定の本だったとして、顧客が購入した商品がその本でなくても(Amazonの商品サイトを見ていて他の商品を購入したとしても)、紹介料としての報酬は発生します。広告のHTMLコードにはアソシエイトIDとともに商品の情報も埋め込まれていると思うのですが(そもそも商品によって画像が違う)、Amazonのサイトに導いてくれた方には紹介料を渡しているようです。

顧客が他のサイトを踏んでしまったとき

以下の絵です。すでにAmazonのサイトにログイン済みで、(①)→(②)→③→④→⑤となった場合です。

ログイン済みのためブラウザはセッションIDをすでに保持しています。この状態で顧客が他のサイトのAmazonアソシエイトの広告をクリックすると、、

GET /index.html?tag=yyy HTTP/1.1
Referer:(他のサイトのURL)
Cookie:(認証OKの際にSet-Cookieで受け取ったセッションIDを格納)

HTTP/1.1 200 OK
Set-Cookie:(セッションIDを格納、クッキーの有効期限は延長)

というふうになります。AmazonのサイトではセッションIDで認証するため商品サイトを返しますが、リクエスト時のクエリストリングのアソシエイトIDが他のサイトの方のものになり(「?tag=yyy」のところ)、セッションIDに紐づくアソシエイトIDの書き換えが行われるものと思われます。つまり後で踏まれたサイトのほうが優先され顧客が商品を購入した場合は、そちら(他のサイト)に報酬が支払われることになります。

本当はこれらの動きはパケットキャッチャして確かめればよいのですが、AmazonのサイトはHTTPSで暗号化されているのでキャプチャしても中身が読めません。ですので、この記事は推定で書いています。。

ubuntuにWiresharkをインストールする。

ubuntu 18.04 LTS に Wireshark(Version 2.4.5) をインストールしてみました。そのときの気づきのメモです。Wireshark は「ubuntuソフトウェア」からインストールしました。

インストールの途中に「非特権ユーザ(root以外のユーザ)がパケットをキャプチャできるようにしますか?」と聞かれるのでチェックをつけておく。(チェックをつけておいたのだけど、root以外のユーザではダメみたい。後述。)

インストールが無事終わったので、Wiresharkを起動してみる。キャプチャできるインターフェースが表示されるので任意のインターフェースを選択し、上部のラベルから「キャプチャ」→「開始」を選び実行しました。が、「Couldn’t run /usr/bin/dumpcap in child process:許可がありません」のメッセージが出てしまい、起動に失敗。。

どうやら権限がない模様。調べてみると他の方も同様の問題にあたったようでいろいろとネット上には情報がありました。で、整理してみて、以下の対応で起動できるようになりました。

[広告]

まず、起動させるときのユーザ(ここでは「usr1」とします、各自の環境にあわせてください)のid情報を確認します。


$ id usr1
uid=1000(usr1) gid=1000(usr1) groups=1000(usr1),4(adm),・・・,126(sambashare)

次に、Wiresharkをインストールした際に「wireshark」のグループがOSに作成されていますので、それを確認します。

$ grep usr1 /etc/group
adm:x:4:syslog,usr1
usr1:x:1000:
 :
sambashare:x:126:usr1
wireshark:x:128:usr1 ← ココです。

Wiresharkを起動する権限がないため、usr1を「wireshark」のグループに追加します。

$ sudo usermod -aG wireshark usr1

このとき、usermodのオプションは「a」と「G」の両方が必要みたいです。はじめ「a」だけの指定で usermod を実行したらエラーとなってしまいました。ちなみに、usermod の使い方のメッセージは次のようになっていました。

  • -G, –groups GROUPS 新たな補助グループのリストを与える。
  • -a, –append ユーザを (-G で指定された) 補助グループ群GROUPS に追加する。他のグループからの削除は行わない。

再度、id情報を確認します。


$ id usr1
uid=1000(usr1) gid=1000(usr1) groups=1000(usr1),4(adm),・・・,126(sambashare),128(wireshark)

末尾に「128(wireshark)」のグループが追加されていることが確認できます。これで「wireshark」のグループに追加されました。改めてWiresharkを起動すると、今まで表示されていなかったインターフェースが表示され、上部のラベルから「キャプチャ」→「開始」でキャッチャできるようになりました。