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

时间:2017-01-04 15:07:22

标签: ruby-on-rails cookies session-cookies

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

签名饼干

  

设置已签名的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

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

你想什么时候使用另一个?

2 个答案:

答案 0 :(得分:44)

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

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

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

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

答案 1 :(得分:0)

签名 Cookie

属性:可以被客户端读取,服务器防止篡改值。

用法:前端的只读值(使用 HttpOnly 没有什么意义)

通常就像加密的 cookie,但由于设计缺陷,客户端(浏览器)也需要访问其值。

我想不出合适的例子……也许在没有服务器端存储的情况下存储用户数据,同时保证其有效性? (虽然效率不高)

加密 cookie

属性:客户端获取的机密,无法读/写,将返回给服务器。

用法:克服http的无状态部分,例如会话(没有意义没有 HttpOnly

总结

我想说使用签名 cookie 总是一个糟糕的架构决定。但在极端限制下(没有服务器端存储,浏览器中没有 JavaScript)可能是唯一剩下的解决方案。