Cookie与会话
HTTP是无状态协议。用cookie和会话,在HTTP上建立状态。
cookie: 服务器发送一点消息,浏览器在一段可配置的时期内保存它。发送哪些消息确实是由服务器来决定:通常只是一个唯一ID号,标识特定浏览器,从而维持一个有状态的假象。
*cookie对用户来说不是加密的
可以加密cookie、或使用签名cookie
*用户可以删除或禁用cookie
*一般的cookie可以被篡改
确保cookie不被篡改,请使用签名cookie
*cookie可以用于攻击
跨站脚本攻击(XSS)
*如果你滥用cookie,用户会注意到
*如果可以选择,会话要优于cookie
cookiet实现:
当服务器希望客户端保存一个cookie时,它会发送一个响应头Set-Cookie,其中包含名称/值对。
当客户端向服务器发送含有cookie的请求时,它会发送多个请求头Cookie,其中包含这些cookie的值。
9.1 凭证的外化
外化第三方凭证是一种常见的做法,易于维护,还可以让你的版本控制系统忽略这些凭证文件。
9.2 Express中的Cookie
引入中间件cookie-parser
然后:
app.use(require('cookie-parser')(credentials.cookieSecret));
设置cookie或签名cookie
res.cookie('monster','nom nom');
res.cookie('signed_monster','nom nom',{signed:true});
获取客户端发送过来的cookie:
var monster = req.cookies.monster;
var signedMonster = req.signedCookies.monster;
删除cookie
res.clearCookie('monster');
9.3 检查Cookie
9.4 会话
要实现会话,必须在客户端存些东西,否则服务器无法从一个请求到下一个请求中识别客户端。通常的做法是用一个包含唯一标识的cookie,然后服务器用这个标识获取相应的会话信息。
广义上实现会话的方法:
1、把所有东西都存在于cookie里,称为“基于cookie的会话”
2、只在cookie里存一个唯一标识,其他东西都存在服务器上。
9.4.1 内存存储
安装express-session,
引入:
app.use(require('cookie-parser')(credentials.cookieSecret));
app.use(require('express-session')());
9.4.2 使用会话
req.session.userName = 'Anonymous';
var colorScheme = req.session.colorScheme || 'dark';
req.session.userName = null; //这会将“userName”设为null,但不会移除它。
delete req.session.colorScheme; //这会移除‘colorScheme’
9.5 用会话实现即显消息
9.6 会话的用途
会话最常见的用法是提供用户验证信息,你登录后就会创建一个会话,之后就不用再每次重新加载页面时再登录一次。
因为有cookie才能用会话。