96 # cookie

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) {// 通过服务端写入 cookieconsole.log(req.headers.cookie);if (req.url === "/read") {// 读取cookieres.end(JSON.stringify(querystring.parse(req.headers.cookie, "; ", "=")));} else if (req.url === "/write") {// 设置cookieres.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) {// 读取cookiereq.getCookie = function (key) {let cookieObj = querystring.parse(req.headers.cookie, ";", "=");return cookieObj[key];};// 设置cookielet 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);};// 通过服务端写入 cookieconsole.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) {// 读取cookiereq.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];};// 设置cookielet 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);};// 通过服务端写入 cookieconsole.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.rhkb.cn/news/143439.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 API 接口获取商品数据,从申请 API 接口、使用 API 接口到实际应用,一一讲解

在当今的数字化时代,应用程序接口(API)已经成为数据获取的重要通道。API 接口使得不同的应用程序能够方便地进行数据交换,从而促进了信息的广泛传播和利用。在众多的数据源中,商品数据是一个非常重要的领域&#xff0c…

postman怎么进行参数化?

一、先准备好参数化数据 (参数化数据可以使用Excel或者txt的文件。 注意如果使用的是txt的文件,一定要使用英文的逗号,不然的话会报错!) 注意:填写好的数据后,保存的时候需要另存为&#xff0c…

接口自动化测试:pytest基础讲解

为什么要做接⼝测试? 只靠前端测试很难确保很⾼的覆盖率。接⼝测试,可以模拟出各种类型的⼊参,包括⼀些在前端模拟不出来的⼊参,还能根据接⼝⽂档的定义,设计出相对完善的⼊参值,在接⼝层保证质量&#xff…

燃尽图是什么?如何用它提升敏捷项目流程?

**敏捷项目管理**的核心是透明度和持续改进。燃尽图是轻松实现这两点的秘密武器。这种动态的可视化工具能有效地说明团队在一段时间内的进展情况,突出显示剩余的工作,并揭示你的团队是否在实现目标的正轨上。 敏捷项目管理中的燃尽图 燃尽图是敏捷项目…

mac怎么把两张图片拼在一起

mac怎么把两张图片拼在一起?在如今的生活中,喜欢摄影的朋友们越来越多。拍照已经成为我们的一种习惯,因为当我们遇到美景或迷人的人物时,总是忍不住按下快门,将它们定格。随着时间的推移,我们渐渐发现自己的…

【SQL】统一训练平台数据库实践--20230927

储存过程vlookup_peopledata_csodtraining 默认导出用今天批次的数据进行join on,先删除过渡表的资料,再将查询结果放在过渡表中。 BEGINDECLARE startdate varchar(50);SET startdate date_format(NOW(),%Y%m%d);DELETE FROM season.csod_data2;INSE…

项目04-基于Docker的Prometheus+Grafana+AlertManager的飞书监控报警平台

文章目录 一.项目介绍1.流程图2.拓扑图3.详细介绍 二.前期准备1.项目环境2.IP划分 三. 项目步骤1.ansible部署软件环境1.1 安装ansible环境1.2 建立免密通道1.3 批量部署docker 2 部署nginx、MySQL以及cadvisor、exporter节点2.1 在nginx节点服务器上面配置nginx、node_exporte…

可以动态改变刻度背景色的车速仪表盘

最近做的项目的主页面需要用到一个仪表盘来动态显示车速,同时改变对应的背景色 仪表盘 开始是想着使用echarts,修修改改拿来用,但是人家客户有规定,必须搞个差不多的,那没办法,自 己动手搞个吧 截图如下&am…

如何快速重置模型原点

1、什么是模型原点? 模型原点是三维建模中的概念,它是指在一个虚拟三维空间中确定的参考点。模型原点通常位于模型的几何中心或基本组件的中心位置。如图所示: 可以看到模型的原点在模型的几何中心 2、模型原点的作用 知道了什么是模型原点&…

MR混合现实在军事课堂教学中的应用演示

战场模拟:利用MR技术可以创建逼真的战场模拟环境,将学生置身于真实的战场场景中,可以体验和学习各种作战技巧和战术策略。学生可以通过佩戴MR头盔或眼镜,观察虚拟的场景,并与虚拟对象进行互动,如操作武器、…

人员重识别:Person Re-Identification without Identification via Event Anonymization

论文作者:Shafiq Ahmad,Pietro Morerio,Alessio Del Bue 作者单位:Istituto Italino di Tecnologia;Universita degli Studi di Genova 论文链接:http://arxiv.org/abs/2308.04402v1 内容简介: 1)方向:…

漏洞扫描环境:win10系统用VMware Workstation打开虚拟机若干问题

win10系统用VMware Workstation打开虚拟机若干问题 一 .VMware打开虚拟机就蓝屏重启怎么解决?一. VMware打开虚拟机就蓝屏重启怎么解决?方法一:1、同时按下CTRLSHIFTESC打开任务管理器功能,之后依次点击-详细信息-性能后出现下列界…

【计算机网络】IP协议(上)

文章目录 TCP与 IP之间的关系IP地址的认识协议报头格式1. 报头和有效载荷如何分离?2. 8位协议3. 4位版本4. 8位服务类型5. 16位总长度6. 8位生存时间 TTL 网段划分IP地址的划分 子网划分CIDR的提出如何理解CIDR TCP与 IP之间的关系 如:假设 你上高中时&…

210-课程表III

文章目录 210-课程表III1. 题目 210-课程表III 1. 题目

npm安装心得(依赖库Python及node-sass依赖环境)

在使用vue的开发环境过程中,总会遇到这样哪样的安装或者打包错误, vue运行或打包常见错误如下: 1. npm install时 node-sass npm ERR command failed (可能是node.js的版本和node-sass的版本不符,就是卸掉原来的node.…

第二证券:国庆档票房有望延续复苏态势 海风拐点已至

昨日,两市股指盘中强势轰动上扬,创业板指早盘一度涨近2%,随后涨幅逐渐收窄。到收盘,沪指涨0.16%报3107.32点,深成指涨0.44%报10104.32点,创业板指涨0.82%报2006.22点,两市算计成交7165亿元&…

深入理解 pytest.main():Python 测试框架的核心功能解析

前言 笔者平常运行pytest用例时,通常使用命令行方式,像这样 pytest -v pxl/test_dir/test_demo.py::TestDemo::test_my_var,执行某一条case,但每次命令行敲也挺麻烦的。那如何在python代码中调用pytest呢?带着疑问一…

MySQL面试题-索引的基本原理及相关面试题

先了解一下MySQL的结构 下面我们重点讲一下存储引擎 MySQL的数据库和存储数据的目录是一一对应的,这些数据库的文件就保存在磁盘中对应的目录里 下面我们来看一下对应的具体数据文件 .frm是表的结构,不管什么样的索引都会有 .ibd代表我们现在使用的存…

六、如何让卡片一直对着摄像头

上期我们创建了卡片,那么如何让卡片一直面向浏览器。这个交互有一部分公司还是很需要的,今天我们就来讲讲,先看效果图 在animate.js里面增加卡片Mesh的LookAt,代码如下 import camera from "./camera"; import rendere…

【STM32】IAP升级01 bootloader实现以及APP配置(主要)

APP程序以及中断向量表的偏移设置 前言 通过之前的了解 之前的了解,我们知道实现IAP升级需要两个条件: 1.APP程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始; 2.APP程序的中断向量表相应的移动,移动的偏移量为 x&#xff…