nodejs express cookies、session 小记

众所周知,HTTP 是一个无状态协议,所以客户端每次发出请求时,下一次请求无法得知上一次请求所包含的状态数据。

那如果关联状态呢?

1.cookie 产生了。运行原理:

  1.1 服务器向客户端发送 cookie。通常使用 HTTP 协议规定的 set-cookie 头操作。规范规定 cookie 的格式为 name = value 格式,且必须包含这部分

  1.2 浏览器将 cookie 保存

  1.3 每次请求浏览器都会将 cookie 发向服务器

  cookie 参数:

  • path:表示 cookie 影响到的路径,匹配该路径才发送这个 cookie。
  • expires 和 maxAge:告诉浏览器这个 cookie 什么时候过期,expires 是 UTC 格式时间,maxAge 是 cookie 多久后过期的相对时间。当不设置这两个选项时,会产生 session cookie,session cookie 是 transient 的,当用户关闭浏览器时,就被清除。一般用来保存 session 的 session_id。
  • secure:当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效。
  • httpOnly:浏览器不允许脚本操作 document.cookie 去更改 cookie。一般情况下都应该设置这个为 true,这样可以避免被 xss 攻击拿到 cookie。

  使用:

var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());
app.get('/', function (req, res) {
  if (req.cookies.isLogin) {
    console.log(req.cookies);
  } else {
    res.cookie('isLogin', 1, {maxAge: 60 * 1000});
    res.send("first");
  }
});

2. session

cookie 虽然很方便,但是使用 cookie 有一个很大的弊端,cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 cookie 中了,而且如果 cookie 中数据字段太多会影响传输效率。为了解决这些问题,就产生了 session,session 中的数据是保留在服务器端的。

session 的运作通过一个 session_id 来进行。session_id 通常是存放在客户端的 cookie 中,比如在 express 中,默认是 connect.sid 这个字段,当请求到来时,服务端检查 cookie 中保存的 session_id 并通过这个 session_id 与服务器端的 session data 关联起来,进行数据的保存和修改。

这意思就是说,当你浏览一个网页时,服务端随机产生一个 1024 比特长的字符串,然后存在你 cookie 中的 connect.sid 字段中。当你下次访问时,cookie 会带有这个字符串,然后浏览器就知道你是上次访问过的某某某,然后从服务器的存储中取出上次记录在你身上的数据。

session 可以存放在 1)内存、2)cookie本身、3)redis 或 memcached 等缓存中,或者4)数据库中。线上来说,缓存的方案比较常见,存数据库的话,查询效率相比前三者都太低,不推荐;cookie session 有安全性问题,下面会提到

express 中操作 session 要用到 express-session 这个模块,主要的方法就是 session(options),其中 options 中包含可选参数,主要有:

  • name: 设置 cookie 中,保存 session 的字段名称,默认为 connect.sid
  • store: session 的存储方式,默认存放在内存中,也可以使用 redis,mongodb 等。express 生态中都有相应模块的支持。
  • secret: 通过设置的 secret 字符串,来计算 hash 值并放在 cookie 中,使产生的 signedCookie 防篡改。
  • cookie: 设置存放 session id 的 cookie 的相关选项,默认为
    • (default: { path: '/', httpOnly: true, secure: false, maxAge: null })
  • genid: 产生一个新的 session_id 时,所使用的函数, 默认使用 uid2 这个 npm 包。
  • rolling: 每个请求都重新设置一个 cookie,默认为 false。
  • resave: 即使 session 没有被修改,也保存 session 值,默认为 true。

内存存储session

var express = require('express');
var session = require('express-session');
var app = express();
app.use(session({
  secret: 'secret',
  cookie: { maxAge: 60 * 1000 }
}));

redis 存储 session

var express = require('express');
var session = require('express-session');
var redisStore = require('connect-redis')(session);
var app = express();
app.use(session({
  store: new redisStore(),
  secret: 'secret'
}));

上面我们说到,session 的 store 有四个常用选项:1)内存 2)cookie 3)缓存 4)数据库

内存方式:适合开发环境使用,方便。

cookie: session data 存储在 cookie 中, 安全性不好,我拿到你的cookie,就相当与拿到了你的身份令牌。对于cookie盗窃,非常危险。不存在共享问题,浏览器携带。浪费带宽。

缓存方式是最常用的方式了,即快,又能共享状态。节省带宽

数据库 session。很慢。

 

你可能感兴趣的:(nodejs express cookies、session 小记)