🐟
GlassFishでセッションIDを生成してるところ
これはGlassFish Advent Calendar 2014の24日目です。
相変わらずの小ネタです。
以前調べたのですが、GlassFishでのHttpSession
実装クラスはorg.apache.catalina.session.StandardSession
で、これはTomcatのコードを利用したものですが、セッションIDの生成処理は変更されているようです。
なんやかんや辿って行くとcom.enterprise.util.uuid.UuidUtil
のgenerateUuid
メソッドに行き着きました。
コードを引用します。
//this method can take in the session object //and insure better uniqueness guarantees public static String generateUuid(Object obj) { //low order time bits long presentTime = System.currentTimeMillis(); int presentTimeLow = (int) presentTime; String presentTimeStringLow = formatHexString(presentTimeLow); StringBuilder sb = new StringBuilder(50); sb.append(presentTimeStringLow); //sb.append(":"); sb.append(getIdentityHashCode(obj)); //sb.append(":"); //sb.append(_inetAddr); sb.append(addRandomTo(_inetAddr)); //sb.append(":"); sb.append(getNextRandomString()); return sb.toString(); }
ご覧の通り、
- システム日付
- セッションオブジェクトのIdentityハッシュコード
- ローカルホストのIPアドレス
- ランダムな文字列
を繋げたものになっています。
ここから呼び出されているメソッドを細かく見て行くと7文字で切ってたりしてマジこれでセキュアなん?
とか思ってしまったりしましたが"insure better uniqueness guarantees"とか書かれてるし衝突耐性高くて大丈夫なんでしょうたぶん。
ちなみにorg.apache.catalina.session.StandardSession
はorg.glassfish.main.web:web-coreに、com.enterprise.util.uuid.UuidUtil
はorg.glassfish.main.common:common-utilに入っています。
というわけであっさりしていますが、以上。
GlassFishさん、来年もお世話になります!
Discussion