express中的cookie和session

3,747 阅读4分钟

一、无状态的http

http是无状态协议, 简单的说, 当你浏览了一个页面, 然后转到同一个网站的另一个页面, 服务器无法认识到, 这是同一个浏览器在访问同一个网站,换句话说,服务器无法识别两条http请求是否是同一个用户发送的。也就是说服务器端并没有记录通信状态的能力。 但是, 为了用户体验, 我们确实需要让服务器能够记忆用户的一些信息。 cookie应运而生

二、cookie

cookie是一个简单到爆的想法: 当访问一个页面的时候,服务器在下行http报文中,命令浏览器存储一个字符串;浏览器再访问同一个域的时候,将把这个字符串携带到上行http请求中。

第一次访问第一个服务器,不可能携带cookie。必须是服务器得到这次请求,在下行响应报头中,携带cookie信息,此后每一次浏览器往这个服务器发出的请求,都会携带这个cookie

cookie特点:

  • 1.cookie 是不加密的,用户可以自由看到
  • 2.用户可以删除cookie或者禁用它
  • 3.cookie可以被篡改
  • 4.cookie可以用于攻击
  • 5.cookie 存储量很小。

express中的cookie,你肯定能想到。 res负责设置cookie, req负责识别cookie。 在express中的使用:cookie-parser

1/安装
npm i -S cookie-parser
cookie 中间件的参数:
path:指定 cookie 影响到的路径
expires: 指定时间格式
maxAge:指定 cookie 什么时候过期
secure:当 secure 值为 true 时,在 HTTPS 中才有效;反之,cookie 在 HTTP 中是有效。
httpOnly:浏览器不允许脚本操作 document.cookie 去更改 cookie。设置为true可以避免被 xss 攻击拿到 cookie
const cookieParser = require('cookie-parser');

app.use(cookieParser());

app.get("/a", (req, res) => {
    console.log(req.cookies) //读取cookie

    res.cookie("amount", 99.8, { //设置cookie
        //domain:设置主域名//(子域名可以找主域名,主域名不可以找子域名;一般情况下一个网站一个cookie)
        //path:"/" //cookie是保存在根路径下的,为了防止访问不到  (不能往下访问只能往上访问)
        //secure: 当 secure 值为 true 时, 在 HTTPS 中才有效; 反之, cookie 在 HTTP 中是有效。
        //httpOnly:浏览器不允许脚本操作 document.cookie 去更改 cookie。设置为true可以避免被 xss 攻击拿到 cookie
        maxAge: 14 * 86400 * 1000 //有效期
    })

    res.send("ok")
})

简单模拟登录
const cookieParser = require('cookie-parser');

app.use(cookieParser(
    "ggffdaasadada123ghgfhf8gghgh" //签名
));

app.get("/a", (req, res) => {
    let num = 0;
    console.log(req.cookies) //读取未签名cookie
    console.log(req.signedCookies) //读取签名cookie
    if (req.cookies.amount) {
        res.send("欢迎回来")
    } else {
        res.cookie("amount", "hello", {
            maxAge: 14 * 86400 * 1000, //有效期
            signed: true //是否需要签名的
        })
    }
    res.send("请先登录")
})

三 session

session在计算机网络应用中被称为“会话控制”, 客户端浏览器访问网站的时候,服务器会向客户浏览器发送一个每个用户特有的会话编号sessionID,让他进入到cookie里,服务器同时也把sessionID和对应的用户信息、用户操作记录在服务器上,这些记录就是session。客户端浏览器再次访问时,会发送cookie给服务器,其中就包含sessionID。服务器从cookie里找到sessionID,再根据sessionID找到以前记录的用户信息就可以知道他之前操控些、访问过哪里。

Session不是一个天生就有的技术,而是依赖cookie

session是存在服务器端的技术,cookie是存储在客户端的技术

cookie以文本格式存储在浏览器上,存储量有限;而会话存储在服务端,可以无限量存储多个变量并且比cookie更安全

session相比cookie而言要安全一些,因为他是存储在服务器的;cookie是明文(也可加密)存储在客户端(浏览器),而且每次请求都会附带发送(可以使用抓包工具获取cookie,不安全)

cookie如果存储内容比较多的话,会给请求造成压力 session因为是存储在服务器的,所以如果过多的依赖session会造成服务器压力(内存和硬盘的压力)

1/安装
npm i -S express-session
2/session 中间件的配置参数:
name: 设置cookie中,保存session的字段名称,默认为connect.sid
store: session的存储方式,默认为存放在内存中,我们可以自定义redis等
genid: 生成一个新的session_id时,默认为使用uid2这个npm包
rolling: 每个请求都重新设置一个cookie,默认为false
resave: 即使session没有被修改,也保存session值,默认为true
saveUninitialized:强制未初始化的session保存到数据库
secret: 通过设置的secret字符串,来计算hash值并放在cookie中,使产生的signedCookie防篡改
cookie : 设置存放sessionid的cookie的相关选项
2.const express = require("express");
const app = express();
const session = require("express-session");

app.use(session({
    secret :  'secret', // 对session id 相关的cookie 进行签名
    resave : true,
    saveUninitialized: false, // 是否保存未初始化的会话
    cookie : {
        maxAge : 1000 * 60 * 3, // 设置 session 的有效时间,单位毫秒
    },
}));

app.get("/", (req, res) => {
    // console.log(req.session);
    if (!req.session['view']) {
        req.session['view'] = 1;
    } else {
        req.session['view']++;
    }
    req.session['amount'] = 99.8;
    res.send(`欢迎你第${req.session["view"]}次登陆,你的余额是:${req.session['amount']}`)
})


app.listen(3000)