今回はセッション、クッキー、キャッシュの違いについてです。
WEBシステムを開発していると、必ず耳にするキーワードだと思います。
そしてこれらを上手に使いシステムを構築するのですが、間違うとセキュリティ上の重大な問題に発展することもあります。
恥ずかしい話ですが、これらがどういったもので、どういう目的で使われるか忘れることが多々あるため自分の備忘録も兼ねております。
「エンジニア10年以上もやっててそんなこともw」とバカにされそうですが、言い返す言葉はありません(笑)
HTTP通信について
通常WEBブラウザでWEBサイトを閲覧する場合にはHTTPという通信手段を用いてサーバーとクライアント間を通信します。
そのHTTP通信は、HTML文書の通信を目的に作られており、1つのURLに対し同じページを返すことしか出来ません。(これを静的と言います。)
しかし、ショッピングサイトのカートや、ログインしたら見れるようなサイトなどは、ユーザーの状態によって表示する内容が変わります。(これを動的と言います。)
こういったHTTPの弱点とも言える部分を解決したものがクッキーやセッションです。
クッキーやセッションは状態を持ちまわることで、何度画面遷移をしても、数日後にサイトを再度開いても、現在の状態の操作が行えるようになります。
ではクッキーとセッションは何が違うのか?また、キャッシュは同様のものなのか?
クッキー(HTTP cookie)とは
HTTP cookie(エイチティーティーピークッキー、単にクッキーとも表記される)は、RFC 6265などで定義されたHTTPにおけるウェブサーバとウェブブラウザ間で状態を管理する通信プロトコル、またそこで用いられるウェブブラウザに保存された情報のことを指す。ユーザ識別やセッション管理を実現する目的などに利用される。
引用:Wiki
クッキーはブラウザに保存されるWEBデータです。
よく耳にする用途は、FacebookやTwitterなどのSNSを使っているときに、1度ログインすれば次回開いたときにログイン処理をせずにログイン出来るものです。
ブラウザのクッキー情報を削除するとSNSのログインもし直しになるのは、ブラウザ上に保存されたデータが無くログイン出来なくなるためです。
クッキーはクライアント側のパソコンに保存されるため、悪意のあるユーザーから不正に覗き見られる可能性があります。(自分のクッキーは自由に見てもらって構わないです)
もちろん、不正アクセス禁止法でやってはいけないことにはなっており逮捕されますが、悪意のあるユーザーはそれでも覗き見てこようとしてきます。
セキュリティソフトを入れてあなたのパソコンはしっかり守ってください。
エンジニア目線で言うと、例えばログインして使う会員制のサイトを作った場合に、ログイン情報などはクッキーに保存してはいけません。
SNSが再度ログイン出来るようになるのはクッキーのお陰と説明しましたが、この場合はログイン出来た事実だけをクッキーに保存することでログイン情報を盗まれることを防げます。
クッキーには有効期限が設定出来るため、しっかり期限を設定して対応しましょう。
お金が絡む銀行のシステムなどの場合にはクッキーに保存することはやめるか、数分で有効期限が切れるように設定しましょう。
他にはGoogleやYahooなどの広告にも使われます。
一度クリックしたバナー項目が何度も表示されるといったことはありませんか?
それは、GoogleやYahooが”広告をクリックした事実”をクッキーに保存し、再度表示したり、興味のあるジャンルなどを解析したりするのに使われます。
余談ですが、クッキーとビスケットの違いは手作り感があるかどうからしいです。
セッションとは
システム開発を行う人の中では、クッキーとセッションの使い分けが一番悩ましいところではないでしょうか。
セッション【session】 ➀コンピューターで、ログインからログアウトまでの一連の操作。 コンピューターネットワークにおいては、コンピューター、サーバー、通信機器などの間で、接続が開始されてから終了するまでの一連の通信。 いずれも単位としての意味があり、一連の行為を1セッションと数える。
引用:コトバンク
このようにセッションとは、一連の操作のことをさします。
Googleアナリティクスを見ていてもセッションという言葉があります。あれは、サイトを訪れて色々なページを見て離脱するまでの操作を総合して1セッションとカウントしています。
クッキー同様にセッションにも有効期限がありますが、クッキーのように期限が切れるまでというより、一連の操作の中で持ちまわるデータがセッションデータになります。
セッションはブラウザでIDのみ管理されており、IDをサーバーに渡すことで一時的に保存されたデータを呼び出すことが出来ます。
セッションIDはクッキーで管理されています。しかし、セッションIDだけ持っていてもサーバーに投げないと中身のデータは取得出来ないためセキュリティは高めです。
僕のスキルでは分からないですが、頭の良い悪質なユーザーはセッションIDから個人情報を抜き出そうと(もちろん犯罪)してきます。
なので有効期限を365日にしたりとかはやめた方がよいです。
ログインの例で言えば、ログインIDだけセッションで管理して、ログインしているかどうかはクッキーで管理するのが良いかと思います。
ユーザー名などユーザーに紐づく情報はセッションのユーザーIDから取得すれば良いです。
セキュリティを高めるなら、ログイン時のIPアドレスをセッションに格納し、ログイン情報を取得する際にユーザーのIPアドレスをチェックすれば尚良いと思います。
キャッシュとは
キャッシュだけちょっと用途が変わります。
キャッシュは画像やHTMLのデータなどをクライアント(インターネットを閲覧する人)側のブラウザに保存することにより表示速度を向上させるものです。
同じページを何度も開いた場合に、同じ画像やHTML,CSS,javascriptなどのデータを何度もダウンロードする必要は無いため、ブラウザに自動的に保存されるというものです。
なので、使うユーザーはクライアントということになります。
エンジニア側としては、意図的にキャッシュを書き込むことも出来ますが、ほぼそんなことはする必要が無いでしょう。
プログラムを修正してもキャッシュが残ってブラウザ上に反映されないことも多々あります。そんなときは「Ctrl + F5」でキャッシュごと更新しましょう。
まとめ
クッキーはクライアントのパソコン(WEBブラウザ)でデータを管理しており、有効期限が切れるまで保持している。
セッションは「ログインしてからログアウトまで」のような一連の操作を言い、セッションデータはサーバー側に保持される。
キャッシュは動的ページを実現するためのものでは無く、画面表示の高速化が目的に画像やHTMLデータをブラウザに保持する。
コメントを残す