express中的cookie和session

1、无状态的http

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

2、cookie

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

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

cookie特色:npm

  • 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不是一个天生就有的技术,而是依赖cookiebash

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

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)
复制代码
相关文章
相关标签/搜索