node中的cookie的具体使用


Posted in Javascript onSeptember 13, 2018

为什么需要cookie

我们知道http是无状态的协议,无状态是什么意思呢?

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

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

cookie是什么

简单来说,cookie就是标识。

严格来说,cookie是一些存储在客户端的信息,每次连接的时候由浏览器向服务器递交,服务器也向浏览器发起存储 Cookie 的请求,依靠这样的手段,服务器可以识别客户端。

具体来说,浏览器首次向服务器发起请求时,服务器会生成一个唯一标识符并发送给客户端浏览器,浏览器将这个唯一标识符存储在 Cookie 中,之后每次发起的请求中,客户端浏览器都会向服务器传送这个唯一标识符,服务器通过这个唯一标识符来识别用户。

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

node中的cookie的具体使用

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

常规cookie

光看不过瘾,接下来,用node动手来做一个常规cookie吧。

首先,安装express框架和cookieParser中间件

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

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

  1. 解析来自浏览器的cookie,放到req.cookies中;
  2. 针对签名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。如下:

node中的cookie的具体使用

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

node中的cookie的具体使用

总结

你可以在cookie中存放任意类型的文本数据,但通常是在客户端存放一个会话cookie,这样你就能在服务器端保留完整的用户状态。

session

session和基于cookie的。 存在于服务器,相对cookie安全,但session也存在session劫持的风险, 所以需要一串很长很多的秘钥数组来增加破解的难度。同时设置manAge过期时间, 减少留给坏人破解时间。

node中有的中间件 是cookie-session

const express = require('express');
const cookieParser = require('cookie-parser');
const cookieSession = require('cookie-session');

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

//cookieSession 必须放在cookieParser后面
app.use(cookieSession({
 //session的秘钥,防止session劫持。 这个秘钥会被循环使用,秘钥越长,数量越多,破解难度越高。
 keys: ['aaa', 'bbb', 'ccc'],
 //session过期时间,不易太长。php默认20分钟
 maxAge: 60*60,
 //可以改变浏览器cookie的名字
 name: 'session'
}));

app.use('/', function (req, res) {

 //假设使用count记录用户访问的次数
 if(req.session['count'] == null) {
  req.session['count'] = 1;
 }else{
  req.session['count']++;
 }
 console.log(req.session['count'])
 res.send('ok')
})
app.listen(8080)

//删除 delete req.session

浏览器中可以看到,服务器通过respond的set-cookie返回cookie

node中的cookie的具体使用

session是返回的cookie ID, session.sig 是session签名,作用是知道session是否被修改过

node中的cookie的具体使用

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
关于可运行代码无法正常执行的使用说明
May 13 Javascript
网页中CDATA标记的说明
Sep 12 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
Aug 03 Javascript
十个迅速提升JQuery性能让你的JQuery跑得更快
Dec 10 Javascript
解析Javascript小括号“()”的多义性
Dec 03 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
利用js获取下拉框中所选的值
Dec 01 Javascript
基于Jquery Ajax type的4种类型(详解)
Aug 02 jQuery
JS实现预加载视频音频/视频获取截图(返回canvas截图)
Oct 09 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
May 29 Javascript
Vue实现日历小插件
Jun 26 Javascript
开发一个封装iframe的vue组件
Mar 29 Vue.js
vue动态改变背景图片demo分享
Sep 13 #Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
Sep 13 #Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
Sep 13 #Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
Sep 13 #Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
Sep 13 #Javascript
解决vuejs项目里css引用背景图片不能显示的问题
Sep 13 #Javascript
Vue-不允许嵌套式的渲染方法
Sep 13 #Javascript
You might like
提升PHP执行速度全攻略(上)
2006/10/09 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
使用jQuery动态加载js脚本文件的方法
2014/04/03 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
jQuery中closest和parents的区别分析
2015/05/07 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
jsonp实现百度下拉框功能的方法分析
2019/05/10 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
[09:47]2018DOTA2亚洲邀请赛4.5SOLO赛 No[o]ne vs Sumail
2018/04/06 DOTA
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
Pytorch的mean和std调查实例
2020/01/02 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
python标准库OS模块详解
2020/03/10 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
护理专业学生的求职信范文
2013/12/11 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
趵突泉导游词
2015/02/03 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
幼师必备:幼儿园期末教师评语50条
2019/11/01 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis