nodeJs的cookie和session
2021-02-03 20:17
标签:初学 服务 缓存 就会 gen 超过 表示 负载均衡 ++ 众所周知,HTTP 是一个无状态协议,所以客户端每次发出请求时,下一次请求无法得知上一次请求所包含的状态数据,如何能把一个用户的状态数据关联起来呢? 比如在淘宝的某个页面中,你进行了登陆操作。当你跳转到商品页时,服务端如何知道你是已经登陆的状态? 首先产生了 cookie 这门技术来解决这个问题,cookie 是 http 协议的一部分,它的处理分为如下几步: 其他可选的 cookie 参数会影响将 cookie 发送给服务器端的过程,主要有以下几种: express 在 4.x 版本之后,session管理和cookies等许多模块都不再直接包含在express中,而是需要单独添加相应模块。 express4 中操作 cookie 使用 cookie 虽然很方便,但是使用 cookie 有一个很大的弊端,cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 cookie 中了,而且如果 cookie 中数据字段太多会影响传输效率。为了解决这些问题,就产生了 session,session 中的数据是保留在服务器端的。 session 的运作通过一个 这意思就是说,当你浏览一个网页时,服务端随机产生一个 1024 比特长的字符串,然后存在你 cookie 中的 session 可以存放在 1)内存、2)cookie本身、3)redis 或 memcached 等缓存中,或者4)数据库中。线上来说,缓存的方案比较常见,存数据库的话,查询效率相比前三者都太低,不推荐;cookie session 有安全性问题,下面会提到。 express 中操作 session 要用到 1) 在内存中存储 session 第 ‘ + req.session.isVisit + ‘次来此页面 2) 在 redis 中存储 session session 存放在内存中不方便进程间共享,因此可以使用 redis 等缓存来存储 session。 假设你的机器是 4 核的,你使用了 4 个进程在跑同一个 node web 服务,当用户访问进程1时,他被设置了一些数据当做 session 存在内存中。而下一次访问时,他被负载均衡到了进程2,则此时进程2的内存中没有他的信息,认为他是个新用户。这就会导致用户在我们服务中的状态不一致。 使用 redis 作为缓存,可以使用 我们可以运行 第 ‘ + req.session.isVisit + ‘次来到此页面 我们可以运行
上面我们说到,session 的 store 有四个常用选项:1)内存 2)cookie 3)缓存 4)数据库 其中,开发环境存内存就好了。一般的小程序为了省事,如果不涉及状态共享的问题,用内存 session 也没问题。但内存 session 除了省事之外,没有别的好处。 cookie session 我们下面会提到,现在说说利弊。用 cookie session 的话,是不用担心状态共享问题的,因为 session 的 data 不是由服务器来保存,而是保存在用户浏览器端,每次用户访问时,都会主动带上他自己的信息。当然在这里,安全性之类的,只要遵照最佳实践来,也是有保证的。它的弊端是增大了数据量传输,利端是方便。 缓存方式是最常用的方式了,即快,又能共享状态。相比 cookie session 来说,当 session data 比较大的时候,可以节省网络传输。推荐使用。 数据库 session。除非你很熟悉这一块,知道自己要什么,否则还是老老实实用缓存吧。 上面一直提到 session 可以存在 cookie 中,现在来讲讲具体的思路。这里所涉及的专业名词叫做 对称加密。 假设我们想在用户的 cookie 中存 session data,使用一个名为 存 这段信息的话,可以将 而当用户下次访问时,我们就可以用 signedCookies 跟 cookie-session 还是有区别的: 1)是前者信息可见不可篡改,后者不可见也不可篡改 2)是前者一般是长期保存,而后者是 session cookie cookie-session 的实现跟 signedCookies 差不多。 不过 cookie-session 我个人建议不要使用,有受到回放攻击的危险。 回放攻击指的是,比如一个用户,它现在有 100 积分,积分存在 session 中,session 保存在 cookie 中。他先复制下现在的这段 cookie,然后去发个帖子,扣掉了 20 积分,于是他就只有 80 积分了。而他现在可以将之前复制下的那段 cookie 再粘贴回去浏览器中,于是服务器在一些场景下会认为他又有了 100 积分。 如果避免这种攻击呢?这就需要引入一个第三方的手段来验证 cookie session,而验证所需的信息,一定不能存在 cookie 中。这么一来,避免了这种攻击后,使用 cookie session 的好处就荡然无存了。如果为了避免攻击而引入了缓存使用的话,那不如把 cookie session 也一起放进缓存中。 初学者容易犯的一个错误是,忘记了 session_id 在 cookie 中的存储方式是 session cookie。即,当用户一关闭浏览器,浏览器 cookie 中的 session_id 字段就会消失。 常见的场景就是在开发用户登陆状态保持时。 假如用户在之前登陆了你的网站,你在他对应的 session 中存了信息,当他关闭浏览器再次访问时,你还是不懂他是谁。所以我们要在 cookie 中,也保存一份关于用户身份的信息。 比如有这样一个用户 我们可以考虑把这四个字段的信息都存在 session 中,而在 cookie,我们用 signedCookies 来存个 username。 登陆的检验过程伪代码如下: 转载自:http://wiki.jikexueyuan.com/project/node-lessons/cookie-session.html nodeJs的cookie和session 标签:初学 服务 缓存 就会 gen 超过 表示 负载均衡 ++ 原文地址:https://www.cnblogs.com/fsg6/p/13151618.htmlcookie 和 session
cookie
express 中的 cookie
cookie-parser
模块(https://github.com/expressjs/session )
session
session_id
来进行。session_id
通常是存放在客户端的 cookie 中,比如在 express 中,默认是 connect.sid
这个字段,当请求到来时,服务端检查 cookie 中保存的 session_id 并通过这个 session_id 与服务器端的 session data 关联起来,进行数据的保存和修改。connect.sid
字段中。当你下次访问时,cookie 会带有这个字符串,然后浏览器就知道你是上次访问过的某某某,然后从服务器的存储中取出上次记录在你身上的数据。由于字符串是随机产生的,而且位数足够多,所以也不担心有人能够伪造。伪造成功的概率比坐在家里编程时被邻居家的狗突然闯入并咬死的几率还低。express-session
这个模块,主要的方法就是 session(options)
,其中 options 中包含可选参数,主要有:
connect.sid
。
uid2
这个 npm 包。express-session
默认使用内存来存 session,对于开发调试来说很方便。
connect-redis
模块来得到 redis 连接实例,然后在 session 中设置存储方式为该实例。redis-cli
查看结果,如图可以看到 redis 中缓存结果。
redis-cli
查看结果,如图可以看到 redis 中缓存结果。各种存储的利弊
cookie-session
session_data
的字段。var sessionData = {username: ‘alsotang‘, age: 22, company: ‘alibaba‘, location: ‘hangzhou‘}
sessionData
与我们的 secret_string
一起做个对称加密,存到 cookie 的 session_data
字段中,只要你的 secret_string
足够长,那么攻击者也是无法获取实际 session 内容的。对称加密之后的内容对于攻击者来说相当于一段乱码。secret_string
来解密 sessionData
,得到我们需要的 session data。session cookie
{username: ‘alsotang‘, age: 22, company: ‘alibaba‘, location: ‘hangzhou‘}
文章标题:nodeJs的cookie和session
文章链接:http://soscw.com/index.php/essay/50580.html