翻译自:https://stormpath.com/blog/ev...Cookie因为HTTP协议是无状态的,但是很多时候需要一些信息,比如用户登录后在,再次访问网站时,无法判断用户是否已经登录。所以就有了cookies,用来在浏览器端保存用户数据。它具有以下特点:1、仅在客户端浏览器端可用。2、用于记录信息,最大4K字节。3、如果使用了cookies,那么任何对该域名的访问都会带上cookies。目前,更多的新网站使用浏览器缓存。Cookie会有一些问题。比如你每次向服务器提交请求,都会带上cookies,不管你访问静态与否。图片。Cookie示例:两个SessionSession类似于服务器端cookie,存储在服务器端,类似于服务器缓存。用户登录后总是需要认证的,所以可以在session中进行认证,session和cookie是一一对应的。session创建的顺序生成一个全局唯一的标识符(sessionid);开辟数据存储空间。一般会在内存中创建相应的数据结构,但在这种情况下,一旦系统断电,所有的session数据都会丢失。如果是电子商务网站,这种事故会造成严重的后果。但是,它也可以写入文件甚至存储在数据库中。这样虽然会增加I/O开销,但是可以使session达到一定的持久化,更有利于session的共享;会话的全局唯一标识符被发送到客户端。问题的关键在于服务器如何发送本次会话的唯一标识。结合HTTP协议,数据可以放在请求行、头字段或请求体中。基于此,一般有两种常用的方法:cookie和URL重写。ThreeSet-CookieCookie是怎么设置的?由服务器返回的请求设置。服务器会返回一个set-cookie消息,通知浏览器设置cookie,所以浏览器会根据set-cookie中的字段设置信息,比如上图中的信息会设置session=r@rdegges.com在实战中,我们以client-session(express-session基本相同)为例,为项目安装模块varsession=require('client-sessions');2配置sessionapp。使用(会话({cookieName:'会话',秘密:'random_string_goes_here',持续时间:30*60*1000,activeDuration:5*60*1000,}));1)secret:一个随机字符串,因为客户端的数据不安全,所以需要加密2)duration:session过期时间,过期必须重新设置3)activeDuration:激活时间,比如如果设置为30分钟,那么只要用户在30分钟内与服务器进行交互,就会重新激活。5.在Session中保存用户信息app.post('/login',function(req,res){User.findOne({email:req.body.email},function(err,user){if(!user){res.render('login.jade',{error:'Invalidemailorpassword.'});}else{if(req.body.password===user.password){//使用用户信息设置cookiereq.session.user=user;//这里好像有误,只是设置了session,返回sessionid,但是cookie中不会设置数据res.redirect('/dashboard');}else{res.render('login.jade',{error:'无效的电子邮件或密码'});}}});});六Session层中间件我们当然不想每次请求都加上这一段,所以我们使用express做全局配置app.use(function(req,res,next){if(req.session&&req.session.user){User.findOne({email:req.session.user.email},function(err,user){if(user){req.user=user;deletereq.user.password;//从中删除密码thesessionreq.session.user=user;//重新刷新session值s.locals.user=用户;}//完成处理中间件并运行路由next();});}else{下一个();}});如果用户逻辑必须在未登录时登录,那么我们可以继续添加路由函数requireLogin(req,res,next){if(!req.user){res.redirect('/login');}else{下一个();}};app.get('/dashboard',requireLogin,function(req,res){res.render('dashboard.jade');});七安全1我们可以重置sessionapp.get('/logout',function(req,res){req.session.reset();res.redirect('/');});还可以加一些安全性httpOnly:用来保证cookie只能通过http访问,不能用js读取secure:Mandatory使用httpsephemeral:关闭浏览器的同时关闭cookie。cookie的形式保存在客户端。当用户再次请求匹配的URL时,会将账号信息发送给服务器端,相应的程序完成自动登录等功能。当然,也可以保存一些客户端信息,比如页面布局和搜索历史等等。Session的典型应用场景是用户登录网站后,将自己的登录信息放入session中,在后续的每次请求中查询对应的登录信息,以确保用户合法。当然还有购物车等经典场景;安全cookies是在客户端存储信息,如果不加密,无疑会暴露一些隐私信息,安全性很差。通常,敏感信息被加密并存储在cookie介质中,但很容易被窃取。会话将只存储服务器端的信息。如果存储在文件或数据库中,则有可能被窃取,但这种可能性比cookie要小得多。Session安全最突出的就是session劫持问题,这是一种安全威胁,下面会详细介绍。一般来说,session的安全性要高于cookie;performancecookie保存在客户端,消耗客户端的I/O和内存,而session保存在服务端,消耗服务端的资源。但是session对服务器造成的压力比较集中,cookie是分散资源消耗的好方法。在这方面cookie比session要好;通过设置有效期,时间敏感的cookie可以在客户端存在更长的时间,而session一般只有比较短的有效期(超时发生在用户主动销毁session或关闭浏览器后);其他cookie的处理不如开发中的session方便。而且cookie的数量和大小在客户端是有限制的,而session的大小却只受限于硬件,能存储的数据无疑是太大了。我们为-1-2岁的码农建了一个前端自学QQ群。有兴趣的不妨加入:370423482继续补充,关于如何做一个完整的登录1客户端一般应该使用https,密码必须是不能在网络上明文传输,所以应该传输到服务器时先加密。普通的md5,但是md5被破解了,所以可以用SHA512加密SHA256(password)2服务端需要重新加密密码,因为客户端的东西都是不安全的。如果您的网络受到监控,它将使用SHA512(用户名+SHA512(密码)+sault)加密。这里的sault是一个随机数,以防止它被从库中删除。密码是猜出来的,所以需要加上一个随机数。最好把这个sault存到另外一个数据库里,防止因为存到一个数据库里所以被猜出数据库。
