node-cookie 相关内容解析

cookie由来:

我们知道http是无状态的协议,在我们的日常业务逻辑中有些标示需要跟踪,以便完成对身份的校验,如token等, 这个时候cookie就出现了。

cookie简单来说,cookie就是标识。严格来说,cookie是一些存储在客户端的信息,每次连接的时候由浏览器向服务器递交,服务器也向浏览器发起存储 Cookie 的请求,依靠这样的手段,服务器可以识别客户端。具体来说,浏览器首次向服务器发起请求时,服务器会生成一个唯一标识符并发送给客户端浏览器,浏览器将这个唯一标识符存储在 Cookie 中,之后每次发起的请求中,客户端浏览器都会向服务器传送这个唯一标识符,服务器通过这个唯一标识符来识别用户。

cookie 防篡改

为了防止cookie 篡改我们,需要对它进行签名,这个时候我们需要app.keys

用这个来设置密钥。node 推荐使用 这些被传递给 KeyGrip

利用如下方式使用:

app.keys = new KeyGrip(['im a newer secret', 'i like turtle'], 'sha256');

app.key 设计理念

  • 那么 app.keys 为什么是设计为数组呢?先来考虑以下的一种场景,当希望更换密钥的时候,原有的的cookie都将因为密钥更新而导致校验失败,则用户的登录状态失效。一次还好,如果需要经常需要更新密钥(我一般一个月更换一次),那怎么处理好?这就是 app.keys 为配置为数组的使用逻辑了。
  • 当生成cookie时,使用keys中的第一个元素来生成,而校验的时候,是从第一个至最后一个,一个个的校验,直到通过为止,所以在更新密钥的时候,只需要把新的密钥加到数组第一位则可以。我一般再保留两组密钥,因为更新是一个月一次,因此如果客户的cookie是三个月前生成的,那就会失效了。

这些密钥可以倒换,并在使用 { signed: true } 参数签名 Cookie 时使用。

ctx.cookies.set('name', 'tobi', { signed: true });

私钥相关处理

如果有signed签名参数。每次get都会都会进行解密处理。可以认为我们将公钥放在cookie中格式为 cookieName.${sig}私钥保存在服务端。这样我们每次获取公钥使用私钥进行解密,如果发现解密出的结果和获取的cookie值不一致,则认为是被篡改了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • http协议有http0.9,http1.0,http1.1和http2三个版本,但是现在浏览器使用的是htt...
    一现_阅读 5,872评论 0 3
  • 《青门引 . 梦魇》(新韵) 日上高天醒,惊悚枕留残梦。 孤身渡水僻蒺藜,巉岩恶阻,断路列蛮横。 凭窗速检连屏影,...
    闲章杂句阅读 1,436评论 9 6
  • 原来,小时候才是最开心的时候,因为那个时候不懂的多,所以没烦恼。
    喵喵诗茵阅读 1,540评论 0 4
  • 目标:不停追求(卓)、不断翱翔(菲) 6点半起床,吃早餐。 中午搬桌子、带人到办公室交费。 小鲜肉们,为什么都不来...
    逆风追梦人阅读 669评论 0 0
  • 2018年暑假,来到了青岛,说走就走的旅行,不是有什么豪言壮志,只是单纯的因为团费(500)真的好便宜。写记录的时...
    zyd爱画画阅读 3,126评论 0 0