cookie什么场景下需要签名?

学习koa2的过程中,发现cookie设置有一个选项。

ctx.cookies.set('name', 'frank', { signed: true ,maxAge:7200000});

官网给出的解释是:sign the cookie value,应该可以理解成为cookie设置签名的意思。
生成的cookie如下所示:

生成age cookie的同时,也生成一个age.sig cookie,不是很理解,按照官网的意思,这是为cookie设置了一个签名。

产生2个疑问:
什么场景下需要为cookie设置签名?
什么场景下又不需要设置签名?

希望有前辈指点一下,不胜感激

阅读 10.3k
4 个回答

设置signed cookie,考虑的因素无非是安全性问题

我们知道,发送 HTTP 请求,除了浏览器,还有各种代理。
即使设置了httpOnly,这一限制只对浏览器有效,我们同样可以把cookie拿过来更改,利用其他工具发送请求。

设置signed cookie后,signed cookie的生成和校验都是在服务器端处理,对客户端不可见,因此,也就达到防止篡改cookie的目的。

这样就安全了吗?再考虑这样一个问题,cookie是明文传输的,包括signed cookie,如果cookie的值是固定的,生成的signed cookie就是一致的,下次请求时,把这个signed cookie带上,就可以请求此cookie对应的数据了。所以,最安全的做法:还是cookie中不放敏感数据。

Koa2 中,cookie功能使用这个模块:cookie ,这个模块使用:keygrip 做数据的签名和验证。

至于什么时候使用signed cookie,什么时候不用,看你的安全性的要求了。

先记住一句话:cookie sign是为了防止用户篡改cookies的值。
设置sign=true,不但会生成一个key:value,还会生成一个key.sig:djaljdeuishjkfhsdjkhfsdfjkdhsdjkhfkj;类似这样的东西。
当用户想自己修改key对应的value,目的可能是查看自己没有权限的内容,那么后面哪个key.sign的值他是没办法改的,因为是服务器通过密钥签名过的,对应的是key的value,如果篡改了value,那么服务器会知道请求携带的cookie跟我的签名key.sig不一致,就不会返回相应的内容。

通俗来说:当你需要访问者A下次来访问你的网站是你还可以认出他是访问者A的时候你就可以使用cookie。

sign the cookie value 不是“给 cookie 赋值”的意思么……

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏