初窥nodejs(七) ——cookie$session

本文介绍了Web开发中Cookie和Session的基本概念及其使用方式。探讨了它们的区别、安全性问题及如何通过Node.js的Express框架来实现Cookie的发送、读取、签名与加密,以及Session的创建与使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cookie$session简介

不安全、有限(4K)
在浏览器保存一些数据,每次请求都会带过来。用户可以通过浏览器直接修改数据。

session

安全、无限
在服务端保存数据,session是基于cookie实现的。
cookie中会有一个session的ID,服务器利用sessionid找到session文件,进行数据的读取、写入。
隐患:session劫持

cookie和session的关系

这里写图片描述

cookie发送

cookie的发送可以通过res.cookie()函数实现
const express=require('express');

var server=express();

//cookie
server.use('/aaa/a.html', function (req, res){
  res.cookie('user', 'blue', {path: '/aaa', maxAge: 30*24*3600*1000});

  res.send('ok');
});

server.listen(8080);

res.cookie(‘user’, ‘blue’, {path: ‘/aaa’, maxAge: 30*24*3600*1000});

res.cookie有4个参数:
'user':键
'blue':值
path: '/aaa',表示cookie在/aaa路径下
maxAge: 30*24*3600*1000,maxAge表示cookie生存周期,单位为毫秒。这里是一个月。

cookie读取

这里需要借助中间件cookie-parser

它的作用是捕获cookie并赋值给req.cookies

只能读取当前路径或下级路径的路径。例如在path“/aaa”有cookie xxx,那么“/aaa”和“/”是可以读取xxx的,但是“/bbb”是不可读取xxx的

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

var server=express();
//cookie
server.use(cookieParser());

server.use('/', function (req, res){
  console.log(req.cookies);

  res.send('ok');
});

server.listen(8080);

cookie签名

cookie签名使得具有不可抵赖性。

cookie进行签名后,原来的数据还是可见的(签名不是加密)。签名的作用是杜绝了修改。

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

var server=express();
//cookie
server.use(cookieParser('wesdfw4r34tf'));

server.use('/', function (req, res){
  req.secret='wesdfw4r34tf';
  res.cookie('user', 'blue', {signed: true});

  console.log('签名cookie:', req.signedCookies)
  console.log('无签名cookie:', req.cookies);

  res.send('ok');
});

server.listen(8080);
req.secret='wesdfw4r34tf';                  设置签名密钥
res.cookie('user', 'blue', {signed: true}); 发送具有签名密钥的cookie
req.signedCookies;                          获得所有已签名的密钥
res.clearCookie('user');                    清除浏览器的cookie user

cookie加密

cookie是存在于浏览器的,cookie加密本身就不具有安全性。这里不加讨论

session中间件

session是基于cookie的,需要使用两个中间件:cookie-parser和cookie-session
cookie-session是强制要求设置密钥的

session密钥

    为了安全起见,session的密钥我们一般不会只指定一个,而是会设置一个数组key,里面存放上万个密钥。
    而且密钥可以是随机生成且定时修改的,这无疑大大提高了破解难度。
const express=require('express');
const cookieParser=require('cookie-parser');
const cookieSession=require('cookie-session');

var server=express();

//cookie
server.use(cookieParser());
server.use(cookieSession({
  keys: ['aaa', 'bbb', 'ccc']//以三个密钥为例
}));

server.use('/', function (req, res){
  console.log(req.session);
  res.send('ok');
});

server.listen(8080);

使用session

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

var server=express();
//cookie
server.use(cookieParser());
server.use(cookieSession({
  name: 'sess',
  keys: ['aaa', 'bbb', 'ccc'],
  maxAge: 2*3600*1000
}));

server.use('/', function (req, res){
  if(req.session['count']==null){
    req.session['count']=1;
  }else{
    req.session['count']++;
  }

  console.log(req.session['count']);

  res.send('ok');
});

server.listen(8080);

server.use(cookieSession({name: ,keys:[],maxAge:,}));

cookieSession有三个参数:
name: session名,存在cookie中
keys:密码组合
maxAge:生存周期,单位为毫秒
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值