Rails中签名和加密的cookie有什么区别?

ActionDispatch::Cookies的文档为签名cookie和加密cookie提供了几乎相同的描述。 看来两者都使用secrets.secret_key_base来防止客户端篡改。 http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html

签名cookies

设置已签名的cookie,以防止用户篡改其值。 Cookie由您的应用的secrets.secret_key_base值签名。 它可以使用签名方法cookies.signed[:name]来读取

 cookies.signed[:user_id] = current_user.id 

加密的cookie

在将加密的cookie值发送到客户端之前设置它,以防止用户读取和篡改其值。 Cookie由您的应用的secrets.secret_key_base值签名。 它可以使用加密的方法读取cookies.encrypted[:name]

 cookies.encrypted[:discount] = 45 

我的问题是:两者有什么区别?

你什么时候想用另一个?

这很微妙,但答案在于您提供的文档。 签名的cookie只能防止篡改,而加密的cookie可以防止读取和篡改。

更具体地说,签名cookie调用ActiveSupport::MessageVerifier将摘要(使用secret_key_base生成)附加到cookie。 如果修改了cookie的值,则摘要将不再匹配,并且在不知道secret_key_base的值的secret_key_base ,无法对cookie进行签名。 然而,cookie的值仅仅是base64编码,任何人都可以阅读。

加密的cookie称为ActiveSupport::MessageEncryptor用于在生成摘要之前实际加密cookie的值。 与已签名的cookie类似,如果修改了cookie的值,则摘要将不再匹配,但如果没有secret_key_base则无法解密cookie的值。

至于何时使用加密cookie和签名cookie,它归结为您存储在cookie中的信息的敏感性。 如果您想要防范的是有人修改cookie,那么签名 – 但如果您还需要保密数据,请对其进行加密。