WEBサイトがリダイレクトされたときの動きを考えてみた。

WEBサイトを引越しするときに、旧サイトにアクセスしてきたユーザーを新サイトにリダイレクトする設定をWEBサーバーに行います。Apacheの場合は、httpd.conf に以下のような設定をします。

そうするとリダイレクトが行われるのですが、見かけ上はサーバー側で転送してくれているように見えます。旧サイトがサイトAで、新サイトがサイトBの場合です。

このリダイレクトの動きをHTTP通信で考えてみました。実際のHTTPでのやりとりは見かけとは違って、以下のようになります。

この①〜④について、書いてみようと思います。

[広告]

■①旧サイトにアクセスする。

ブラウザがHTTPでサイトAにアクセスします。

GET /indexA.html HTTP/1.1

■②旧サイトからブラウザに結果が戻される。

サイトAからのブラウザへのレスポンスですが、ステータスコードは300番台のコードとなります。300番台はブラウザにリダイレクトを知らせるコードとなります。サイトの引っ越しの場合は恒久的な転送を意味するリダイレクト(ステータスコードは301)を返すようにサイトAのApacheに設定します。HTTPヘッダーには「location」が付与され、転送先URL(サイトBのURL)が設定されます。

HTTP/1.1 301 Moved Permanently
location:(サイトBのURL)

■③新サイトにアクセスする。

ブラウザは「location」で指定されたURLにアクセスを行います。サーバー側でリダイレクトしているように見えるのですが、実際はブラウザが転送先にリダイレクトしています。

GET /indexB.html HTTP/1.1
Referer:(サイトAのURL)

■④新サイトからブラウザに結果が戻される。

サイトBからHTMLで結果が返されてブラウザが画面表示します。

HTTP/1.1 200 OK

以上。

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で暗号化されているのでキャプチャしても中身が読めません。ですので、この記事は推定で書いています。。