cookie和session的区别和使用

因为http是一种不保存状态的协议,即无状态协议。HTTP协议自身不对请求和相应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求和相应都不做持久化处理。这就表示每次刷新都需要重新登录,十分麻烦。所以服务端为了处理这个麻烦出现了cookie和session.

cookie和session的区别
cookie数据存放在客户的浏览器上,session数据存放在服务器上。
cookie不是很安全,用户可以修改并且进行cookie欺骗。session相对安全。
session会在一定时间内保存在服务器上。当访问增多,会占用服务器的性能。
单个cookie保存的数据不能超过4096子节,而且很多浏览器都限制cookie的数量。
最后建议将重要的登录信息等存发为session,其他需要保留的信息可以存放在cookie中。

  1. 在node中使用cookie
    cookie的设置是服务器会返回一个set-cookie的消息,通知浏览器要设置cookie了,于是浏览器会根据set-cookie里的字段来设置信息了
    安全性
    cookie将信息保存在客户端,如果不进行加密的话,无疑会暴露一些隐私信息,安全性很差,一般情况下敏感信息是经过加密后存储在cookie中,但很容易就会被窃取。而session只会将信息存储在服务端,如果存储在文件或数据库中,也有被窃取的可能,只是可能性比cookie小了太多。
    Session安全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁,这在下文会进行更详细的说明。总体来讲,session的安全性要高于cookie;

性能
Cookie存储在客户端,消耗的是客户端的I/O和内存,而session存储在服务端,消耗的是服务端的资源。但是session对服务器造成的压力比较集中,而cookie很好地分散了资源消耗,就这点来说,cookie是要优于session的;
时效性
Cookie可以通过设置有效期使其较长时间内存在于客户端,而session一般只有比较短的有效期(用户主动销毁session或关闭浏览器后引发超时);
其他
Cookie的处理在开发中没有session方便。而且cookie在客户端是有数量和大小的限制的,而session的大小却只以硬件为限制,能存储的数据无疑大了太多。
在express中读取cookie(cookie-parser)

//引入cookie-parser 框架,读取客户端发送的cookie

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

let app = express();
//这点很重要,如果没有,下面的req.cookies 会返回undefined
app.use(cookieParase());

app.use('/', function (req,res) {
    res.cookie('name', '111111');
    console.log(req.cookies);
    res.send('ok')
})

app.listen(8080)

发送cookie,直接使用res.cookies();即可
cookie的一些常用属性:

name=value:键值对,可以设置要保存的 Key/Value,注意这里的 name 不能和其他属性项的名字一样
Expires: 过期时间(秒),在设置的某个时间点后该 Cookie 就会失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT
maxAge: 最大失效时间(毫秒),设置在多少后失效
secure: 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效
Path: 表示 cookie 影响到的路,如 path=/。如果路径不能匹配时,浏览器则不发送这个Cookie
httpOnly:是微软对COOKIE做的扩展。如果在COOKIE中设置了“httpOnly”属性,则通过程序(JS脚本、applet等)将无法读取到COOKIE信息,防止XSS攻击产生。

const express = require('express');
let app = express();
app.use('/aaa/a.html',function(req,res){//只能对aaa目录下的a.html起作用
    res.cookie('name','11111',{
    path:'/aaa',
    maxAge:1*24*3600*1000
    });
    res.send('ok');
});
server.listen(8080);

删除cookie

res.clearCookie('name');

cookie签名
我们可以通过cookie签名来简单的防止cookie中的数据在客户端进行修改。

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

//随机生成的秘密字符串
const signStr = 'okokkokokokokokokok'

let app = express();

//需要将密匙传给cookieParser, 在接收数据的时候,进行解析。
app.use(cookieParser(signStr));

app.use('/', function (req, res) {
    //将密匙字符串赋值给req.secret,可以省略,在上面cookieparser()时会自动对secret赋值
    req.secret=signStr;

    //返回给浏览器的cookie, 这就是传说中的种cookie了
    //如果需要开启签名,第三个参数对象signed 设置为true.
    //由于cookie的大小限制4k,而签名后的cookie体积会增加,所以重要的cookie才签名
    res.cookie('cookiename', 'akueq', {signed: true, maxAge: 3600})

    //有没有签名的cookie,获取方式不一样。
    console.log('无签名', req.cookies);
    console.log('带签名',req.signedCookies);
    res.send('ok')
})
app.listen(8080);

这样如果客户端对cookie进行修改,就不会通过服务端的验证,一定程度上可以保证安全。但是非常隐私的数据还是建议session来存储。(因为这样还是没有对数据进行加密)
session
session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而session保存在服务器上。

客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

使用session需要单独安装 express-session 模块

session(options)有可一些选的参数:
name: 设置 cookie 中,保存 session 的字段名称,默认为 connect.sid 。
store: session 的存储方式,默认存放在内存中,也可以使用 redis,mongodb 等。express 生态中都有相应模块的支持。
secret: 通过设置的 secret 字符串,来计算 hash 值并放在 cookie 中,使产生的 signedCookie 防篡改。
cookie: 设置存放 session id 的 cookie 的相关选项,默认为 (default: { path: ‘/’, httpOnly: true, secure: false, maxAge: null })
genid: 产生一个新的 session_id 时,所使用的函数, 默认使用 uid2 这个 npm 包。
rolling: 每个请求都重新设置一个 cookie,默认为 false。
resave: 即使 session 没有被修改,也保存 session 值,默认为 true。

//配置session
const express = require('express');
const session = require('session');
let app = express();
 
app.use(session({
    secret: 'this is the secret for cookie',
    resave: false,
    saveUninitialized: true
    cookie: {maxAge: 60 * 1000 * 30} // 过期时间(毫秒)
}));

app.get('/', function (req, res) {
    if (req.session.sign) {//检查用户是否已经登录
        console.log(req.session);//打印session的值
        res.send('ok');
    } else {//否则展示index页面
        req.session.sign = true;
        req.session.name = 'wodewangzhan';
        res.end('welcome');
    }
});
app.listen(8080);

//获取session数据
let user = req.session.user;
console.dir(user);//打印该对象的所有属性和属性值

//清除session
req.session.destroy(function(err) {
    res.redirect('/');
})
  • 总结
    1.用户端
    一般来说应该使用https,而且密码绝不能在网络中明文传输,因此在往服务器传输时就应该先加密,常见的md5,但md5被破解,因此可以用SHA512来加密 SHA256(password)

2 服务端
服务端需要对密码再进行加密,因为所有客户端的东西都是不安全的,万一你的网络被监听了呢,因此会进行 SHA512(username+SHA512(password)+sault)的加密,这里的sault为随机数,防止被脱库了后被猜出密码,所以需要附加一个随机数,这个sault最好是存放到另外的数据库中,防止因为存到一个库中被脱库中猜出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值