特集
» 2006年02月15日 16時00分 公開

インターネットサービスの新基準:「カゴに入れる」の背後には (1/2)

オンラインショッピングで見かけることの多い「カゴに入れる」の表示。欲しい商品の購入手続きに移る際クリックするが、ショッピングサイトで必須なこの手続きには奥深い理由が隠れている。

[大澤文孝,ITmedia]

 Amazonや楽天市場などのオンラインショッピングサイトを利用した経験があれば、商品購入時に「カゴに入れる」というボタン(アイコン)をクリックして、手続きへと進めるだろう。このボタンをクリックすると、背後では商品情報が一時的に記録される。これを実現しているのが、Webアプリケーションのセッション機能だ。セッション機能では、Cookieを使っており「どのユーザーのカゴ情報なのか」を識別し、他人のカゴ情報と混じらないよう管理しているのだ。

 オンライン・ムック「インターネットサービスの新規準」の今回は、何気なくクリックすることの多い「カゴに入れる」の背後にどのような仕組みがあるのかを探る。主に技術解説にフォーカスしているが、デベロッパーが実装ポリシーを理解することが目的だ。

Cookieからセッション管理へ

 Webブラウザ側で一時的にデータ保存する仕組みとして「Cookie」がある。

 Cookieは、「Set-Cookie」と「Cookie」というヘッダから構成されている。WebサーバがSet-Cookieヘッダを使ってデータ送信すると、該当データがユーザーのWebブラウザ側で保存される仕組みだ。そしてWebブラウザは、次に同じドメインのサイトにアクセスした場合、Webブラウザは該当データをWebサーバに向けてCookieヘッダを使って送信する(図1)。

図1■Cookieの仕組み

 図1に挙げた比較的単純な仕組みが、「カゴに入れた商品」や「ユーザーのログイン情報」などを保存するのに使われている。

 しかし現実的には、Cookieに直接データが格納されることはない。その理由は2つある。1つは、Cookie自体に最大4Kバイトという保存容量制限があることだ。もう1つは、データがユーザー側(ブラウザ側)に保存されてしまうという点だ。

 特に、後者はWebアプリケーションにとって、問題が大きい。第一に、ユーザーにデータを見られてしまう危険性がある。さらに、悪意あるユーザーがデータ改ざんをすることも考えられる。例えば、カゴに入れた商品をCookieに保存していた場合、悪意あるユーザーは商品価格を変更してしまうかもしれない。つまり、データを秘匿したい場合は保存を避けるべきなのだ。

 このような理由から、Cookieに直接データを保存することはまれだ。通常は、「Cookieを使ってユーザーごとに固有の番号を振って識別し、該当番号に割り当てられたメモリ領域をサーバ内に作る。そしてその領域にデータを保存する」という仕組みが使われる(図2)。

図2■サーバ上のメモリに値を保存する

 このように構成すれば、ユーザーは直接、保存されたデータを見ることができないので好都合だ。

 この仕組みは、多くのWebアプリケーションで必要になるため、幾つかのWebアプリケーションフレームワークでは、この機能を「セッション機能」として実装していることが多い。

 例えば、PHPやJSP/Servlet、ASPやASP.NETなどにはセッション機能があり、「Cookieの割り当て」と「サーバ側へのメモリ領域確保」が自動的に行われる。つまりデベロッパーは、Cookieやメモリ領域について考慮する必要がなく、セッションにデータ保存ができるようになっているのだ。

セッションタイムアウトが短いと使い勝手に影響、長いとメモリ圧迫に

 図2のようにサーバ上のメモリに値を保存すると、保存した値をユーザーに見せないようにすることが可能だ。しかし、幾つかの問題点が表面化してしまう。

 1つは「成りすまし」だ。図2に示したように、サーバ上のメモリ領域は、Cookieの値で特定ユーザーを区別している。つまり他人のCookieを提示すれば、成りすましができてしまう。そのため、Cookieとして送信するデータは、ランダムで予想できないものを使わなければならない。安易に連番を使ったりすると、成りすましが横行する可能性が高い。

 「他人のデータが見えてしまった」という事故がニュース報道されることがあるが、これは何らかの不具合で、他人のCookieが提示された、もしくは、サーバ上のメモリ領域がずれたという現象が起きたに違いない。

 もう1つの問題は、上記のセッション情報を保持したメモリ空間をいつ解放するか? という点だ。例えば「カゴに商品を入れたまま、立ち去ってしまった」ユーザーが集中すると、サーバのメモリ容量がどんどん減っていく。通常は、購入手続きが完了した時点でメモリ解放しているからだ。

 この問題を解決するため、多くのWebアプリケーションでは、「一定時間アクセスがなかったら、サーバ上のメモリを破棄する」という処理をしている。これが「セッションのタイムアウト」だ。

 ただしセッションのタイムアウトを短くしすぎると、ユーザーの操作中に購入情報が破棄されてしまう可能性もある。例えばセッションのタイムアウトが30分であった場合、ユーザーが30分以上、何も操作しなければカゴに保存した商品情報は失われ、最初からやり直す必要がある。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ