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
ちょっとおすすめしたくないですが、しょうがないのかなって感じです。