セッションIDワンタイム化

概要

x-Servlet のセッションの管理は URL にセッションID(_xpxiパラメータ)を付加する方法を用いています。このセッションID自体は暗号化されていますが、有効時間内では常に同じ値となっています。

Version 2.9.0 から、より高いセキュリティを実現するために _xpxiパラメータを「外部出力用ID」と「内部管理用ID」の二つのセッションIDを用いて「外部出力用ID」をワンタイムセッション方式で使用することができます。

各IDの役割は以下の通りです。

外部出力用ID 携帯端末と x-Servlet 間でやり取りされるセッションIDです。
html をレスポンスする度にセッションIDを変更し、ワンタイム化されます。
内部管理用ID x-Servlet 内部だけに保持するセッションIDです。
セッション情報のキーとなるIDで、セッションが維持されている間は値が変化しません。
外部出力用IDと関連付けられており、最後に発行した外部出力用ID以外は同一セッションと認めません。

※動作イメージは「x-Servletの基本動作」を参照ください。

主な動作機能として以下の機能があります。

  • ページ遷移を行う度にセッションIDを変更する
    ページ遷移を行う度にリンクに付加される _xpxiパラメータ値が変わります。
    ページにアクセスすると使用された _xpxiパラメータ値は破棄されて使用できなくなり、新しい値になります。
    ブックマークのリンクなど、アクセス済みの _xpxiパラメータ値で再アクセスするとセッションエラーとなり新規セッションが作成されて処理を続行します。
    これによりセッションハイジャックなどを防ぎます。
  • セッションIDを変更しない
    セッションワンタイム機能をオフにして最初に割り当てられたセッションIDを使い続けます。
    旧バージョンの x-Servlet と同様の動作としたい場合や、
    セッションIDの値をアクセス解析ソフトなど外部アプリケーションで使用している場合に使用します。
  • cookie を用いたセッション管理を行う
    セッションワンタイムではなく cookie と URLパラメータ方式を組み合わせたセッション管理を行います。
    cookie が利用できる場合は URLパラメータは従来通りセッションIDは変化せず付加され、セッション維持用のトークンがセットされた cookie で管理を行います。
    (このトークンの値もセッションが有効な間は変化しません)
    cookie が使用できない端末の場合は URLパラメータのワンタイム化が行われます。
    また、端末側で cookie 使用を OFF にした場合や、HTTP → HTTPS の遷移で cookie が送られない場合も URLパラメータのワンタイム化が行われます。

設定

全体設定

contentsRule.xml もしくは contentsRuleDefault.xml の <Attribute name="sessionIDOnetimeType"> で動作を設定します。

詳しくは「contentsRule.xml設定」の「sessionIDOnetimeType」をご覧ください。

ページ単位指定(レスポンスヘッダ設定)

システム設定以外に Webサーバからのレスポンスヘッダに値を設定することでワンタイム化を指定することができます。

この指定は上記の全体設定より優先されますのでページ単位で動作を変更させることができます。

詳しくは「特殊HTTPヘッダ」の「X-Xproxy-Command」をご覧ください。

ページ単位指定(コンテンツ記述)

元コンテンツの記述として <meta http-equiv="X-Xproxy-Command"> を記述することでワンタイム化を指定することができます。

記述できる content は以下の通りです。

fixsessionid 元コンテンツにこの指定がある場合、このレスポンスではセッションIDを変更しません。
thissessionid 元コンテンツにこの指定がある場合、このレスポンスでセッションIDを変更します。

指定例

<meta http-equiv="X-Xproxy-Command" content="fixsessionid">

この指定は上記の全体設定より優先されますのでページ単位で動作を変更させることができます。

「X-Xproxy-Command」ヘッダと指定が重複しても優先順位はありません。

複数の <meta> ヘッダによる指定は可能ですが、コマンドの優先順位は以下のようになります。

fixsessionid > thissessionid

動作

以下に動作例を示します。

ケース1:旧バージョンの動作と同じにしたい。

セッションワンタイムは行わず、旧バージョンと同じ動作としたい場合の設定。

全体設定(<Attribute name="sessionIDOnetimeType">) none
ページ単位指定(X-Xproxy-Command: ヘッダ) なし

動作イメージ

ページ遷移
画面例
X-Xproxy-Command: ヘッダ なし なし なし なし なし なし なし
セッションID(_xpxi)の変化 AAA AAA AAA AAA AAA AAA AAA

ケース2:すべてのページでセッションワンタイム化を行いたい。

ページ遷移を行うたびにセッションをワンタイム化させたい場合。

全体設定(<Attribute name="sessionIDOnetimeType">) all
ページ単位指定(X-Xproxy-Command: ヘッダ) なし

動作イメージ

ページ遷移
画面例
X-Xproxy-Command: ヘッダ なし なし なし なし なし なし なし
セッションID(_xpxi)の変化 AAA BBB CCC DDD EEE FFF GGG

ケース3:特定のページのみセッションワンタイム化を行いたい。

セッションIDを変更したいページのみセッションをワンタイム化し、それ以外のページは従来通り固定セッションIDで動作させたい場合の設定。

全体設定(<Attribute name="sessionIDOnetimeType">) none
ページ単位指定(<meta> による X-Xproxy-Command 指定) <meta http-equiv="X-Xproxy-Command" content="thissessionid">

動作イメージ

ページ遷移
画面例
<meta> タグ なし なし thissessionid なし なし なし なし
セッションID(_xpxi)の変化 AAA AAA BBB BBB BBB BBB BBB

関連のある設定項目

セッションワンタイム機能を利用するにあたり、関連する動作設定は以下の通りです。

  • sessionIDType
    IDの推測がされにくい"4"を強く推奨します。"2","3"は非推奨となります
  • sessionTerm
    セッションの有効期限が切れると cookie 方式で発行された cookie も無効となります。
  • tracker.historySize
    ワンタイム機能を利用する場合、ブラウザバックが不可能となるためこの設定は無効となります。
  • setSessionHeader
    現在使用しているセッションIDに加え、内部管理IDの出力が追加されます。
  • log.accessLog.loggingSessionID
    アクセスログへセッションID出力が可能になります。
  • newSessionIDFlag
    sessionIDType=2でのみ有効なため影響はありません。
  • detectSessionWithTE
    ワンタイム機能による影響はありません。
  • cookieControl
    ワンタイム機能による影響はありません。"false" にすると Webサーバで発行した cookie 情報と x-Servlet が発行するワンタイム用 cookie 情報の二つの内容が合わさった cookie が携帯端末に出力されます。
  • IllegalSessionException.xml
    ワンタイム機能を利用している状態で x-Servlet 内でセッションエラーが発生した場合に端末に返却するメッセージ内容を設定することができます。

注意点

  • スルーモード、リダイレクトモードではセッションワンタイム機能は利用できません。
  • ワンタイム化されるセッションIDはレスポンスがテキストファイル(html/xhtml)およびリダイレクトによる LocationURL の変換のみです。
    画像・FLASHファイルのレスポンス時にはセッションIDは変化しません。
  • cookie 方式は「cookieControl」の影響を受けません。
    cookieControl が "false" でも携帯⇔x-Servlet 間で cookie を用いたセッション管理を行えます。
  • ワンタイム化を行う設定では LocationURL のリダイレクトとして画像を返すような場合もセッションIDが変更されます。
    ページ内の<img>タグでそのようなレスポンスが行われた場合、<img>タグでセッションIDが変更されてしまうので同じページ内のリンクにあるセッションIDは無効となります。
    これらのリンクをリクエストすると新規セッションとして処理されます。
    ※<object>タグで指定された Flash ファイルも同様となります。
  • cookie を用いたセッション管理は、セッションIDの変更を最小限にできますが、cookie 自体のセキュリティ(なりすましなど)については考慮しておりません。
    重要情報を扱うページではセッションIDのワンタイム化を推奨します。
  • cookie を用いたセッション管理は x-Servlet が発行した cookie が携帯端末から返ってこなければ使用できません。
    cookie が返らない場合はセッションIDはワンタイム化されます(all と同じ動作)
    携帯端末から cookie が返らない要因は以下が考えられます。
    • cookie が利用できない端末(iモードブラウザ1.0端末)
    • 端末設定で cookie 利用を OFF にしている場合
    • HTTP から HTTPS に遷移するなど、スキームが変化する場合
  • ワンタイム機能利用下ではユーザが端末のブラウザバックを行った場合、表示されたページにあるリンクのセッションIDは無効となります。
    そのためブラウザバック後のページからのアクセスは新規セッションとして処理されます。
    新規セッションが頻繁に生成されると最大セッション数の限界や、メモリ消費の増大など効率が悪くなりますので重要情報を扱うページのみをワンタイム化することを推奨します。
  • セッションIDワンタイム化を行うと x-Servlet のセッションIDが変化します。
    このためセッションIDをキーとしたアクセス解析を行っている場合は正常に遷移をトレースすることができなくなります。
    この場合はワンタイム機能を OFF にするか、access.log に内部IDを出力して集計するようにしてください。
  • cookie を用いたセッション管理機能で x-Servlet が発行する cookie には「Version」はセットされません。
    「Version」を省略した場合は「Version=0」と認識されますので Webアプリケーション側で cookie に「Version」を使用する際には注意が必要です。
TOP