セッションとクッキーについての違いを整理しておこうと思います。
Contents
そもそものHTTPプロトコルについて
そもそもHTTPプロトコルは一回、一回の通信で相手の状態を覚えていません。
極端にいうと1リクエストのたびに新しい情報がクライアントからサーバーに送られ、サーバーはレスポンスを返します。
この方法をステートレスなどといいます。どういうことかというとこのリンクのファーストフード店のようになります。
リアル社会でこんなことはありませんが、クライアントとサーバーの世界ではこの方法に大きなメリットがあります。
わかりやすい・・・というかこの方の本は以前よませていただきました
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
http://amzn.asia/75abCMO
ステートフルな状態を実現するために
この方法にはメリットもありますが、デメリットもあります。
例えばこの方法をずっととっているとログインして行う機能は基本的にすべて無理になりますし、買い物もできません。※情報が保存できないので。
このような状態(ステートフル)を実現するために、新たな仕組みが必要です。
方法1 クライアント側で情報を保持しておく
あまり好ましい方法ではないですが、クライアント側に情報を保存していくという方法があり、ステートフルな状態を実現したい場合はサーバーにその情報を渡します。
この方法がクッキー(Cookie)です。
好ましくないというのはクライアント側に機密性の高い情報を保存しておくことにより改ざんされたり、漏洩する可能性があるためです。
具体的には下記のような問題点があります。
- データの確認や、変更が比較的簡単(セッションはこれらができません。)
- XSSやヘッダインジェクションなどJavaScript側で読み取られるリスクがある。
- サイズの制限あり
逆にメリットとしては下記のようなメリットが挙げられます。
- 寿命の制御が用意
- ドメインが同じであれば異なるサーバーのやりとりが可能
そこでクライアントの情報をサーバー側で保存しておくような仕組みが必要になってきます。それがセッションになります。
方法2 サーバー側で情報を保存しIDだけクライアントに覚えておいてもらう
セキュリティ的な観点からクライアントではなくサーバー側に情報を保存しておくということが考えだされました。それがセッションです。
キーと値のペアをサーバーに保存しておき、だれのものかを識別するためにクライアントにはIDを発行します。これがセッションIDといわれるものです。
セッションIDの管理の仕方
セッションIDの管理の方法もいろいろあります。
一般的には次のような方法がとられます。
- hiddenに入れておく
- GET形式で渡す(非推奨です)
- Cookieで保存しておく
混乱しやすい原因としてはこのIDの管理の仕方にCookieが使われることがあります。セッションとクッキーってどっちかじゃないの?みたいな。
要点をまとめると下記のような感じでしょうか。
- セッションはサーバーでデータを保存、クッキーはクライアントでデータを保存
- セッションの場合IDを発行する必要がある
- ID管理には複数の方法があり、その一つにクッキーが使われることがある
セッションの具体的な仕組み
(※主にCakePHPでこの問題が発生しているので対処法)
- リクエスト時に、CookieとSessionが作成される。
- Cookieは作成された時を基準にして一定の時間を有効期限として持つ。CakePHPの場合、Session.timeoutが有効時間となる
- Sessionは最終更新日時よりgc_maxlifetime の時間分保存される。
- アクセスするたびに、有効期限がきれたものは特定の計算式による確率で削除される。
- たとえセッションが残っていてもCookieのtimeoutがあるため最終的に削除される。
- Cookieの有効期限を延長したい場合、CakePHPでautoRegenerateを有効にする必要がある。
CakePHPのセッションタイムアウトの指定はSession.timeoutだけではダメだった
※この場合のcookieはパスワードの保存などに使われるクッキーとは違い、ブラウザを落としたら切れてしまうCookieについて述べています。
SessionCookieとPersistentCookieについて
あまり推奨される技ではないですが、ログイン情報の保存に関してブラウザ側でユーザーIDとパスワードを保存して起き、セッションが切れたらクッキーから読み込むという手もあります。