cookie(クッキー)、session(セッション)、あとついでにDB

どうした

Webエンジニアとしてクソなのでcookieとsessionの使い分け方がよくわかんない
調べた

概念としての(webでいうところの)session

WWWサービスで使用されるHTTPでは、request(リクエスト)単位で処理が行われる。
sessionは、ユーザがwebサービスの利用を開始してから終了するまで(これは初回アクセスからブラウザを閉じるまでであったり、ログインしてからログアウトするまでであったり)の複数のrequestをまとめた単位であるように見える。
見えると書いたのは、ブラウザやwebサービスによってsessionの定義は異なるようだから。
sessionの管理(同一session単位内のrequestであることの特定・データの持ち越し)は、cookieを用いたクライアント側に保存する方法と、cookieではsession名とsession識別子を扱いサーバ側のsession管理機能を使用する方法がある。(その他にもやり方はある)
このサーバ側でsessionのデータを管理する方を単に「session」と呼んだりするときもあるので、私にはよくわからなかった。

cookie(クッキー)

クライアント側(ブラウザなど)に保存されるデータ。
基本的にrequest headerにのせてサーバへ送信され。response headerにのせてクライアント側に送信される。
その有効期限の指定の有無によって、取扱いを変えるブラウザがある。IEはPersistent cookiesとPer-session cookiesの二種類で扱う。
有効期限が指定されているPersistent cookiesはファイルで保存し、指定のないPer-session cookiesはメモリ上で管理しブラウザを閉じると消えてしまう。
この有効期限の指定のないcookieを、セッションクッキーと呼ぶ人もたまにいる。IEでのCookie設定のところや、firebugでもこのクッキーをセッションクッキーと呼ぶ箇所がある。
ただ、Cookie関係のRFCでは特にそういう呼び方はしていないことや、PHPではsession idを保持しているクッキーをセッションクッキーと呼ぶので、文脈に注意すること。

性質

cookieを使用することで、requestに以前のrequestで得られたデータをのせることができるため、requestとsession単位を紐付けることができる。
ブラウザ側ではブラウザを閉じるまで、サーバ側ではsession idが破棄されるまでなど、クライアント側でいうsession単位と、サーバ側でいうsession単位の考え方が異なることに注意。
最終アクセス日時を表示したり、掲示板のユーザ名を保存しておく軽い感じの使い方(消えてもいいし、ユーザで改変してもサービス側に不利益がない)
後述するサーバ側の機能としてのsessionは、クライアント側からsession idを貰う必要があるため、session idの保存は主にこのcookieで行われる。(サービス内のリンクのURLのパラメータなどにも入れることも可能だが、さらに容易に改変できる上URLが長くなるのでcookie使わない縛りでもない限りやらない)(WebStorageで保存している例はあるのだろうか)

session(セッション)

ここではサーバのsession管理機能について書く。
概念としてのsessionを取り扱うために、cookieを使用
サーバ側に保存されるデータであり、メモリ上に置かれたりmemcacheやredisなどに置かれたりする。
基本的には発行したsession idをクライアント側のcookieにのせ、以降はrequest headerにのっているsession idからクライアントを判別し、そのrequestとsession単位を紐付けることができる。

使い分け

cookies

何度も入力する必要はあるが、サーバ側の機能には大して影響のないもの(掲示板のユーザ名など)
ログインなどの機能のあるサービスのsession id

session

最悪失っても許容できるが、普段はサーバ側のsession単位で保持しておきたいデータを保存する
ログイン状態など、改変が容易であるとセキュリティ対策コストが跳ね上がるもの
cookieの最大長を超えるもの(Amazonのカートはsessionで管理しているように見えるが、)

DB

不意のサーバダウンなどが起きても、永続的に利用したいデータを保存する
ユーザ情報、商品情報など

気になったこと

third party cookie

session id の保管場所(歴史がありそう)

webstorageの使い所

広告を非表示にする