Rails Rack RedisStore SessionId生成の仕組み

RailsのSessionでRedisStoreを使用している時
ブラウザのクッキーに保存されるvalueとRedisのkeyとの関係性が全くわからなかったので調査した。

ライブラリはこれ。

Qiitaやドキュメントとかには全然情報がなかった。
調べるのに半日以上使ったので消えないように、その時の内容の書き溜め。

「Redisに保存する!」って記事は結構あったんだけど、
どう紐付いているかについて説明していたり調べている記事がなかったのでソースコード追っかけた。

先に結論から

広告

結論

private_idがredis側に保存されるkeyになる。
public_idはブラウザ側に渡されるvalue

Digest::SHA256.hexdigestでprivate_idを生成している

Redisから直接セッション情報を取得する場合

Redisから直接セッション情報を取得する場合は下記のようになる。
ブラウザのCookievalueを取得したらしっかり参照できた。

やったぜ。



こっからは興味ある人だけでいいと思います。

調査記録

記載がバラバラなので興味ある人だけ読んでください。
Sessionの取得は上で確認できるので。

private_idがredis側に保存されるkeyになる。

public_idはブラウザ側に渡されるvalue

private_idの実装は下記

hash_sidというメソッドは下記、
sidというpublic_idを渡してprivate_idを生成するために使っている。

RedisActionpackでRack::Session::SessionId.new()をおこなっている。
superで何を渡しているかよくわからないので追っかける必要あり。

generate_unique_sidの中で、

sessionの再読み込み書き部分

つまり、
ブラウザのsessionのvalueを
Digest::SHA256.hexdigest(value)で16進数でSHA256ハッシュ変換すると
redisのkeyにたどり着くわけだ。



大変だった。
じゃあね〜〜。