- PR -

[Servlet] セッションデータのHTTP・HTTPS間のセキュアな共用

1
投稿者投稿内容
masa
会議室デビュー日: 2004/09/30
投稿数: 3
投稿日時: 2004-09-30 11:16
現在、IBM WebSphere + Jakarta Strutsベースでショッピングサイトの開発を計画しているのですが、ショッピングカートに商品を追加/照会するページまでは暗号化せずにHTTPのまま行い、注文ページから初めてHTTPSとして暗号化(SSL)することを考えています。

その場合、HTTPで開始されたセッションをHTTPSでも引き続き使用する必要がありますが、暗号化されていないHTTPで発行したCookieのみでセッション管理を行うことはセキュリティ上の問題があります。(「Cookie盗聴によるWebアプリケーションハイジャックの危険性とその対策」http://securit.gtrc.aist.go.jp/research/paper/AIST03-J00017/)
かといって、セッション管理用Cookieにsecure属性を付けてしまうと、暗号化されないHTTPではカート内容を見ることができなくなってしまうのではないかと考えています。

BEA WebLogicにはHTTPで開始されたセッションをHTTPSでセキュアに使用できる便利な機能(「セキュアなクッキーを使用したセッション盗難の防止」http://edocs.beasys.co.jp/e-docs/wls/docs81/security/thin_client.html#1049782)があるのですが、WebSphere(v5.1)、またはStruts(v1.1)にも同様の機能は存在するでしょうか。

APサーバのセッション管理機能では対応できない場合には独自に対策する必要がありますが、その場合、どのような方式が考えられるでしょうか。
私は現在のところ、アプリケーションサーバが自動的に発行するセッション管理用のCookie(JSESSIONID)にはsecure属性を付けずにHTTPとHTTPSの両方で共用可能としておき、HTTPSにおいてはさらにsecure属性付きのCookieを発行して独自にチェックする方式を考えていますが、問題ないでしょうか。

ショッピングカートへの追加や照会の時点からすでにHTTPSで暗号化し、セッションデータに触るのは必ずHTTPSとすることも検討したのですが、カートの内容をどのページにも常時出力するという要件があり、そうなるとサイト全体をHTTPSとしなければならなくなってしまうため断念しました。
他のショッピングサイトでも、ショッピングカートの追加・照会までのセッションはHTTPSでなくHTTPで行っているものが多いようでした。

カート追加/照会まではHTTPのサイト
アマゾン(http://www.amazon.co.jp/)
楽天(http://www.rakuten.co.jp/)
Yahoo!(http://shopping.yahoo.co.jp/)

カート追加/照会から既にHTTPSのサイト
イオン(http://www.aeonshop.com/)

[ メッセージ編集済み 編集者: masa 編集日時 2004-09-30 11:53 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-10-01 06:16
(私が知る限り) Struts にはそういった機能はないですね。
WebSphere はどうなんでしょう・・。

対応方法についてはご指摘の通り WebLogic と同様に別途セキュアなクッキーを設ける方法で問題ないはずです。

[ メッセージ編集済み 編集者: インギ 編集日時 2004-10-01 06:16 ]
masa
会議室デビュー日: 2004/09/30
投稿数: 3
投稿日時: 2004-10-02 10:29
インギさん、ご回答ありがとうございます。
やはりStrutsにはないですか。

WebSphereについてですが、私も探してみたのですが、どうもこちらもないようです。やはり、独自に実装する必要があるようです。

> アプリケーションサーバが自動的に発行するセッション管理用のCookie
> (JSESSIONID)にはsecure属性を付けずにHTTPとHTTPSの両方で共用

WebSphereでは管理コンソールから、「サーバー」>「アプリケーション・サーバー」>「server_name」>「Web コンテナー」>「セッション管理」>「Enable Cookies」>「セキュア Cookie」でsecure属性を付けないように設定できるようです。
http://publib.boulder.ibm.com/infocenter/ws51help/topic/com.ibm.websphere.base.doc/info/aes/ae/uprs_rcookie_settings.html

> HTTPSにおいてはさらにsecure属性付きのCookieを発行して独自にチェックする

具体的には以下のような方式を考えています。javax.servlet.Filterかorg.apache.struts.action.RequestProcessorで処理してしまえば、個々のServletで意識する必要はなさそうです。実際に検証してはいませんが。

・HTTPSでリクエストがあり、かつSessionオブジェクトにセキュアチェック用のIDが未登録の場合、ユニークなIDを生成してSessionオブジェクトに登録し、また、Cookieにsecure属性付きで設定(javax.servlet.http.Cookie#setSecure()したCookieをjavax.servlet.http.HttpServletResponse#addCookie())する。生成するIDはSHA1等で変換(java.security.MessageDigestとかで)して予測不可能な文字列にする。
・HTTPSでリクエストがあり、かつSessionオブジェクトにセキュアチェック用のIDが登録済の場合、Cookieとしてクライアントから送信されたIDとSessionオブジェクトのIDを比較してチェックし、相違するならエラーページを表示する。
masa
会議室デビュー日: 2004/09/30
投稿数: 3
投稿日時: 2004-10-02 13:13
> アプリケーションサーバが自動的に発行するセッション管理用のCookie
> (JSESSIONID)にはsecure属性を付けずにHTTPとHTTPSの両方で共用可能と
> しておき、HTTPSにおいてはさらにsecure属性付きのCookieを発行して独自
> にチェックする

上記やり方はWebSphereでは問題ないのですが、TomcatだとJSESSIONIDにsecure属性を付けない指定ができず、HTTPSの場合は必ずsecure属性になってしまうようです。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5722&forum=12
今回の案件はWebSphereなのでとりあえず構わないですが。

JSESSIONIDへのsecure属性の有無設定はServletの仕様ではなく、APサーバ製品の独自仕様みたいですね。セキュアCookieチェックの処理をフレームワーク化して将来開発する他のシステムでも使いまわしたいと考えていたのですが、移植性に問題がありそうです。まあ、Tomcatはオープンソースなので、自分で改造してしまえば使えるでしょうけど。
1

スキルアップ/キャリアアップ(JOB@IT)