エンジニアだけどブログを始めてみた

年末に向けて記事の整理します

セッションとクッキーの違い

WEBシステムを組むうえで何となく使っているsessionとcookieについて

自分でも違いについて理解できていないと思ったので調べてみました。

 

HTTPを意識する

セッション、プロトコルの違いを確認する前に、HTTPプロトコルについて確認が必要になると思う。

まず、HTTPプロトコルは状態を持たないということを最初に認識しておく。

HTTPプロトコルではリクエストを送りレスポンスを受け取った時点で、その通信は終了してしまう。

 

Google先生に 「セッション クッキー 違い」と検索したとする。

その後、もう一度「セッション クッキー 違い」と検索する。

 

動きとしては…

ユーザー側からGoogle先生に向けて「セッション クッキー 違い」をリクエストし、

Google先生は 「セッション クッキー 違い」に該当するレスポンスを返してくれる。

 

前者と後者でリクエストとレスポンスの動きに何ら違いはないけど

この同じ動作でも前者と後者は別の通信だと認識されることになる。

 

HTTPの問題点

さっきの様にリクエストごとに別の通信と認識されるというのは凄く困る。

どんな困ることがあるかというと

簡単な例を挙げると、ログイン画面でログインした後に、そのログイン情報を次の画面に引き継げないといった問題が出てくる。

この場合システム側で何らかの処理をとる必要が出てくる….面倒くさい。

 

session&cookieはそんな問題を解決してくれる。

 

本題 sessionとcookieとは?

とりあえず概念は大事。

まずはcookieの概念を確認する。

Cookieとは、Webサイトの提供者が、Webブラウザを通じて訪問者のコンピュータに一時的にデータを書き込んで保存させる仕組み。

CookieにはWebサイト(Webサーバ)側が指定したデータを保存しておくことができ、利用者の識別や属性に関する情報や、最後にサイトを訪れた日時などを記録しておくことが多い。ネットサービスなどのサイトで利用者のIDなどが保存されると、次にアクセスしたときに自動的に利用者の識別が行われ、前回の続きのようにサービスを受けることができる。                                                                                                                                    -IT用語辞典抜粋

…簡潔に纏めるとこんな感じ

  • HTTPヘッダーに格納できるテキストデータ。
  • このデータはクライアントのブラウザに保存される。

このcookieを利用すればブラウザに値が格納されているからHTTPプロトコルの値を保持できない問題は解決できる。

 

でもログイン情報をcookieに格納すれば….という訳にはいかない。

cookieは ”クライアント側に値を保存する” ←これ

クライアント側にあるということはクライアント側で変更が可能な訳で….少し知識のある人なら簡単に改竄出来てしまう。

この問題を解決するのがsessionになる。

セッションとは、活動期間、学期、会期、開催期間、集会などの意味を持つ英単語。コンピュータシステムやネットワーク通信において、接続/ログインしてから、切断/ログオフするまでの、一連の操作や通信のこと

-IT用語辞典抜粋 

ちょっと不足気味なので追加

  • クライアントとサーバーの通信状態をsessionと呼ぶよ
  • sessionにはIDを割り振って管理するね
  • 保持されたsessionが欲しいときはIDを指定して取り出してね

といった感じ。 

 

sessionを使えば値はサーバー側に保存されてるためクライアント側からでは操作できない。

これで安心。

ただ、sessionのIDをどうやってサーバーに送信するか という問題がある。

この問題の解決に先ほどのcookieにsessionのIDを持たせてしまう訳です。

 

cookieにsessionのIDを格納すれば…

サーバー側にsessionのIDを送信することが出来る

クライアント側はsessionのIDは改竄できても関連している中身はサーバーにあるからデータの改ざんは出来ない。

これで安全な通信が可能になる訳です。

 

まとめ

cookie

  • クライアント側に値を保存
  • データ改竄の可能性あり

 

session

  • サーバー側に保存
  • データ改竄の可能性は低い
  • 取り出すにはsessionID をサーバーに送信する必要あり

 

とりあえず機密情報はsessionに格納しておけば安全。

ただ、sessionも万能じゃないから、session使えば絶対に漏洩、改竄されないなんてことはない。

 

余談

一応sessionIDはcookie以外にもURLやフォームで飛ばしたりすることができる。

色々と問題があるのであるので採用されることはまず無いけど。