Webアプリケーション開発において、とても重要な技術である「セッション」という仕組みについて、よく理解できていなかったのでまとめてみました。
まずはWebの設計思想から
Webをシンプルかつ使いやすいものにするための設計思想としてRESTを採用しています。 以下、RESTを構成している6つのアーキテクチャスタイル
※その他、「Web」についての知識に関しては、こちらを参照
アーキテクチャスタイル | 内容 |
---|---|
クライアント/サーバ | クライアントがサーバにリクエストを送り、サーバがそれに対してレスポンスをする |
ステートレスサーバ | サーバ側でアプリケーション状態を持たない。クライアントが一度出した処理を記憶してない |
キャッシュ | クライアントとサーバの通信回数と量を減らす。クライアントが取得したリソースを使い回し |
統一インターフェイス | インターフェイスを固定する。(例:HTTPメソッドは8つで統一する) |
階層化システム | システムを階層に分離する |
コードオンデマンド | プログラムをクライアントにダウンロードして実行する(例:JavaScriptはインストール不要) |
この中でも、今回のセッションと切っても切り離せないのが、2つ目の「ステートレスサーバ」というアーキテクチャスタイル。Web(サーバ)はクライアントが出した過去のリクエストについて覚えていません。これはWeb(サーバ)からすると、リクエスト内容を覚える必要がない(覚えるためのメモリを用意しておく必要がない)ので、その分リクエスト処理に集中できるという点で大きなメリットがあります。しかし、ユーザー(クライアント)からすると、Webサービスの利用時に不便に働きます。
例えば、あるWebサービスに会員登録をして、ログインフォームにユーザー名とパスワードを入力してログインしたとします。すると、ログインが成功してサービスのトップ画面が表示されます。そして、別のページを表示させようとすると・・・、
Web(サーバ)はユーザーがログインしたということを覚えていないので、ログインフォームに戻り、ユーザーに対して再度ログインするよう要求します。ユーザーからすると、何度もログインしないといけないので、めちゃくちゃ不便です。
そこで、こういった問題を解決する仕組みとして利用されるのが、セッションという仕組みです。
セッションという仕組み
「セッション」という言葉の意味
セッションという言葉の意味は広く、様々な文脈で使われます。
②一時的な情報の格納先
③ユーザーがログインしてからログインするまでの期間
セッション(session)とは?
セッション(session)は、ハッシュ(Hash)オブジェクトです。なので、あるキーに対する値としてデータを格納します。
session = {"fruits": "orange", "vegetable": "tomato", ...}
セッション(session)をどのように使うのか?
このセッション(session)を利用して、ログインユーザーの情報を保存することで、ステートレスというWebのアーキテクチャスタイルのデメリットを解消します。
session = {"url": "https://chopesu.com/blog/123", "user_id": "1", "contents": "sample..."}
具体的には、上記のようにセッション(session)にユーザー情報を格納し、ユーザーからのリクエスト時にこのセッション情報をサーバーに読み込ませることで、サーバーに同一ユーザーからのリクエストであることを認識させます。
どのようにしてサーバーにセッション情報を読み込ませるのか?
セッション(session)には個人情報が多く格納されているので、セキュリティのことを考えて慎重に扱う必要があります。では、どのようにしてサーバにこのセッション情報を安全に読み込ませるようにするのか?
それにはいくつかの方法があります。
・Cookieを利用する
・Redisを利用する
・データベースを利用する
・memcachedを利用する
・memoryを利用する 等々
長くなりそうだったので、続きはこちらにまとめました