Cookieとセッション — サーバーはどうやって「あなた」を覚えるか
HTTPは、1回のやりとりが終わると相手をきれいさっぱり忘れるステートレス(状態を持たない)な仕組みです。だからログインした次の瞬間、ふつうにリクエストを送ると、サーバーは「あなた、誰でしたっけ?」となります。では、なぜ実際のサイトはログイン状態を覚えていられるのか —— その正体がCookieとセッションです。
仕組みはシンプル。ログインするとサーバーは整理番号(セッションID)を発行し、Set-Cookieでブラウザに渡します。ブラウザは以後のリクエストに毎回その番号を添えて送り、サーバーは手元の台帳と照合して「ああ、田中さんですね」と思い出す。下の図1で、ログインしてからリクエストを送ってみてください。Cookieを添える/外すで、覚えてもらえるかどうかが切り替わります。
覚えているのはブラウザではなく、サーバーの台帳
勘違いしやすいのですが、Cookieに入っているのは整理番号だけで、「田中」という中身そのものではありません。本人情報はサーバーのセッション台帳に保管され、Cookieはそれを引き当てる引換券にすぎません。だから図1でサーバーでログアウトすると、ブラウザに券(Cookie)が残っていても、台帳から消えているので「無効な番号」として扱われます。
逆にCookieを削除すれば、券を自分で捨てたのと同じ。台帳には残っていても、もう番号を提示できないので名乗れません。そして「Cookieを添付する」を外して送ると、毎回はじめましての他人として扱われる —— これがステートレスの素の姿です。この引換券が漏れると他人になりすまされるため、本物のサイトでは推測されにくい長い番号を使い、HttpOnlyなどでCookieを守ります。
- ステートレス
- HTTPは1回ごとに完結し、前回の相手を覚えていない。だから印が要る。
- セッションID
- サーバーが発行する整理番号。中身ではなく、台帳を引くための鍵。
- Set-Cookie / Cookie
- サーバーが番号を渡すヘッダーと、ブラウザが毎回それを返すヘッダー。
- セッション台帳
- 番号と本人情報の対応表。本体はサーバー側にある。
まとめ
Cookieとセッションは、「忘れっぽいHTTPに記憶を持たせる」ための定番の合わせ技です。サーバーが整理番号を発行し(Set-Cookie)、ブラウザが毎回それを提示し(Cookie)、サーバーが台帳で本人を引き当てる。覚えているのはサーバーの台帳、Cookieはただの引換券 —— この役割分担が腑に落ちれば、ログインの裏側でいつも起きていることが見えてきます。