😎

【セキュリティ】セッション管理の基本

に公開

はじめに

ウェブアプリケーションを利用しているとき、私たちはログイン状態が維持されたり、ショッピングカートに商品が保持されたりするのを当たり前に感じています。何度もログインし直し、またショッピングカートに保存するのは面倒と感じてしまうでしょう。
しかし、この背後には「セッション管理」という重要な技術が働いています。HTTPプロトコルそのものは状態を保持しない(ステートレスな)性質を持っているため、ウェブアプリケーションがユーザーとの「会話」を続けるためには特別な工夫が必要です。
この記事では、セッション管理の基本的な概念と仕組み、そして実装時の考慮点について、初心者の方にもわかりやすく解説していきます。

セッションとは

セッションとは、ユーザーがウェブアプリケーションにアクセスしてから離脱するまでの一連のやり取りを指します。例えば、オンラインショップで商品を閲覧し、カートに追加し、決済を行うまでの一連の操作がひとつのセッションに該当します。HTTPプロトコルは各リクエストが独立しているため、サーバーは単純な仕組みだけでは複数のリクエストが同じユーザーからのものか判断できません。この問題を解決するのがセッション管理の技術です。

セッションを管理するためには、ユーザーを識別する何らかの方法が必要です。その代表的な方法がクッキーを使ったアプローチで、サーバーは最初のアクセス時にセッションIDと呼ばれる一意の識別子を生成し、これをクッキーとしてブラウザに送信します。ブラウザはその後続くリクエストごとにこのセッキーを自動的にサーバーに送信するため、サーバーはセッションIDをもとにユーザーを識別できるようになります。

セッション管理の基本的な仕組み

セッション管理の流れは次のようになります。


https://shukapin.com/infographicIT/session-management より

まず、ユーザーが初めてウェブアプリケーションにアクセスすると、サーバーは一意のセッションIDを生成します。このセッションIDは推測が困難なランダムな文字列で構成されることが一般的です。

次にサーバーはこのセッションIDをクッキーとしてブラウザに送信し、同時にサーバー側でもこのセッションIDに関連付けてユーザーデータを保存します。

ユーザーが次に同じサイトにアクセスすると、ブラウザは自動的にセッションIDを含むクッキーをサーバーに送信します。サーバーは受け取ったセッションIDを手がかりに、対応するユーザーデータを取得し、適切なレスポンスを返します。
このようにして、サーバーとクライアントの間で「会話」が継続する状態が維持されるのです。

セッションには通常有効期限が設定されており、一定時間操作がないと自動的に破棄されるようになっています。また、ユーザーが明示的にログアウトした場合もセッションは終了します。
セッションが終了すると、サーバーは対応するセッションデータを削除し、セッションIDを無効化します。

セッション管理の実装方法

現代のウェブ開発では、多くのフレームワークがセッション管理機能を内蔵しており、開発者が直接セッションIDを生成・管理する必要は少なくなっています。

セッションデータの保存場所としては、サーバーのメモリ、ファイルシステム、データベース、またはRedisなどのインメモリデータベースが使用されます。特に大規模なアプリケーションでは、セッションデータをデータベースやRedisに保存することで、複数のサーバー間でセッション状態を共有できるようになります。

セキュリティの観点から、セッションIDはHTTPS接続で送受信されるべきです。また、クッキーにはSecure属性とHttpOnly属性を設定することが推奨されます。Secure属性はHTTPS接続時のみクッキーを送信するようにし、HttpOnly属性はJavaScriptからクッキーにアクセスできないようにして、クロスサイトスクリプティング(XSS)攻撃によるセッションIDの盗難を防ぎます。

セッション管理のセキュリティ考慮点

セッション管理において最も注意すべきはセキュリティです。
セッションIDが第三者に知られると、そのユーザーになりすましてアプリケーションを利用される可能性があります(セッションハイジャック)。これを防ぐためには、セッションIDを十分に長くランダムな値にすること、セッションタイムアウトを適切に設定すること、重要な操作の前には再認証を要求することなどが効果的です。


https://www.ipa.go.jp/security/vuln/websecurity/session-management.html より

また、クロスサイトリクエストフォージェリ(CSRF)攻撃から保護するため、重要な操作にはCSRFトークンを使用する必要があります。CSRFトークンはセッションごとに生成される一意の値で、フォーム送信時にこのトークンも一緒に送信させ、サーバー側で検証することで、正当なユーザーからのリクエストかどうかを確認します。
※詳しくは別記事でまとめていきます。

セッション固定攻撃という手法にも注意が必要です。これは攻撃者が事前に知っているセッションIDをユーザーに強制し、そのユーザーがログインした後にセッションを乗っ取るというものです。これを防ぐには、ユーザーが認証に成功した後で必ず新しいセッションIDを発行するようにします。

おわりに

セッション管理はウェブアプリケーション開発において基本的かつ重要な技術です。一見単純な仕組みのように見えますが、適切に実装するためにはHTTPプロトコルの特性やさまざまなセキュリティリスクを理解する必要があります。フレームワークはセッション管理の複雑な部分を抽象化してくれていますが、内部でどのように動作しているかを理解しておくことは、より安全で堅牢なアプリケーションを開発する上で欠かせないため、しっかり理解しておきましょう。
最後までお読みいただき、ありがとうございました。

参照・画像引用元URL

https://www.ipa.go.jp/security/vuln/websecurity/session-management.html
https://xtech.nikkei.com/it/article/COLUMN/20081010/316687/
https://blog.frevo-works.co.jp/entry/2019/09/24/112603
https://www.ipa.go.jp/archive/security/vuln/programming/web/chapter4/4-3.html
https://www.intercom.co.jp/malion/column/session-hijack/

Discussion