HTTPセッションについて調べたことまとめ
13 Feb 2017そもそもセッションって何?
通常HTTPでは、リクエスト⇒レスポンスの1往復で通信が独立している。 セッションを導入することで、複数回の通信を連続的なものとして扱うことが出来る。
このセッションの考え方によりログイン⇒ログアウトの間、ユーザーを識別することができる。
具体的な処理
ログイン通信
- クライアントがユーザーIDとパスワードをサーバに送信し、サーバ側で認証される。
- サーバがセッションIDを生成する。(ランダムで長い文字列)
- サーバはそのセッションIDとユーザーIDを紐付ける。(セッション変数にユーザーIDを保存する)
- ログイン通信のレスポンスでセッションIDをクライアントに返す。
ログイン後の全ての通信
- ログイン後の全ての通信において、クライアントはセッションIDをサーバに送る。
- サーバはセッションIDを元にそのユーザーが認証済みのユーザーかどうかをチェックする。
クライアントがサーバにセッションIDを送るための2つの方法
- Cookieを使う方法
- Cookieを使う場合であればクライアント側はあまり意識しない。
- 自分のCookieは簡単に見れる。CookieにセッションIDが書き込まれている。
- Chromeなら設定⇒詳細設定⇒プライバシー⇒コンテンツの設定から全てのCookieを確認できる。
- hiddenフィールドを利用する方法
- hiddenフィールドを使うなら各通信でセッションIDを送る処理を追加しなければならない
- hiddenフィールの場合はHTMLのソースを見ることで実際のセッションIDがわかる。
Cookieにセッションを使えない状況
ちなみに下記のような状況ではCookieをセッション管理に使えない
- 一昔前のdocomoのガラケー
- 共有マシン等の環境で利用者が意図的にCookieをOFFにしている(firefoxのプライベートブラウジング等)
- クロスドメイン環境のアプリにおけるSafari
サーバアプリケーションががセッションを保存する方法
サーバがセッションを保存する方法もいくつか設定がある。
- PHPならデフォルトはファイルとして保存する。(php.iniで設定)
[Session]
;ファイルとして保存
session.save_handler = files
;デフォルトは下記のパスに保存される。
session.save_path = "/tmp"
私のPHPのWEBアプリケーション環境では下記のファイル名で保存されていた。
sess_[セッションID]
例)
$ ls /tmp/
sess_5bfb12d1c31eb5769b304e2b34f5215e
またアプリケーションサーバが複数台にわかれている環境などでセッションを引き継ぎたい場合は(普通そうだと思うが)ローカルのファイルではなくmemcachedなどに保存する。
[Session]
;memcacheに保存
session.save_handler = memcache
;保存先は専用のmemcachedサーバ
session.save_path = "tcp://[IPアドレス]:11211"
参考
https://www.ipa.go.jp/security/awareness/administrator/secure-web/chap6/6_session-1.html