资讯专栏INFORMATION COLUMN

node中的cookie

NicolasHe / 2724人阅读

摘要:如果请求中没有,这两个对象都是空的。签名签名更适合敏感数据,因为用它可以验证数据的完整性,有助于防止中间人攻击。有效的签名放在对象中。如果这个签名的值被篡改,那么服务器上对的解签会失败,在中输出的将为。

为什么需要cookie

我们知道http是无状态的协议,无状态是什么意思呢?
我来举一个小例子来说明:比如小明在网上购物,他浏览了多个页面,购买了一些物品,这些请求在多次连接中完成,如果不借助额外的手段,那么服务器是不知道他到底购买了什么的,因为服务器压根就不知道每次请求的到底是不是小明,除非小明有一个标识来证明他是小明。

所以,网站为了辨别用户身份,进行 session 跟踪,cookie出现了。

cookie是什么

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

说了这么多,打开浏览器,我们先来看看这货吧。

上图中,就是浏览器中存的一个cookie,他的名字叫name,值为abc。

常规cookie

光看不过瘾,接下来,用node动手来做一个常规cookie吧。
首先,安装express框架和cookieParser中间件

npm i express --save
npm install cookie-parser --save

cookieParser中间件的主要用途如下:

解析来自浏览器的cookie,放到req.cookies中;

针对签名cookie,对cookie签名和解签

代码如下:

var express = require("express");
var cookieParser = require("cookie-parser");

var app = express();
app.use(cookieParser());

app.use(function (req, res) {
  if (req.url === "/favicon.ico") {
    return
  }

  // 设置常规cookie, 有效期为20s, 客户端脚本不能访问它的值
  res.cookie("name", "abc", { signed: false, maxAge: 20 * 1000, httpOnly: true });
  console.log(req.cookies, req.url, req.signedCookies);

  res.end("hello cookie");
})

app.listen(4000)

运行后,在浏览器中打开 http://localhost:4000/
以chrome为例,f12打开浏览器调试工具,在application中的cookies中便能发现你定义的cookie。
req.cookies和req.signedCookies属性是随http请求发送过来的请求头中的Cookie的解析结果。
其中,req.cookies对应的是普通cookie,req.signedCookies对应的是签名cookie。
如果请求中没有cookie,这两个对象都是空的。

签名cookie

签名cookie更适合敏感数据,因为用它可以验证cookie数据的完整性,有助于防止中间人攻击。
有效的签名cookie放在req.signedCookies对象中。

代码如下:

var express = require("express");
var cookieParser = require("cookie-parser");

var app = express();

// 设置密钥,用来对cookie签名和解签, Express可以由此确定cookie的内容是否被篡改过
app.use(cookieParser("a cool secret"));

app.use(function (req, res) {
  if (req.url === "/favicon.ico") {
    return
  }

  // 设置签名cookie, 并且有效期为1min
  res.cookie("name", "efg", { signed: true, maxAge: 60 * 1000, httpOnly: true });
  console.log(req.cookies, req.url, req.signedCookies);

  res.end("signed cookie");
})
app.listen(4000)

运行后,在浏览器中打开 http://localhost:4000/
以chrome为例,f12打开浏览器调试工具,在application中的cookies中便能发现你定义的签名cookie,格式如下:s%3Aefg.7FJDuO2E9LMyby6%2Bo1fGQ3wkIHGB9v1CDVWod8NQVAo
.号左边是cookie的值,右边是服务器上用SHA-1 HMAC生成的加密哈希值。
如果这个签名cookie的值被篡改,那么服务器上对cookie的解签会失败,在node中输出的req.signedCookies将为false。如下:

而如果cookie完好无损地传上来,那么将会被正确解析:

总结

你可以在cookie中存放任意类型的文本数据,但通常是在客户端存放一个会话cookie,这样你就能在服务器端保留完整的用户状态。
这项会话技术封装在session中间件中,下一篇我将对express-session中间件进行介绍和说明,感谢您的阅读,

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97708.html

相关文章

  • node中的session

    摘要:当会话过期或被放弃后,服务器将终止该会话。原来中间件生成的是一个对象,里面包含了信息。这个有一个过期时间,比如,上面代码中设置的是小时。也就是说,小时后,这个在浏览器中会自动消失。 前言 在上一篇中node中的cookie,对cookie进行了相关介绍,本篇将继续前行,对session进行说明。 session是什么 session不就是会话嘛,那什么是会话呢?会话是一个比连接粒度更大...

    yankeys 评论0 收藏0
  • node中的session

    摘要:当会话过期或被放弃后,服务器将终止该会话。原来中间件生成的是一个对象,里面包含了信息。这个有一个过期时间,比如,上面代码中设置的是小时。也就是说,小时后,这个在浏览器中会自动消失。 前言 在上一篇中node中的cookie,对cookie进行了相关介绍,本篇将继续前行,对session进行说明。 session是什么 session不就是会话嘛,那什么是会话呢?会话是一个比连接粒度更大...

    fredshare 评论0 收藏0
  • node.js中cookie数据丢失导致session失效问题

    摘要:问题今天刚准备用作为后端语言来开发就遇到了一个小坑,网上的资料还是比较的少,于是我决定记录下来。客户的信息都保存在中。导致问题出现的原因跨域时保存的数据丢失了因为中使用的是端口,我启的服务器用的是端口,端口不一样也就存在着跨域的问题。 问题 今天刚准备用node.js作为后端语言来开发就遇到了一个小坑,网上的资料还是比较的少,于是我决定记录下来。关于session和cookie我就不做...

    callmewhy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<