セッションIDを生成するところ
アプリケーションサーバーやフレームワークがセッションIDを生成しているコードを見て、特にランダム値を使用している箇所についてメモします。
WildFly 22.0.1.Final
セッションIDを生成しているコードはSecureRandomSessionIdGenerator.createSessionId()です。
長さが30のバイト配列にランダム値を格納し、URLセーフなBase64[1]でエンコードしています。
Tomcat 9.0.43
セッションIDを生成しているコードはStandardSessionIdGenerator.generateSessionId()です。
親クラスはSessionIdGeneratorBaseです。
長さが16のバイト配列にランダム値を格納し、16進数表記にしています。
jvmRoute[2]を繋いだりもしていますが、ランダム値ではないので無視します。
Jetty 9.4.38.v20210224
セッションIDを生成しているコードはDefaultSessionIdManager.newSessionId()です。
一見するとややこしそうな雰囲気ですが、SecureRandomではなくRandomを使わざるを得ない場合に工夫して安全性を高めようとしているようです(たぶん)。
SecureRandomが使える場合は、まずSecureRandom.nextLong()で得た値をLong.toString(value, 36)したものを2つ繋げます。
このときSecureRandom.nextLong()で得た値が0未満であれば符合を反転させます。
それからカウンターから得た値を繋げます。
このカウンターはセッションIDを生成する毎にカウントアップされるAtomicLongです。
カウンターの値は10進数表記です。
(ランダム値ではないけれど、可変のためメモしておきました)
ノードのIDを繋いだりもしていますが、ランダム値ではないので無視します。
Spring Session 2.4.2
セッションIDを生成しているコードはMapSession.generateId()です。
バージョン4のUUIDを返しています。
ランダム値のビット数まとめ
| APサーバー・フレームワーク | ランダム値のビット数 |
|---|---|
| WildFly 22.0.1.Final | 240ビット |
| Tomcat 9.0.43 | 128ビット |
| Jetty 9.4.38.v20210224 | 約126ビット[3] |
| Spring Session 2.4.2 | 122ビット |
Discussion