Closed6

セッションについてまとめる

ハガユウキハガユウキ

セッションとは

セッションとは、Webサイトを訪れたユーザーがサイト内で行う一連の行動のことです。一連の行動をまとめて1セッションとしてカウントされます。実際のWebアプリ開発ではログインからログアウトまでを1つのセッションとして扱うことが多いです。

セッション管理とは

セッション管理とは、なんらかの仕組みでクライアントごとのセッションを管理することです。

ブラウザには複数のリクエストを跨いで情報を保持するために、クッキーという仕組みがあり、
セッションは、いろいろなやり方によって実現されるが、一番シンプルなのがクッキーによってセッションを実現する方法である。しかしこのやり方は、すべての情報をクッキーに入れるので、クッキーの情報がコピーされて盗まれたら、サーバーとのセッションも偽装されてしまう(サーバー側はクッキーを元にUAを判定しているので、クッキーが正しかったら正しいUAだと勘違いしちゃう)。

セッションに情報を保持しておいて、クッキーを付与したリクエストが来たら、セッションidがセッションに存在するかを確認して、あるなら、別のリクエストでもセッションを維持することができる。

セッションを実現するには、また別の方法もある。それはセッションキーをクッキーとして送信して、サーバー側でセッションキーに紐づくデータを管理する方法である(データはRedisなどに保存される)。このセッションのRedisへのアクセスは、リクエストごとに発生する。

要するに、クライアントとサーバーでステートフルな通信をするためには、結局クッキーは使わないといけない。そして、そのセッションの情報をどこに保存するか(どのセッションストレージを選ぶか)が違うだけ。
セッションストレージをクッキーにするのか、Redisにするのか。サーバーのメモリにするのか

セッションストレージをクッキーにした場合、ストレージ用のサーバーを用意する必要はないが、クッキーの攻撃を受けたり、そもそもクッキーの容量制限の影響を受ける。そしてサーバー側でセッションクリアができない(ほんとか?)
セッションストレージをRedisにした場合、容量制限がないのと、サーバー側でセッションクリアができる。しかし、ストレージを用意する必要があるのと、リクエストごとにDBアクセスのI/Oコストが発生する。
セッションストレージをメモリ保存にした場合、サーバー側でセッションクリアできるのと、ストレージを用意する必要がないので楽だが、サーバーが再起動したら消えるので、あまりお勧めできない。

ハガユウキハガユウキ

セッションが自動で消去されないと、ログアウトしたくせに「なんかログインしてんだけど」状態になる。クッキーとして送られたセッションidがRedisから削除されていないからこうなる。クッキー自体を消すのもありだけど、セッションストレージにRedisを使っているなら、必ずRedisの方も消さないとダメ。なぜなら、セッションidのクッキーをコピーしてログアウトして、curlでリクエスト出してログインできたじゃまずいから。

このスクラップは2023/08/31にクローズされました