2012-04-17
セッションの仕組みとログインについて
セッションの仕組みの理解が浅くて気持ち悪くなってきたので、調べてみた。
以下、サーブレット標準に準拠のサーブレットコンテナ上でのアプリケーションに関して記載する。
セッション
- HTTPはステートレスなプロトコルである
- セッションは、HTTPでステートフル(1回のリクエストで完結しない場合に、前回のリクエストの情報(ログイン情報や買い物カゴなど)を保持)な処理を実現するための、期間をあらわす概念
セッションID
- セッションを一意に識別するID
- サーブレットコンテナが生成する。そのため、サーブレットコンテナの実装に依存する
- セッションにおいて HttpServletRequest#getSession が初めて呼び出された際に HttpSession インスタンスが生成され、セッションIDはこのインスタンスのフィールドとして生成される
- クライアントがセッションへの参加を選択した場合(クッキーを有効にしている、など)、サーブレットコンテナによってセッションIDがクライアントに渡される(そして、例えばクライアントのクッキーに保持される)
- クッキーに設定されたセッションIDは、次回以降のリクエストの際にブラウザによってリクエストヘッダに設定される
- ただし、セッションの有効範囲はそのWebアプリケーション(ServletContext)のみであり、別のコンテキスト内で直接参照することはできない
参考 Java API
- Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle
- Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle
- Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle
ログイン状態保持機能の実現
ベーシック認証の場合で考えてみた。
前提
- WEBアプリケーションサーバのベーシック認証機能を利用
- 認証対象URLにはトップ画面のみ指定する(※トップ画面以外へのアクセスは、サーバのメモリにセッションIDが有るかでログイン済みかを判定)
(※なお、認証を一度通過すれば、トップページ以下のディレクトリへのリクエストには必ず、Authorizationヘッダがブラウザによって付与される)
フロー
1. トップ画面へのリクエスト
2. 「401 Unauthorized」がレスポンスされる
3. ブラウザによってログインダイアログが表示される
4. ユーザが、IDとPWDを入力し、OKボタンを押下する
5. Authorizationヘッダが付与されたリクエストが送信される
6. WEBアプリケーションサーバが認証し、認証通過する
7. サーブレットでセッションIDを取得(WEBアプリケーションサーバがIDを新規作成)する
8. WEBアプリケーションサーバによって、レスポンスヘッダにセッションIDが設定される
9. クライアントのクッキーにセッションIDが登録される
10. 他の画面へのリクエスト時は、セッションIDのクッキーがリクエストヘッダに付与される
11. WEBアプリケーションサーバは、リクエストヘッダのセッションIDを、そのリクエストが所属するセッションのセッションIDと認識する
12. サーブレットでセッションIDを取得すると、上記セッションIDが渡される
参考サイト
- セッションIDの確認 - セッション管理 - サーブレット入門
- Javaの道:Servlet(6.セッション管理)
- [ThinkIT] 第2回:セッション管理 (1/4)
- 過去日記「サーブレット標準でどこまで定義されているか - oknknicの日記」
参考文献

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
- 作者: 徳丸浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2011/03/01
- メディア: 単行本
- 購入: 119人 クリック: 4,283回
- この商品を含むブログ (146件) を見る
トラックバック - http://d.hatena.ne.jp/oknknic/20120417/1334673466
リンク元
- 6 https://www.google.co.jp/
- 4 http://pipes.yahoo.com/pipes/pipe.info?_id=242f50e5030d8e9e73ce52013bcbf820
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=8&ved=0CGAQFjAH&url=http://d.hatena.ne.jp/oknknic/20110813/1313240627&ei=7F6OT-uyJYnDmQWEzcH-Cw&usg=AFQjCNHRSGft6jEgPJqWYiNcOrAue_JRhA
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=jmeter ??????&source=web&cd=3&sqi=2&ved=0CEAQFjAC&url=http://d.hatena.ne.jp/oknknic/20110813/1313240627&ei=KmqOT9H3AuLnmAWWh4nvCw&usg=AFQjCNHRSGft6jEgPJqWYiNcOrAue_JRhA
- 2 http://ezsch.ezweb.ne.jp/search/?query=Powershell+性能&start-index=16&adpage=4&ct=1301&sr=0000&t=20120418100845&filter=1
- 2 http://www.google.co.jp/search?q=Hyper-v+インポート+外部ネットワーク&hl=ja&gbv=2&gs_l=hp.3...109l6812l0l7281l22l22l1l7l0l0l313l1844l0j4j3j2l9l0.&oq=Hyper-v+??%A
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=タスクスケジューラ フェイルオーバークラスタ&source=web&cd=1
- 2 http://www.google.com/url?sa=t&rct=j&q=ハイパーv エクスポート&source=web&cd=7&sqi=2&ved=0CFgQFjAG&url=http://d.hatena.ne.jp/oknknic/20120403/1333462480&ei=FxOOT7bQOu
- 1 http://k.hatena.ne.jp/keywordblog/vhd
- 1 http://s.luna.tv/search.aspx?client=lunascape&s=0&gl=jp&hl=ja&q=hyper-v ゲストOS エクスポート ネットワークフォルダ