valid,invalid

関心を持てる事柄について

Rails の cookie session をデコードする

staging のアプリケーションでのみ起こるバグを調査している折、どうやらセッションにちゃんと値をセットできていないぽいと気付いた。

そのアプリは cookie session を採用していたので簡単に暗号化された値は手に入ったが、これはどうやったらデコードできるんだろうと思って同僚にアドバイスを求めたら A simple script to decode Rails 4 session cookies · GitHub あたりに辿り着いた。

貼った gist だと諸々 require しているが、該当のアプリケーションの Rails console に入れれば以下で OK だった。

def decrypt_session_cookie(cookie, key)
  cookie = CGI::unescape(cookie)
  
  # Default values for Rails 4 apps
  key_iter_num = 1000
  key_size     = 64
  salt         = "encrypted cookie"         
  signed_salt  = "signed encrypted cookie"  

  key_generator = ActiveSupport::KeyGenerator.new(key, iterations: key_iter_num)
  secret = key_generator.generate_key(salt)
  sign_secret = key_generator.generate_key(signed_salt)

  encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: ActiveSupport::MessageEncryptor::NullSerializer)
  encryptor.decrypt_and_verify(cookie)
end


# Take the following value from your cookie for your web site
cookie = 'your encrypted cookie'
key = ENV['SECRET_KEY_BASE']

puts decrypt_session_cookie(cookie, key)

store が cookie でなくて memcached とかだと値を拾うための key がアプリケーションの独自ロジックで生成されたりしていてもっと大変になると思う。


余談だが、クエリストリングをセッションに格納するだけの処理がうまくいってなくておかしかったそのバグは、クエリストリングが nginx のレイヤーで落とされているために起きていた。ローカルではそのレイヤーを設けてないので再現しなかったわけだ。(本当は環境をきちんと合わせた方が良さそう)

環境