PoEAA ch17 Client Session State

PoEAAデザインパターン勉強メモ

出典: 


Client Session State

Stores session state on the client.

How It Works

  • 大なり小なり使うことになる

    • 最小

      • セッションIDを保持、セッション情報本体はサーバサイドで持つ
    • 最大

      • Client Session Stateでセッション情報全持ち、サーバはステートレスにできる
  • データはDTOにシリアライズして転送する
  • HTML Presentationにおいて、データの持ち方は3つ

    • URLパラメータ
    • hiddenフィールド
    • Cookie
    • 【補】HTML5でLocal Storage/Session Storage等いろいろ選択肢が増えたね
  • URLパラメータ

    • 長さ制限あり

      • データが少ないとき選択肢となる
    • URLが変わるとブックマーク時に問題となる

      • 2Cのサイトで使用することへの反対意見
  • hiddenフィールド

    • <input type="hidden" />なヤツ
    • 表示されないだけで、ソースを覗けば見えることに留意する
    • valueにはシリアライズしたセッション情報を入れる

      • XMLとか
  • Cookie

    • 本書執筆当時は議論の的だったらしい
    • サーバとのreq/resのやりとりに自動的に乗る
    • 大きさに制限あり
    • エンドユーザに無効化されるおそれあり

      • もはやレアケース
      • 社内向けアプリケーションなら問題ない
    • 他の方法同様、セキュアでない

      • 【補】今ではHTTPSでsecure属性とかありますね

        • 通信経路が暗号化されているときだけCookie送信
    • ドメイン名別

      • 別ドメインに持ち出せない
    • Cookieの有効判定を行える環境もある

      • 無効化されていたらURLパラメータにフォールバックできる

        • セッションデータは少量であること

When to Use It

  • 全セッション情報をClient Session Stateで持てば、Serverをステートレスにできる

    • クラスタリング、フェールオーバーとの相性良し
    • クライアントが落ちたらセッション情報は失われる
  • セッションデータが大量だと問題噴出

    • どこにデータ置くの

      • 【補】今ではLocalStorage等あるね
    • req/resのたびに生じる転送コスト
  • セキュリティ問題

    • Clientにセッションデータを置くということは、次のリスクにさらされるということ

      • 見られる
      • 改ざんされる
    • 暗号化しない限り防げない

      • リクエストのたびに暗号化/復号するのはパフォーマンス上の負荷になる
    • 暗号化しない場合、送り出したデータが同じまま返ってくるとは思うな

      • 再バリデーションしろ
  • 大なり小なり必ず使う(前述どおり)
  • セッションID値のみ持つ程度なら、負荷の問題は生じない
  • セキュリティの問題は依然残る

    • セッションハイジャック

      • わるいユーザは、クライアント側で保持しているセッションIDを書き換えて、他人のセッションに悪さをしようとするかもしれない
      • セッションIDは予測困難にせよ

        • 乱数
        • 乱数でないなら、ハッシュ関数を通す

英語

  • pry

    • のぞく、ほじくる