cookie、session
cookie:在浏览器保存一些数据,每次请求都会带过来
*不安全、有限(4K)
session:保存数据,保存在服务端
*安全、无限
--------------------------------------------------------------------------------------------------------------
session:基于cookie实现的
*cookie中会有一个session的ID,服务器利用sessionid找到session文件、读取、写入
隐患:session劫持
cookie:
1.cookie空间非常小——省着用
2.安全性非常差——校验cookie是否被篡改过
用法:
a.发送cookie
res.secret='字符串'; //秘钥,对cookie加密 res.cookie(名字, 值, {path: '/', maxAge: 毫秒, signed: true});
// path:路径,maxAge:过期时间,signed:是否加密
b.读取cookie
cookie-parser中间件 server.use(cookieParser('秘钥')); server.use(function (){ req.cookies 未签名版 req.signedCookies 签名版 });
c.删除cookie
res.clearCookie(名字);
举例:
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.clearCookie('user');
res.send('ok'); }); server.listen(8080);
session:
cookie-session中间件
cookieSession(options)
name
要设置的Cookie的名称,默认为session
。
keys
用于签署和验证Cookie值的键列表。
secret
如果keys
没有提供,将用该字符串做标记。
Cookie Options
其他选项传递给 cookies.get()
和 cookies.set()
,允许你控制secure、path、domain,并签署其他设置。
这些选项还可以包含以下任何内容(有关完整列表,请参阅 cookies模块文档:
maxAge
:表示Date.now()
到期的毫秒数expires
:Date
指示Cookie过期日期的对象(默认情况下在会话结束时过期)。path
:指示cookie路径的字符串(/
默认情况下)。domain
:表示cookie的域的字符串(无默认)。sameSite
:一个布尔值或字符串,指示cookie是否为“相同站点”cookie(false
默认情况下)。这可以设置为'strict'
,,'lax'
或true
(映射到'strict'
)。secure
:一个布尔值,指示cookie是否仅通过HTTPS发送(false
默认为HTTPtrue
默认情况下为HTTPS)。如果这样设置,true
并且Node.js不是直接通过TLS连接,请务必阅读如何在代理之后设置Express,否则Cookie可能无法正确设置。httpOnly
:一个布尔值,表示cookie是否仅通过HTTP(S)发送,并且不提供给客户端JavaScript(true
默认情况下)。signed
:一个布尔值,表示cookie是否要被签名(true
默认情况下)。如果是这样的话,.sig
还会发送一个带附加后缀的同名的另一个cookie ,一个27字节的url-safe base64 SHA1值代表第一个Keygrip键的cookie-name = cookie-value的哈希值。此签名密钥用于在下次接收到Cookie时检测篡改。overwrite
:一个布尔值,表示是否覆盖以前设置的相同名称的cookie(true
默认情况下)。如果这是真的,在设置此Cookie时,将在同一请求中设置相同名称的所有Cookie(不管路径或域)是否从Set-Cookie头部中过滤掉
1.写入
server.use(cookieParser());
server.use(cookieSession({
keys: [.., .., .., ..]
}));
2.读取
server.use('/', function (){ req.session });
2.删除
delete req.session
req.session = null
举例:
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); res.send('ok'); }); server.listen(8080);
--------------------------------------------------------------------------------------------------------------