96 # cookie

news2024/11/20 19:28:52

cookie 和 session 和 sessionStorage 和 localStorage

  • localStorage 和 sessionStorage 本地储存(发送请求不会携带),不能跨域
  • localStorage 浏览器关闭后不会清空,必须手动清空
  • sessionStorage 浏览器关闭后就会销毁
  • http 无状态的,可以通过 cookie 来制造状态(浏览器跟服务端都可以设置cookie),每次发送请求默认会携带 cookie
  • cookie 不安全,数据是存在客户端的,可以篡改,不能存放敏感信息
  • session 基于 cookie 的,通过 cookie 的机制,制造一个服务端存储的空间
  • session 比 cookie 安全,每次重启服务会丢失,可以用 redis 来存储 session

通过服务端写入 cookie

  • domain 域名设置,默认当前域名,如果设置 Domain=mozilla.org,则 Cookie 也包含在子域名中(如 developer.mozilla.org)。
  • path 路径(/ 表示任意路径)限制写入时 cookie 的路径
  • exipres 绝对时间 / max-age 相对时间
  • httpOnly 是否客户端可以操作 cookie

例子:

const http = require("http");
const querystring = require("querystring");

const server = http.createServer(function (req, res) {
    // 通过服务端写入 cookie
    console.log(req.headers.cookie);
    if (req.url === "/read") {
        // 读取cookie
        res.end(JSON.stringify(querystring.parse(req.headers.cookie, "; ", "=")));
    } else if (req.url === "/write") {
        // 设置cookie
        res.setHeader("Set-Cookie", [
            `name=kaimo; domain=.kaimo.com; expires=${new Date(Date.now() + 10 * 1000).toGMTString()}`,
            "age=313; max-age=10; httpOnly"
        ]);
        res.end("write ok");
    } else {
        res.end("NOT FOUND");
    }
});

server.listen(3000);

console.log("Server running at http://127.0.0.1:3000/");

注:可以打开 C:\Windows\System32\drivers\etc\hosts 文件,增加自定义本地访问域名

127.0.0.1 a.kaimo.com
127.0.0.1 b.kaimo.com

然后我们访问 http://a.kaimo.com:3000/write 写入cookie,分别读取 cookie http://a.kaimo.com:3000/readhttp://b.kaimo.com:3000/read

在这里插入图片描述

封装 cookie 的读取写入

const http = require("http");
const querystring = require("querystring");

const server = http.createServer(function (req, res) {
    // 读取cookie
    req.getCookie = function (key) {
        let cookieObj = querystring.parse(req.headers.cookie, ";", "=");
        return cookieObj[key];
    };
    // 设置cookie
    let arr = [];
    res.setCookie = function (key, value, options = {}) {
        let opts = [];
        if (options.domain) {
            opts.push(`domain=${options.domain}`);
        }
        if (options.path) {
            opts.push(`domain=${options.path}`);
        }
        if (options.maxAge) {
            opts.push(`max-age=${options.maxAge}`);
        }
        if (options.httpOnly) {
            opts.push(`httpOnly`);
        }
        arr.push(`${key}=${value}; ${opts.join("; ")}`);
        res.setHeader("Set-Cookie", arr);
    };
    // 通过服务端写入 cookie
    console.log(req.headers.cookie);
    if (req.url === "/read") {
        res.end(req.getCookie("name") || "empty");
    } else if (req.url === "/write") {
        res.setCookie("name", "kaimo", {
            domain: ".kaimo.com",
            expires: `${new Date(Date.now() + 10 * 1000).toGMTString()}`
        });
        res.setCookie("age", "313", {
            maxAge: "10",
            httpOnly: true
        });
        res.end("write ok");
    } else {
        res.end("NOT FOUND");
    }
});

server.listen(3000);

console.log("Server running at http://127.0.0.1:3000/");

cookie 安全性问题

当给浏览器设置 cookie 的时候,可以增加签名,根据数据内容创建一个唯一的签名(MD5),这种方式可以伪造,

采用另外一种方式,使用 sha256 加盐算法,根据内容和秘钥算出一个签名(不能反解),相同的秘钥签名的结果是相同的

在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”。

const http = require("http");
const querystring = require("querystring");
const crypto = require("crypto");

// 秘钥
const secret = "kaimo313";

// 为了编码能在网络中安全顺畅传输,这里可以直接把 / + = 三个符号置空
const sign = (value) =>
    crypto
        .createHmac("sha256", secret)
        .update(value)
        .digest("base64")
        .replace(/\/|\+|\=/g, "");

const server = http.createServer(function (req, res) {
    // 读取cookie
    req.getCookie = function (key, options) {
        let cookieObj = querystring.parse(req.headers.cookie, ";", "=");
        if (options.signed) {
            let [value, s] = (cookieObj[key] || "").split(".");
            let newSign = sign(value);
            if (newSign === s) {
                // 签名一致,说明这次的内容是没有被改过的
                return value;
            } else {
                // 签名被篡改了,不能使用
                return undefined;
            }
        }
        return cookieObj[key];
    };
    // 设置cookie
    let arr = [];
    res.setCookie = function (key, value, options = {}) {
        let opts = [];
        if (options.domain) {
            opts.push(`domain=${options.domain}`);
        }
        if (options.path) {
            opts.push(`domain=${options.path}`);
        }
        if (options.maxAge) {
            opts.push(`max-age=${options.maxAge}`);
        }
        if (options.httpOnly) {
            opts.push(`httpOnly`);
        }
        if (options.signed) {
            value = value + "." + sign(value);
        }
        arr.push(`${key}=${value}; ${opts.join("; ")}`);
        res.setHeader("Set-Cookie", arr);
    };
    // 通过服务端写入 cookie
    console.log(req.headers.cookie);
    if (req.url === "/read") {
        res.end(
            req.getCookie("name", {
                signed: true
            }) || "empty"
        );
    } else if (req.url === "/write") {
        res.setCookie("name", "kaimo", {
            domain: ".kaimo.com",
            expires: `${new Date(Date.now() + 10 * 1000).toGMTString()}`,
            signed: true // 加签名
        });
        res.setCookie("age", "313", {
            maxAge: "10",
            httpOnly: true
        });
        res.end("write ok");
    } else {
        res.end("NOT FOUND");
    }
});

server.listen(3000);

console.log("Server running at http://127.0.0.1:3000/");

在这里插入图片描述
改动 cookie 里的值

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1046191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】条件渲染列表渲染来啦

hello,我是小索奇哈,精心制作的Vue系列持续发放,涵盖大量的经验和示例,由浅入深进行讲解。 本章给大家讲解的是条件&列表渲染,前面的章节已经更新完毕,后面的章节持续输出,有任何问题都可以…

Anaconda启动错误

错误 An unexpected error occurred on Navigator start-up | Could not find a suitable TLS CA certificate bundle, invalid path 导致Anaconda启动失败! [解决办法]1 找到anaconda的安装目录,该目录下的__init__.py 这两处分别改为verifyself.sessio…

程序员不得不知道的排序算法-上

目录 前言 1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.快速排序 6.归并排序 总结 前言 今天给大家讲一下常用的排序算法 1.冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地从待排序的元素中比较相邻的两个元素&a…

如何制作gif动图gif (多图合成gif、GIF录制软件、视频制作成GIF动图)

文章目录 1 在线制作多图合成gif动画2 GIF录制软件3 将现有的视频 制作成GIF动图 1 在线制作多图合成gif动画 在线制作gif动画链接:https://www.matools.com/gif ①选择需要制作gif动画的图片将其添加 ②调整时间间隔,图片宽高等设置 ③一键生成gif ④下载到本…

十年耕耘,致力于让垂直领域合作企业提升竞争力

2013年6月叶帆科技公司成立,时光如驹,距今已经十年了(叶帆科技的前身叶帆工作室,官方博客上的第一篇博文发表于2004年6月,已近二十年了)。 十年时间,初心不变,一直和各垂直领域的企…

最新AI写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt应用+MJ以图生图+思维导图生成

一、智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧&…

使用ElementUI完成登入注册的跨域请求提高开发效率

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》​​​​​​​ ⛺️ 生活的理想,为了不断更新自己 ! 目录 ​编辑 1、前言 1.1.什么是ELementUI 2、完成登陆注册前端页面 2.1环境搭建 运行…

通过pfx格式证书生成Nginx的SSL证书

1、安装openssl 工具地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 安装完成后,自行配置环境变量。 2、生成证书 (1)以管理员身份运行cmd,进入到pfx文件的目录: &#x…

CSS详细基础(二)文本样式

插播一条CSS的工作原理: CSS是一种定义样式结构如字体、颜色、位置等的语言,被用于描述网页上的信息格式化和显示的方式。CSS样式可以直接存储于HTML网页或者单独的样式单文件。无论哪一种方式,样式单包含将样式应用到指定类型的元素的规则。…

postman记录backup

之前一直未登录postman,在临时空间处理请求,可能是因为postman更新了,导致其记录没了 别着急! 首先我们先登录postman,有谷歌登录方式等 第一步、登录后点击import 第二步、点击files 第三步、找到c:/users/AppData…

三、VXLAN静态方式实验举例

VXLAN静态方式实验举例 1.1、静态方式部署集中式网关1.1.1、VXLAN隧道建立1.1.2、MAC地址动态学习1.1.3、同子网已知单播报文转发1.1.4、同子网BUM报文转发1.1.5、跨子网报文转发1.1.6、配置VXLAN接入业务部署方式 1.2、配置举例,相同网段互通(静态方式&…

JVS低代码开发工具:触发逻辑引擎后对象变量节点回显配置说明

使用说明 通常业务中会涉及到表单上部分字段填写后通过触发逻辑处理已填写的数据进行回显到表单上,这时我们可以采用业务逻辑来配置对象变量节点进行表单数据回显。 对象变量:将自定义字段重新组装新的数据结构,数据结构类型为对象。 设计…

【网络安全】2023年堡垒机品牌大全

随着大家网络安全意识的增加,随着国家等保政策的严格执行,越来越多的企业开始采购堡垒机。这里就给大家总结了部分堡垒机品牌,让大家参考参考。 2023年堡垒机品牌大全 1、行云堡垒 2、JumpServer 3、安恒 4、骞云 5、齐治 6、阿里云 …

ahk系列——ahk_v2实现win10任意界面搜狗翻译

1、准备环境 win10或者以上系统安装ahkv2_64环境,安装包安装好后会有32和64位的unicode版本准备一个编译器,我用idea,不会ahk编程的我会把编译好的exe连接放到最后需要 联网 才能翻译 2、 使用方法 选中需要翻译的文字,然后ctr…

【算法】递归(高阶题目) -随时补充

文章目录 岛问题汉诺塔问题牛群繁衍数量问题求字符串的全部子序列字符串的全排列数字的全排列I数字的全排列IIN皇后IIN皇后I 岛问题 递归的方法: 遍历岛这个二维数组,如果当前数为1,则进入感染函数并将岛个数1感染函数:其实就是一个递归标注…

win11+wsl+git+cmake+x86gcc+armgcc+clangformat+vscode环境安装

一、安装wsl (1)打开power shell 并运行: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform (2&#xff0…

通过containerd部署k8s集群环境及初始化时部分报错解决

目录 一.基础环境配置(每个节点都做) 1.hosts解析 2.防火墙和selinux 3.安装基本软件并配置时间同步 4.禁用swap分区 5.更改内核参数 6.配置ipvs 7.k8s下载 (1)配置镜像下载相关软件 (2)配置kube…

用CRM系统协助销售跟踪客户

客户跟踪对销售来说非常重要,销售不及时跟进很容易导致潜在客户流失。那么对于销售来说,该如何做好客户跟踪呢?或许可以使用CRM客户管理系统。下面来说说,CRM系统如何协助销售跟踪客户? 智能联系客户提醒 销售人员通…

Django中的缓存

Django中的缓存 缓存的定义 定义: 缓存是-类可以更快的读取数据的介质统称,也指其它可以加快数据读取的存储方式。一般用来存储临时数据,常用介质的是读取速度很快的内存 意义:视图渲染有一定成本,数据库的频繁查询过高;所以对于低频变动的页…

蓝桥杯 题库 简单 每日十题 day11

01 质数 质数 题目描述 给定一个正整数N,请你输出N以内(不包含N)的质数以及质数的个数。 输入描述 输入一行,包含一个正整数N。1≤N≤10^3 输出描述 共两行。 第1行包含若干个素数,每两个素数之间用一个空格隔开&…