mobyletのセッション機構を利用する

mobyletセッションを利用する前に

UID/GUIDをキーにしたセッション管理の問題を知る

mobyletのセッション機構はUID/GUIDをキーとして管理するため、非常に便利な機能となっています。
しかし、UID/GUIDをキーとして利用する場合の問題点を理解した上で、最適な設定を行う必要があるため、 まずはこの部分(特にセキュリティ観点)についてしっかりと理解しておく必要があります。

UID/GUIDの偽装

UIDやGUIDとは端末若しくはキャリアのゲートウェイサーバがリクエスト情報に混入してくれる、ユーザ等を特定する一意なIDです。
このIDはリクエストヘッダやリクエストパラメータとしてWebアプリケーションに対して引き渡されるため、 PC等から人為的にIDを付与して送信することで、UID/GUIDを偽装することが出来ます。
IDの偽装はセキュリティホールとなり、個人情報の漏えいの危険性も有り、この偽装に対処する必要があります。
現実的な対応方法には以下のようなものがあります。

  1. mobylet.xmlでsecureGatewayを設定する
  2. Apache等のWebサーバ側でIP制限を行う

mobylet.xmlでsecureGatewayを設定する

mobyletには正しくゲートウェイサーバから受け付けたリクエストかどうかを判断するメソッドがあります。
(Mobylet#isGatewayIp()メソッド等)
このメソッドは開発時に利用しても構いませんが、mobylet.xmlのsecureGatewayの設定を行うことで
mobyletフレームワーク側で検証を行い、ゲートウェイサーバ以外のリクエストに対してはUID/GUIDを返却させない 設定を行うことが可能です。
詳しくはこちら(mobylet.xmlの設定方法)

secureGatewayを「SECURE_ID」等に設定した場合、開発環境などでテストが行えないということがあります。
(FireMobileSimulator等を利用してテストをする場合、キャリアゲートウェイを通過しないため)
この場合は、「classes/ip」ディレクトリ(クラスパス配下のipディレクトリ)に「EXTENSION.txt」を配置して、
このファイルの中に特別に許可するIPアドレスを改行区切りで記載します。
(先頭が「#」で始まる行はコメント行として無視します)

例えば開発時に自身のマシンで動作しているWebアプリに対して、自身のFirefoxから確認を行う場合は
EXTENSION.txtに以下のように記載します。

127.0.0.1

例えば本番前テストの時に、検証サーバに対して複数の社内LAN環境から確認を行う場合は
EXTENSION.txtに以下のように記載します

192.168.0.0/16

改行区切りで複数のアドレスを書くことも出来ます。

127.0.0.1
192.168.0.0/16

また、ゲートウェイサーバからのリクエストを判断するために利用している
mobyletが保持するキャリア毎のゲートウェイIPアドレスリストは(頻繁にではないものの)
定期的に更新する必要がありますのでご注意ください。
ゲートウェイIPアドレスリストについてはこちら

Apache等のWebサーバ側でIP制限を行う

Apache等、Webサーバのhttpd.confにて、Aloow from/Deny fromの設定を行い、
特定のIPアドレス(ゲートウェイサーバのIPアドレス)のみ許可するような設定を行うことができます。

この場合、該当しないIPアドレスからの要求は全て受け付けないため、セキュリティ的には強固になりますが
モバイルクローラー(SEO観点)がアクセス出来ないことや、非会員画面なども閲覧出来なくなるため、
コンテンツのポリシー如何では、サービス影響が出る場合もあります。
(クローラーのIPも管理可能ですが、非公式なIPがあったり、管理IP数が多くなるため、運用コストが高くなります)

mobyletのセッション機構を使う

mobyletのセッション機構を利用するための設定

mobyletのセッション機構はUID/GUIDをベースとした(jsessionidを利用しない)セッション機構です。
Webアプリサーバの冗長構成にも対応しており、ID偽装等のセキュリティに対しても柔軟に設定可能です。
基本的な設定はこちら

mobyletセッションの使い方

4つのデリゲートメソッドを利用する

セッション情報を格納する(データクラス単位で格納可能)

SessionUtils.set("ABC"); //String型で格納

セッション情報を取得する(データクラス単位で取得可能)

String session = SessionUtils.set(String.class); //String型のセッションを取りだす

セッション情報を削除する(データクラス単位で削除)

SessionUtils.remove(String.class); //String型で格納しているインスタンスを削除

セッション情報を削除する(ID単位で削除)

SessionUtils.invalidate(); //UID/GUIDに紐付くセッションを全消去
ページのTOPへ戻る