⛄️

セッションIDを生成するところ

2021/03/06に公開

アプリケーションサーバーやフレームワークがセッション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ビット
脚注
  1. + /の代わりに- _を使用するBase64です。 ↩︎

  2. スティッキーセッションを実現するためにセッションIDに付与する文字列です、たぶん。使ったことない。 ↩︎

  3. long値が2つ分ですが、0未満のときに符号を反転させているため2ビット減です。さらに仮にSecureRandom.nextLong()Long.MIN_VALUEが返された場合、-Long.MIN_VALUE == Long.MIN_VALUEなため「約」と付けています。こういうとき、どう書いたら良いのかわからない。 ↩︎

Discussion