メインコンテンツへスキップ
Q どろっぷ
認証・セキュリティ

セッション管理とは

概要

セッション管理は、HTTP の「ステートレス」という性質を補い、ユーザーのログイン状態をリクエストをまたいで維持する仕組みである。HTTP は本来、各リクエストが独立しており前後の文脈を持たない。セッション管理では、認証成功時にサーバーが一意のセッション ID を発行し、ブラウザの Cookie に保存する。以降のリクエストでは Cookie に含まれるセッション ID をサーバーが検証し、ログイン済みのユーザーとして処理する。

セッション ID の生成と保存

セッション ID は暗号学的に安全な乱数生成器で生成する。UUID v4 や 256 ビットのランダムバイト列が一般的である。予測可能なセッション ID (連番、タイムスタンプベースなど) は、セッションハイジャック攻撃の標的になるため絶対に使用しない。

サーバー側では、セッション ID に紐づくユーザー情報をデータベースやインメモリストアに保存する。DynamoDB のような NoSQL データベースを使う場合、セッション ID をパーティションキーにし、TTL (有効期限) を設定して自動的に期限切れのセッションを削除する設計が効率的である。

Cookie のセキュリティ属性

セッション Cookie には複数のセキュリティ属性を設定する必要がある。`HttpOnly` 属性は JavaScript からの Cookie アクセスを禁止し、XSS 攻撃によるセッション ID の窃取を防ぐ。`Secure` 属性は HTTPS 通信でのみ Cookie を送信するよう制限する。`SameSite` 属性は CSRF 攻撃を緩和する。

これらの属性を 1 つでも設定し忘れると、セッションハイジャックの攻撃面が広がる。特に `HttpOnly` の欠落は致命的で、XSS 脆弱性が 1 つでもあればセッション ID が即座に窃取される。セキュリティ属性はデフォルトですべて有効にし、明確な理由がない限り無効にしない。

JWT との比較

セッション管理の代替として JWT (JSON Web Token) がある。JWT はサーバー側にセッション情報を保存せず、トークン自体にユーザー情報を含める。サーバーはトークンの署名を検証するだけでよいため、データベースへの問い合わせが不要になる。

しかし JWT には、発行済みトークンを即座に無効化できないという構造的な弱点がある。ユーザーがパスワードを変更した場合や、不正アクセスを検知した場合に、既存のトークンを強制失効させるにはブラックリストの管理が必要になり、結局サーバー側に状態を持つことになる。セッション管理はこの点で明快であり、セッション ID をデータベースから削除すれば即座にログアウトが完了する。

認証技術やセキュリティの基礎を学びたい方は、Web セキュリティの関連書籍も参考になります。

この記事は役に立ちましたか?

関連用語

関連記事

あなたも質問箱を作ってみませんか?

メールアドレスだけで登録でき、パスワード不要で始められます。

無料で始める