文章目录
  1. 1. 前言
  2. 2. cookie-session
  3. 3. 回放攻击

前言

其实刚开始接触客户端session的时候,感觉是有点奇怪的也挺有意思的,与之前对session的理解有点不太一样。
回顾一下之前写的一篇关于cookie和session的博客。简单总结一下就是:

  • session主要的作用是补充http无状态特性,用来记录用户状态,表面用户身份。
  • session是存储在服务端的,而服务端的存储方式也是多样的。有内存存储,数据库存储(mongodbredis)。
  • 客户端浏览器cookie保存sessionid,服务端通过客户端每次http请求带上的cookie中的sessionid找到相应的用户的session内容。

但是最近看到cnode上的一篇精华博文alsotang的博文,触发自己的一点点思考。可以将session完全保留在客户端浏览器中(当然是经过加密的啦)。

可能很多人的第一反应是,session的内容保存在客户端cookie中,那如何保证它的安全性。

结合博文,简单说说自己的看后感,

  • 1、大多数情况下,session保存的是用户状态和少量的用户信息。例如用户id,用户姓名,用户头像。而且这本身就是给当前用户看的,所以说对本用户而言session中的数据不敏感,个人感觉如果仅仅是记录状态,可以只保存userid。
  • 2、可利用服务器上的一个秘钥对数据进行加密,而这秘钥肯定是只有开发者知道。
  • 3、cookie的容量是有限的,不可能像服务端session那样去存放大量的数据,不过对于用户状态的记录而言,一个userid足以,用户信息等的获取可以通过获取数据库来查找。

所以在开发一些对session保存量不大(实在想不出有什么需求会将很多的数据放在session上!请反驳我),并发量比较大的情况下可以试一下用客户端session,至少可以省下一部redis服务器。

你猜对了,可以用这个来实现

1
2
//git url https://github.com/expressjs/cookie-session
$ npm install cookie-session

说来奇葩,之前做过一个项目是用cookie-session来实现以上的功能的,但是由于是接手的,而本身还有开发任务,并没有做仔细研读,只是在基础上做扩展或改动。因此贴上这个项目的代码。

1
2
3
4
5
6
7
8
9
10
//app.js
var session = require('cookie-session');
//config.js配置了key和secret
var config = require('./config');

app.use(session({
key: config.key,
secret: config.secret,
cookie:{ domain: config.domain }
}));

回放攻击

alsotang说过这样一段话:

不过 cookie-session 我个人建议不要使用,有受到回放攻击的危险。

回放攻击指的是,比如一个用户,它现在有 100 积分,积分存在 session 中,session 保存在 cookie 中。他先复制下现在的这段 cookie,然后去发个帖子,扣掉了 20 积分,于是他就只有 80 积分了。而他现在可以将之前复制下的那段 cookie 再粘贴回去浏览器中,于是服务器在一些场景下会认为他又有了 100 积分。

如果避免这种攻击呢?这就需要引入一个第三方的手段来验证 cookie session,而验证所需的信息,一定不能存在 cookie 中。这么一来,避免了这种攻击后,使用 cookie session 的好处就荡然无存了。如果为了避免攻击而引入了缓存使用的话,那不如把 cookie session 也一起放进缓存中。

我简单的理解成了不要将敏感数据放在client-session中。解决。

ps:可以看看https://cnodejs.org/topic/5212d82d0a746c580b43d948

文章目录
  1. 1. 前言
  2. 2. cookie-session
  3. 3. 回放攻击