「ログイン状態を保つには、クッキーとセッション、どちらを使えばいいですか」
こんな質問を受けたことがあります。この聞き方には、小さなずれがあります。クッキーとセッションは、二者択一の選択肢ではないからです。多くのWebサービスでは、この2つはセットで動いています。
混同が起きる理由は単純です。セッションを特定するための番号が、クッキーという入れ物に載って運ばれているからです。
クッキーは「客が持ち帰るカード」、セッションは「店が滞在中だけつける記録」。
この一言を起点に、それぞれの役割を見ていきます。
クッキーは「会員カード」——客が持ち歩く
クッキーを一言でたとえるなら、飲食店が渡す会員カードです。
会員カードは店が客に渡し、客が財布に入れて持ち帰るものです。次の来店時、店員はそのカードを見て「前にも来た客だ」とわかります。カードに何を書き込むかは店側が決めます。ポイント数だけのこともあれば、会員番号だけのこともあります。
クッキーの仕組みも同じです。
- サーバーがブラウザへ小さなデータを渡す
- ブラウザはそれを保存し、次のアクセス時に同じサーバーへ返す
- サーバーは受け取った内容を見て、相手を判断する
有効期限も店(サーバー)側が決められます。「次回来店まで」でも「1年間」でも、自由に設定できます。
クッキーの欠点——客に持たせている以上、中身が見える
会員カードは客の財布の中にあるので、客自身がカードの中身を確認できます。クッキーも同じで、ブラウザ側に保存されている以上、利用者や、その端末を触れる人であれば中身を見られます。
パスワードのような重要な秘密そのものをクッキーに書き込むのは、筋が悪いやり方です。書き込むのは、あくまで「本人を思い出すための手がかり」までにとどめておきます。
セッションは「本日の伝票」——店が滞在中だけつける
セッションを一言でたとえるなら、店側が客の滞在中だけつける伝票です。
客が来店すると、店員はその客専用の伝票を起こします。伝票には注文内容や会計状況が書き込まれますが、これは店の中にあるもので、客が持ち帰るものではありません。会計が終われば、伝票は役目を終えて処分されます。
セッションの仕組みも同じです。
- サーバー側が、アクセスしてきた相手用の記録を一時的に作る
- ログイン状態やカートの中身など、やり取りの間だけ必要な情報をそこに置く
- 一定時間操作がなければ、記録を破棄する
伝票そのものは店の外に出ないため、客が中身を書き換えることはできません。パスワードよりも重要な、進行中の状態を置いておける場所です。
セッションの欠点——伝票と客を結ぶ仕組みが要る
伝票は店の中にあるだけでは意味を持ちません。どの伝票がどの客のものか、店員が見分けられて初めて機能します。
ここでクッキーが登場します。サーバーは伝票(セッション)に番号を振り、その番号だけをクッキーとして客に持たせます。客が次にアクセスしてきたとき、クッキーに書かれた番号を見て「この番号の伝票の続きだ」と判断する仕組みです。
クッキーは「伝票の番号を運ぶ係」であり、セッションそのものではありません。この役割分担を知らないと、「クッキーを消したらログアウトされた」という現象を、クッキーの中にログイン情報が全部入っていたかのように誤解してしまいます。実際に消えたのは番号だけです。伝票(セッション)の中身はサーバー側に残っているか、番号を失って二度と辿り着けなくなっただけです。
比較表
| 特徴 | クッキー | セッション |
|---|---|---|
| データの置き場所 | ブラウザ(クライアント側) | サーバー側 |
| 客から見た中身 | 見える・書き換えられる | 見えない |
| 保存に向く情報 | 手がかり程度の軽い情報 | ログイン状態など重要な進行中データ |
| 消えるタイミング | 有効期限、または客が削除 | サーバーが破棄、または時間切れ |
| 単体で機能するか | する(用途は自由) | 番号を運ぶクッキーとセットで使うことが多い |
どう使い分けるか
実務でこの2つを「どちらを使うか」で迷う必要はありません。役割が違うからです。
判断が要るのは1点だけです。「このデータは客に見られてよいか、書き換えられて困るか」。
- 見られても困らない設定情報(表示言語、直近の検索条件など)→ クッキーに直接置いてよい
- ログイン状態、権限、カートの金額など、書き換えられると困る情報 → セッションに置き、クッキーには番号だけを持たせる
迷ったら後者を選んでおくのが安全です。重要な情報をクッキーへ直接書き込むと、客の端末を経由して書き換えられる余地を残すことになります。
「クッキーで認証している」と説明される実装の多くも、中身はセッションIDをクッキーで運んでいるだけです。この番号1つにログイン状態を預けている自覚を持って設計すると、事故は減ります。