この記事では、Cookieを使ったセッション管理の仕組みを紹介します。
対象読者は、Cookieの基礎は理解したが、セッション管理の全体像が曖昧な人です。
Cookieの概要について不安がある方は、先に以下記事をご覧ください。
この記事を読めば、どのようにセッション管理するのか理解でき、ログイン機能の実装やトラブルシュートに自信が持てるようになります。
ぜひ最後までご覧ください。
セッション管理とは何か
セッション管理とは、一連のリクエストを「同じユーザー」として扱う仕組みです。
HTTPはステートレスなプロトコルです。つまり、各リクエストは独立しており、前回のリクエストで何をしたか、Webサーバーは覚えていません。
しかし「ログインしたユーザーだけが閲覧できるページ」を作りたい場合、Webサーバーは「これは以前ログインしたAさんのリクエストだ」と判断できる必要があります。毎回ログイン画面を表示するわけにはいきません。
そこでセッション管理が使われます。ログイン成功時に「セッションID」と呼ばれる識別子を発行し、Cookieを通じてブラウザに保存させます。以降のリクエストではこのセッションIDが自動的に送信されるため、Webサーバーは「このリクエストは、さっきログインに成功したAさんだ」と判断できます。
セッション管理の基本的な流れ
セッション管理は、以下の流れで動作します。

ポイントは、セッションIDそのものには意味がないことです。セッションIDは単なるランダム文字列であり、ユーザー名やパスワードは含まれていません。Webサーバー側で「このセッションIDは誰のものか」を管理しているからこそ、セッション管理が成り立ちます。
セッションデータの保存方式
セッションIDに紐づくユーザー情報をどこに保存するかは、大きく2つの方式があります。
サーバーサイド方式
セッションデータをWebサーバー側に保存する方式です。データベースやRedisなどのストレージに保存します。
ブラウザにはセッションIDだけを渡すため、ユーザー情報がネットワーク上に流れません。また、サーバー側でセッションを無効化できるため、ログアウト処理やセキュリティ上の強制ログアウトが確実に行えます。
クライアントサイド方式
セッションデータをブラウザ側に保存する方式です。JWTがこの方式の代表例で、ユーザー情報に署名を付けてトークンとして発行します。
サーバー側でストレージを持つ必要がないため、スケールしやすいメリットがあります。ただし、一度発行したトークンをサーバー側から無効化しにくいというデメリットがあります。
どちらを選ぶかはシステムの要件次第です。迷ったらサーバーサイド方式から始めるのが無難でしょう。
セッション管理のセキュリティ対策
セッション管理を安全に行うために、いくつかの対策が必要です。
セッションIDは推測されにくいものにする
セッションIDが連番やユーザー名のような推測しやすい値だと、攻撃者に他人のセッションを乗っ取られる可能性があります。十分な長さのランダムな文字列を使いましょう。
多くのフレームワークでは、安全なセッションIDが自動生成されます。自前で実装する場合は、暗号論的に安全な乱数生成器を使ってください。
ログイン成功時にセッションIDを再生成する
ログイン前に発行されたセッションIDをそのまま使い続けると、セッション固定攻撃のリスクがあります。攻撃者が事前に用意したセッションIDでログインさせられると、そのセッションを乗っ取られてしまいます。
ログイン成功時には必ず新しいセッションIDを発行し、古いセッションIDは無効化しましょう。
適切な有効期限を設定する
セッションの有効期限が長すぎると、セッションIDが漏洩した場合の被害が大きくなります。一方、短すぎるとユーザーが頻繁にログインし直す必要があり、利便性が下がります。
サービスの特性に応じて適切な有効期限を設定しましょう。金融系など機密性の高いサービスでは短めに、一般的なWebサービスでは数時間〜数日程度が目安です。
Cookie属性を正しく設定する
セッションIDをCookieで管理する場合、属性の設定が重要です。Secure、HttpOnly、SameSiteを適切に設定することで、盗聴やXSS、CSRFのリスクを軽減できます。
詳しくは以下記事をご覧ください。
さいごに
Cookieを使ったセッション管理の仕組みについて、理解していただけましたでしょうか?
セッション管理はログイン機能の土台となる重要な仕組みです。まずは自分のプロジェクトで、セッションIDがどのように発行・管理されているか確認してみてください。
最後までご覧いただきありがとうございました。また別の記事でお会いしましょう。