咱们知道http
是无状态的协议,无状态是什么意思呢?
我来举一个小例子来讲明:好比小明在网上购物,他浏览了多个页面,购买了一些物品,这些请求在屡次链接中完成,若是不借助额外的手段,那么服务器是不知道他到底购买了什么的,由于服务器压根就不知道每次请求的究竟是不是小明,除非小明有一个标识
来证实他是小明。node
因此,网站为了辨别用户身份,进行 session 跟踪,cookie出现了。chrome
简单来讲,cookie就是标识。
严格来讲,cookie是一些存储在客户端
的信息,每次链接的时候由浏览器向服务器递交,服务器也向浏览器发起存储 Cookie 的请求,依靠这样的手段,服务器能够识别客户端。
具体来讲,浏览器首次向服务器发起请求时,服务器会生成一个惟一标识符
并发送给客户端浏览器,浏览器将这个惟一标识符存储在 Cookie 中,以后每次发起的请求中,客户端浏览器都会向服务器传送这个惟一标识符,服务器经过这个惟一标识符来识别用户。express
说了这么多,打开浏览器,咱们先来看看这货吧。npm
上图中,就是浏览器中存的一个cookie,他的名字叫name,值为abc。浏览器
光看不过瘾,接下来,用node动手来作一个常规cookie吧。
首先,安装express框架和cookieParser中间件服务器
npm i express --save npm install cookie-parser --save
cookieParser中间件的主要用途以下:cookie
代码以下:session
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放在req.signedCookies
对象中。app
代码以下:
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中间件
进行介绍和说明,感谢您的阅读,🍪🍪🍪