🐟

GlassFishでセッションIDを生成してるところ

2014/12/24に公開

これはGlassFish Advent Calendar 2014の24日目です。

相変わらずの小ネタです。

以前調べたのですが、GlassFishでのHttpSession実装クラスはorg.apache.catalina.session.StandardSessionで、これはTomcatのコードを利用したものですが、セッションIDの生成処理は変更されているようです。

なんやかんや辿って行くとcom.enterprise.util.uuid.UuidUtilgenerateUuidメソッドに行き着きました。

コードを引用します。

//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.StandardSessionorg.glassfish.main.web:web-coreに、com.enterprise.util.uuid.UuidUtilorg.glassfish.main.common:common-utilに入っています。

というわけであっさりしていますが、以上。

GlassFishさん、来年もお世話になります!

Discussion