cookie和session node.js

http是一种无状态协议,客户端每次发出请求时,并不知道上一次请求所包含的状态数据,就无法做到对用户状态区分.

cookie(express4中的操作cookie的包为cookie-parser)

Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。

cookie是http协议头的一部分,具体cookie的处理如下:

  1.服务器向客服端发送cookie

  2.浏览器将cookie保存

  3.每次请求浏览器都会将cookie发送给服务器

主要的参数:

1.path:指定Path Set-Cookie的值。默认情况下,它设置为“/”,这是域的根路径

 2.expires和maxage:告诉浏览器这个 cookie 什么时候过期,expires 是 UTC 格式时间,maxAge 是 cookie 多久后过期的相对时间。当不设置这两个选项时,会产生 session cookie,session cookie 是 暂时 的,当用户关闭浏览器时,就被清除。一般用来保存 session 的 session_id。

3.secure:当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效。

4.httpOnly:浏览器不允许脚本操作 document.cookie 去更改 cookie。一般情况下都应该设置这个为 true,这样可以避免被 xss 攻击拿到 cookie

缺陷:

  1. Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
  2. 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用https。
  3. Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的

cookie的替代品:

1.Brownie方案,是一项开放源代码工程,由SourceForge发起。Brownie曾被用以共享在不同域中的接入,而Cookies则被构想成单一域中的接入。这项方案已经停止开发。

2.P3P,用以让用户获得更多控制个人隐私权利的协议。在浏览网站时,它类似于Cookie。

3.在与服务器传输数据时,通过在地址后面添加唯一查询串,让服务器识别是否合法用户,也可以避免使用Cookie。(url)

 

session(express-session包为例):

session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而session保存在服务器上。

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

主要参数:

1.name: 设置 cookie 中,保存 session 的字段名称,默认为 connect.sid

2.store: session 的存储方式,默认存放在内存中,也可以使用 redis,mongodb 等。express 生态中都有相应模块的支持。

3.secret: 通过设置的 secret 字符串,来计算 hash 值并放在 cookie 中,使产生的 signedCookie 防篡改。

4.cookie: 设置存放 session id 的 cookie 的相关选项,默认为 { path: '/', httpOnly: true, secure: false, maxAge: null

5.genid: 产生一个新的 session_id 时,所使用的函数, 默认使用 uid2 这个 npm 包。

6.rolling: 每个请求都重新设置一个 cookie,默认为 false。

7.resave: 即使 session 没有被修改,也保存 session 值,默认为 true

基于cookie和session两者的区别

7.cookie数据存放在客户的浏览器上,session数据放在服务器上。

6.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。

5.session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用cookie。

4.单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

基于url的session机制:

按照基本的session方法传输session,那么会用到浏览器中的cookie,一旦用户关闭cookie,那么session就不起作用,将session_id放到url上

etag session保存http会话:

http的session是保存用户访问状态的,标识用户身份的重要的东西,但是大部分session都是基于浏览器的cookie,仅有很少一部分还在使用基于url的session机制。如果cookie被用户禁用,我们又不想使用安全性较差的url的session机制,是不是就没有办法了呢?参考链接:https://cnodejs.org/topic/5212d82d0a746c580b43d948

token验证

 token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库

Token 和 Session 的区别:

session和 token并不矛盾,作为身份认证token安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态

App通常用restful api跟server打交道。Rest是stateless的,也就是app不需要像browser那样用cookie来保存session,因此用session token来标示自己就够了,session/state由api server的逻辑处理。如果你的后端不是stateless的rest api,那么你可能需要在app里保存session.可以在app里嵌入webkit,用一个隐藏的browser来管理cookie session.

Session是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。所谓Session认证只是简单的把User信息存储到Session里,因为SID的不可预测性,暂且认为是安全的。这是一种认证手段。而Token,如果指的是OAuth Token或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对App。其目的是让 某App有权利访问 某用户 的信息。这里的Token是唯一的。不可以转移到其它App上,也不可以转到其它 用户 上。转过来说Session。Session只提供一种简单的认证,即有此SID,即认为有此User的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方App。所以简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用API接口,用Token。如果永远只是自己的网站,自己的App,用什么就无所谓了。

token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;session和cookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。

参考链接:

https://cnodejs.org/topic/5212d82d0a746c580b43d948

https://blog.csdn.net/ly89cn/article/details/46388237

https://blog.csdn.net/ly89cn/article/details/46388237

https://blog.csdn.net/ly89cn/article/details/46388237

https://blog.csdn.net/ly89cn/article/details/46388237

https://www.jianshu.com/p/bd1be47a16c1

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值