HTTPとHTTPSを併用しログイン後の画面遷移はHTTPSしか許可しないサイトでの安全なセッション管理

HTTPとHTTPSを併用するサイトでの安全なセッション管理 - masaのメモ置き場 の続き
おっと、ログイン後の画面遷移はHTTPSしか許可しない前提だったら、ログイン時にSecure属性付きのセッションCookie再発行してあげれば終わりですね。前提がごっちゃになってました、ごめんなさい。

ただ、コンテナに依存しない実装を考えた場合、なかなか難しいですよ・・・
ServletだとセッションCookieの発行はコンテナの役目。従ってセッションCookieのフィールドを操作するインタフェースが公開されていないのです。コンテナの設定で対応しようとした場合、HTTPでのアクセス時にはSecure属性無しのCookieを、HTTPSでのアクセス時にはSecure属性有りのCookieを発行するように実装されていないとダメですが、実際のところどうなんでしょう??少なくとも完全にコンテナ依存の実装となってしまいます。

強引に実装するならば、以下のようなコードとなりそうです。

        if (login(userID, password)) {
            HttpSession session = request.getSession();
            Enumeration e = session.getAttributeNames();
            Map buff = new HashMap();
            while (e.hasMoreElements()) {
                String key = (String) e.nextElement();
                buff.put(key, session.getAttribute(key));
            }
            session.invalidate();
            session = request.getSession(true);
            Iterator ite = buff.keySet().iterator();
            while (ite.hasNext()) {
                String key = (String) ite.next();
                session.setAttribute(key, buff.get(key));
            }
            Cookie cookie = new Cookie("JSESSIONID",new String(session.getId()));
            cookie.setSecure(true);
            cookie.setPath(request.getContextPath())
            response.addCookie(cookie);
        }

この実装でのHTTPレスポンスヘッダはこれ

  HTTP/1.1 200 OK
  Server: Apache-Coyote/1.1
  Set-Cookie: JSESSIONID=27A8ADF8B02893ECF0C8BA5C22B89624; Path=/WebAppSec
  Set-Cookie: JSESSIONID=27A8ADF8B02893ECF0C8BA5C22B89624; Path=/WebAppSec; Secure
  Content-Type: text/html;charset=Shift-JIS
  Content-Length: 378

ちょっとおすすめしたくないですが、しょうがないのかなって感じです。