Cookie和Session在Node.JS中的实践(三)
根据cookie篇中的说法,这个时候在响应首部(Response)应该会有Set-Cookie字段(在第一篇中有写到)

path对COOKIE访问的影响
domain和path字段结合起来就能限制浏览器对COOKIE的访问,在domain都是默认的情况下(一般而言都是根域名),只有path起作用,在COOKIE篇,用博客园为例说明了,在此我们可以用自己的代码说明,在上述代码中我们设置COOKIE的path值为path: '/cnblogs/wljqds',其实只要理解一点下级目录可以用上级目录的cookie,反之不可则容易了,为了说明这种情况,相对上述代码添加一个上级目录路由以及一个下级目录。
const express = require('express'); var server = express(); // 相对path: '/cnblogs/wljqds'来说,/是上级目录 server.use('/', (req, res) => { res.send('ok'); }); // 相对path: '/cnblogs/wljqds'来说,/cnblogs/wljqds/article是下级目录 server.use('/cnblogs/wljqds/article', (req, res) => { res.send('ok'); }); server.listen(8080);在运行代码前,我有必要说明一点:前面我们已经保存了一个cookie了,这时候我们只是去查看cookie,验证path对cookie的限制。
首先,是根路径是否能访问cookie,访问根路径localhost:8080/

在localhost:8080根路径下,没有任何的cookie,说明上级不能访问下级的cookie。
另外一个在此由于篇幅问题不在演示,读者们可以用代码自己尝试,记住一点:cookie对下级目录可以访问,但上级不可以。
设置COOKIE签名
其实在COOKIE篇中,有一个非常重要的概念没有谈及,那就是COOKIE签名,一些重要的信息保存在COOKIE,这时候是要COOKIE的。在这里补充知识,并且说明如何设置COOKIE签名。
首先COOKIE签名的作用是防止COOKIE被篡改!,通过在服务端验证签名从而能做到防止COOKIE篡改。
函数签名这个概念,需要从两个方面理解:
1.服务端把一个带签名COOKIE发送到客户端:服务端会生成一个秘钥,再使用加密算法比如HMAC-SHA256算法对COOKIE数据和秘钥一起加密得到一个签名,然后将这个签名加到COOKIE中,再发送给客户端。

2.服务端对客户端发送过来的COOKIE进行签名检验:当客户端再次发起请求的时候会将这个已经签名的COOKIE一起发送到服务器中,服务器中会把之前生成的秘钥跟COOKIE数据再次通过相同的算法进行加密,得到一个签名,再与发送过来的签名作对比,如果签名不相等,则证明COOKIE已经被篡改了!

通过上述的原理,代码实现COOKIE签名
const express = require('express'); const cookieParse = require('cookie-parser'); var server = express(); // 添加一个秘钥,通过秘钥生成签名与验证 server.use(cookieParse('qvqonvpasvoqsgf')); server.use('/cnblogs/wljqds', (req, res) => { // 给客户端返回一个cookie res.cookie('user', 'wljqds', { path: '/cnblogs/wljqds', maxAge: 20*60*1000, signed: true //设置签名为true }); // 使用signedCookies,而不是cookies.因为是签名的COOKIE console.log(req.cookies); res.send('ok'); }); server.listen(8080);控制台中输出: { user: 'wljqds' },浏览器中查看COOKIE,COOKIE值已经是加了一串签名。

读取COOKIE
读取cookie用到一个中间件cookie-parser,非常简单,需要注意一点就是。如果是签名的COOKIE,必须使用req.signedCookies。
const express = require('express'); const cookieParse = require('cookie-parser'); var server = express(); server.use(cookieParse()); server.use('/cnblogs/wljqds', (req, res) => { // 给客户端返回一个cookie res.cookie('user', 'wljqds', { path: '/cnblogs/wljqds', maxAge: 20*
