skillup

技術ブログ

サーバー・ネットワーク

セッションとクッキーについて

投稿日:2017年1月17日 更新日:

セッションとクッキーについての違いを整理しておこうと思います。

そもそものHTTPプロトコルについて

そもそもHTTPプロトコルは一回、一回の通信で相手の状態を覚えていません。

極端にいうと1リクエストのたびに新しい情報がクライアントからサーバーに送られ、サーバーはレスポンスを返します。

この方法をステートレスなどといいます。どういうことかというとこのリンクのファーストフード店のようになります。

リアル社会でこんなことはありませんが、クライアントとサーバーの世界ではこの方法に大きなメリットがあります。

http://yohei-y.blogspot.jp/2007/10/blog-post.html

わかりやすい・・・というかこの方の本は以前よませていただきました

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で保存しておく

https://www.ipa.go.jp/security/awareness/administrator/secure-web/chap6/6_session-2.html

混乱しやすい原因としてはこのIDの管理の仕方にCookieが使われることがあります。セッションとクッキーってどっちかじゃないの?みたいな。

要点をまとめると下記のような感じでしょうか。

  • セッションはサーバーでデータを保存、クッキーはクライアントでデータを保存
  • セッションの場合IDを発行する必要がある
  • ID管理には複数の方法があり、その一つにクッキーが使われることがある

セッションの具体的な仕組み

(※主にCakePHPでこの問題が発生しているので対処法)

  1. リクエスト時に、CookieとSessionが作成される。
  2. Cookieは作成された時を基準にして一定の時間を有効期限として持つ。CakePHPの場合、Session.timeoutが有効時間となる
  3. Sessionは最終更新日時よりgc_maxlifetime の時間分保存される。
  4. アクセスするたびに、有効期限がきれたものは特定の計算式による確率で削除される。
  5. たとえセッションが残っていてもCookieのtimeoutがあるため最終的に削除される。
  6. Cookieの有効期限を延長したい場合、CakePHPでautoRegenerateを有効にする必要がある。

https://inoccu.com/blog/2012/11/21/223145.html

https://blog.euonymus.info/cakephp%E3%81%AE%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%9C%9F%E9%99%90%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

※この場合のcookieはパスワードの保存などに使われるクッキーとは違い、ブラウザを落としたら切れてしまうCookieについて述べています。

SessionCookieとPersistentCookieについて

http://news.im-dmp.net/technology/9445

あまり推奨される技ではないですが、ログイン情報の保存に関してブラウザ側でユーザーIDとパスワードを保存して起き、セッションが切れたらクッキーから読み込むという手もあります。

その他参考リンク

http://qiita.com/mogulla3/items/189c99c87a0fc827520e

http://monolog.spanstyle.com/2005/07/session.html

http://blog.takanabe.tokyo/2014/12/05/64/

http://tooljp.com/jyosho/docs/cookie-and-session-cookie/cookie-and-session-cookie.html

http://thk.kanzae.net/net/itc/t4082/

-サーバー・ネットワーク
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

pythonのアップグレードに関して

pythonのアップグレードに関して。 python2.6だとpipがインストールされていないのですが、入れようとしてハマったのでメモ。 一般的なインストール方法ですが、下記のようになります。 [cr …

no image

シェルスクリプトテキストファイルから配列&プロセス監視シェル

またまたシェルスクリプトネタなどを。 今回はtxtファイルの文字列を読み込んで配列に入れる処理ですね。 例えば aaa bbb ccc こんな文字列がテキストファイルに格納されていたとして、これを配列 …

no image

pidファイルに関して

サーバー上であるサービスを動いている(と思っている)時にstopしようとしたらpidファイルがありませんと怒られました。 pidファイルってよく聞くけどわかっていなかったのでこれを機にメモ。 Linu …

no image

大規模Webサービス技術入門 イントロ

一応WEBサービスを日々改修していますが、データが日々ふえ、大規模なサービスの対処法などを勉強する必要があるため、「大規模サービス技術入門」を少しずつ読んでいこうと思います。 ポイント データはディス …

no image

CentOS7の基本に関して

以前も学習しようとしましたが、CentOSの基礎について。 Contents1 デーモン2 ポートの割り当て3 systemdの役割 デーモン Linux上で動くサービスを提供をするプログラムのこと。 …