セッション
Session
Webのセッションは、複数のHTTP要求を一連の利用として結び付け、ログイン状態などを扱う仕組みです。終了時点はサイトの設計や期限によって決まり、タブを閉じた瞬間に必ず終わるとは限りません。
🐾 猫で例えると?
飼い主の膝でくつろぐ茶トラ。膝に乗ってから降りるまでを、「今はこの猫と過ごしている」という一続きの時間に見立てます。Webのセッションも、複数のやり取りを同じ利用者の続きとして扱うためのまとまりです。例えばページを移ってもログインした状態を保つとき、今回の要求を前のやり取りと関連付ける仕組みが使われます。
💻 プログラミングにおける「セッション」とは?
HTTPのステートレスとは、プロトコルが前の要求の利用者状態を自動で引き継がないことです。毎回TCP接続が切れるという意味ではありません。アプリ側でCookieやセッションIDなどを使い、複数の要求を関連付けます。
そこで、一連のやり取りを「同じユーザーからの継続的なアクセス」として認識するために「セッション」という概念が使われます。サーバー側でユーザーごとの専用の領域(セッション情報)を作り、ブラウザと「セッションID」という合言葉を共有することで、途切れない一連の通信状態を作り出しているのです。
⚠️ セッションの仕組みと注意点
セッション情報はサーバーのメモリなどに保存されるため、アクセスが集中するとサーバーのリソースを圧迫します。また、セッションを維持するための「セッションID」が第三者に盗まれると、アカウントを乗っ取られる「セッションハイジャック」という深刻な脆弱性に繋がります。
セッションタイムアウトの重要性
セッションは無限に続くわけではありません。銀行のサイトなどで、しばらく操作しないと勝手にログアウトされるのは、セキュリティを保つために「セッションタイムアウト(有効期限)」が設定されているからです。これは、いつまでも膝の上に乗せていると飼い主の足が痺れて強制終了(降ろされる)になるのと同じ仕組みです。
// PHP:認証そのものではなく、セッションに状態を保存する例
session_start(); // HTMLなどを出力する前に呼ぶ
$_SESSION["cat_name"] = "茶トラ";
// 別の要求でも session_start() の後で参照できる
$name = $_SESSION["cat_name"] ?? "未設定"; ログインに使う場合は、認証成功を確認した後にIDを再発行するなどの対策が必要です。session_destroy() だけではブラウザのCookieや現在のセッション変数まで自動的に消えるわけではないため、ログアウト時は利用するフレームワークの手順を確認します。
🛠️ セッションを賢く使うためのポイント
セッションIDの保護と、ログインから終了までの扱いを確認します。
- セッションタイムアウトを適切に設定する: 操作がないまま放置されたセッションは、一定時間(例:30分)で自動的に破棄するように設定し、不正利用を防ぎます。
- セッションIDの推測を困難にする: 単純な連番などの推測されやすいIDは避け、暗号学的に安全な乱数を用いて推測不可能なIDを生成する必要があります。
- Cookieとセッションは別の役割: Cookieはブラウザに値を保存し要求時に送る仕組み、セッションは一連の利用を管理する概念です。サーバー保存型ではCookieに識別子だけを持たせます。HTTPS、Secure・HttpOnly・SameSite属性、期限管理を組み合わせて保護します。
膝の上で続く茶トラとの時間を思い出すと、セッションは一続きのやり取りとして捉えやすくなります。Webでは、その継続を便利にしつつ、期限切れやログアウトでいつ終了させるかも決めます。続ける仕組みと終わらせる仕組みの両方が必要です。