cookie-session
rails从2.0版本以后,都默认采用了在browser的cookie中保存session数据的方式,因此保存在session中的数据不能超过4K,否则会出现CookieOverflow的例外。
在session中一般保存有user_id和flash的内容,在使用了protect_from_forgery后,还会保存有_csrf_token的字段。此外,可能还会有session_id的字段,但是由于session内容是保存在单独的cookie中,而不是数据库中,所以在使用cookie-session的时候,这个session_id并没有实际的意义。
session中的数据在保存在cookie中时是先marshal后,然后利用密码来加密的。假设session的内容是data,那么实际在cookie中的内容就会是如下形式
marshal(data)---digest_with_secret_key(marshal(data))
这里在加密时所用的secret key就是在config/initializer/session_store.rb中所设置的serect字段;而在该文件中设置的key字段,就是保存在browser中的cookie的名称。
protect_from_forgery
rails2.0以后的版本都会默认开启该选项(在application_controller.rb中),它会利用保存在cookie中的_csrf_token字段来生成自动添加在form中的隐藏字段_authenticity_token,然后利用_authenticity_token来实现CSRF的功能。