前提知識
前提として、Webサービスがサーバーとクライアントの二つによって成り立っていることを知っている必要があります。
過去の記事にてまとめていますので、もし知らない方は先にこちらを読んでみてください。
サーバーとは?Webサイトが見られる仕組み【Web開発入門】
結論
「ログインする」とは、
「cookieなどのクライアントのブラウザ内の記憶領域に、サーバー内の記録領域であるセッションファイルに格納されるセッションIDを格納する」
ことです。
...と言われてもなんのこっちゃと思いますので、一つずつ解説していきます。
リクエスト・レスポンスの特性
例えば、あなたの好きなアイドルの会員制サイトがあるとします(ファンクラブ的な感じです。加入したことがないのでよくわかりませんが)。
センターのA君の最近のオフショットを会員限定で見ることができるとします。
あなたは、その画像を「見せてください」と会員制サイトのサーバーに対してリクエストをします。
サーバーはそれに応じて、「はいどうぞ、こちらです」とレスポンスを返します。
ところが、非会員は見ることができないようにしたいので、リクエストの時にIDとパスワードを入力してその情報も一緒にサーバーへ送信する必要があります。
さらに今度は、B君のオフショットも見たくなったので、またリクエストを送信しようとしました。
当然これも会員限定のコンテンツなのでID・パスワードを送信する必要があります。
そうです。
リクエストのたびに毎回、IDとパスワードという認証情報が必要です。
なぜなら、サーバーはリクエストのたびにクライアントのことを忘れてしまうからです(これを、ステートレスと言ったりします)。
よくある例えが、病院と患者です。
人気のある病院には毎日たくさんの患者さんが来るので、受付の人はそのすべてを記憶できません。
ましてや、その人の病歴や薬歴などもってのほかです。
そのため、
「俺だよ、俺。2か月前に痔でお世話になった、俺。薬追加してくれなーかな」
と言われても困ってしまいますよね。
そこで、診察券というものを発行して、次回以降の来院でその人及びその人の治療履歴を把握するわけです。
cookieとセッション
その、いわば「診察券」の役割を果たすのが、cookieとセッションです。
セッション
セッション(セッションファイル)は、サーバー内の記憶領域に作られるもので、ユーザーの情報が保持されています。
病院の例になぞられるなら、患者さんのデータが記録されているカルテなどですかね。
具体的には、セッションIDと呼ばれるものを発行し、それをレスポンスの際に一緒にクライアントへ送ることで、
「次回以降、会員と分かるようにセッションIDをもってくださいね」
が実現できます。
したがって、正しくはこのセッションIDこそが診察券に相当します。
なお、このIDは何十桁以上もある予測不能とされている文字列で作られるそうです。
cookie
今のはあくまでサーバー側の話でした。
一方で、クライアントは受け取ったセッションIDを保持して、リクエストのたびにそれをサーバーに送信すればよいわけです。
では、IDをどこに保存するかと言いますと、ブラウザ内の記憶領域です。
それを、cookieと呼びます。
そのため、cookieの中にセッションIDがあり続ければ、ページを移る度に毎回IDとパスワードを入力するという苦労から解放されるというわけです。
また、cookieにはセッションID以外にも各Webサービスがその人に応じた最適化された内容を提供する目的で、クライアントに固有の値を保持させたりすることができます。
少し難しいかもしれませんが、cookieの用途はログイン以外にもあるということだけ理解いただければと思います。
「このセッションIDを使うのをやめたいので破棄しましょう」とするのがログアウトということになりますね。
図解
概念としてのセッション
ここでややこしいのが、セッションという言葉の多義性です。
先ほど、サーバー内に作られる記憶領域の一つと言いましたが、実は別の意味合いでもこの言葉が使われることがあります。
セッションを、リクエストからレスポンスまでの一連の流れのこととして使う場面もあります。
よく「セッションが切れた」とか「セッションタイムアウトになった」などと耳にしたことがあるかもしれませんが、これらはその意味合いです。
決済や個人情報を入力するWebサービスの場合、一定期間がたったらセッションIDを破棄して途中でやり取りを中断することがあります。
これは、例えばカフェで離席中に画面をのぞかれたり不正操作されたりするかもしれないのなどのセキュリティの考慮によるものです。
まとめ
- リクエストとレスポンスは、ステートレスな通信
- そのため、何度も送信・確認する内容は保存してそれを使う
- サーバー側では、セッションに保持する
- クライアント側は、cookieに保持する
- ただし、「セッション」という言葉は、複数の意味でつかわれるので注意

