前端宝典十四:Node缓存、安全与鉴权

news2024/11/16 15:31:59

本文主要从Node缓存、安全与鉴权几个方面展开解析,包含几个方面:

  1. Cookie 定义、设置、生命周期以及安全性
  2. Node缓存分类和区别
  3. Node鉴权包含session、cookie、token、jwt等

一、Cookie

HTTP Cookie(通常也叫 Web Cookie 或浏览器 Cookie),是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。支持无状态的HTTP变为“有状态”

1、Cookie 作用:

1. 会话状态管理

如用户登录状态、购物车、游戏分数或其它需要记录的信息

2. 个性化设置

如用户自定义设置、主题等

3. 浏览器行为跟踪

如跟踪分析用户行为等

当服务器收到 HTTP 请求时,服务器可以在响应头里面添加一个 Set-Cookie 选项。浏览器收到响应后通常会保存下 Cookie,之后对该服务器每一次请求中都通过 Cookie 请求头部将 Cookie 信息发送给服务器。

2、Set-Cookie

服务器使用 Set-Cookie 响应头部向用户代理(一般是浏览器)发送 Cookie 信息。一个简单的 Cookie 可能像这样:

Set-Cookie: <cookie 名>=<cookie 值>

服务器通过该头部告知客户端保存 Cookie 信息

3、Cookie 的生命周期

Cookie 的生命周期包括:

1. 会话期 Cookie

浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期 Cookie 不需要指定过期时间(Expires)或者有效期(Max-Age);

2. 持久性 Cookie

生命周期取决于过期时间(Expires)或有效期(Max-Age);

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

4、如何保证Cookie安全性

1. Secure

表示只应通过被 HTTPS 协议加密过的请求发送给服务端;

2. HttpOnly

JavaScript Document.cookie API 无法访问带有 HttpOnly 属性的 cookie;此类 Cookie 仅作用于服务器。例如,持久化服务器端会话的 Cookie 不需要对 JavaScript 可用,而应具有 HttpOnly 属性。

HttpOnly 类型的 Cookie 用于阻止了 JavaScript 对其的访问性而能在一定程度上缓解XSS攻击。

3. SameSite Cookie

允许服务器要求某个 cookie 在跨站请求时不会被发送,从而可以阻止(CSRF)。
SameSite 可以有下面三种值:

  1. None:浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写;
  2. Strict:浏览器将只在访问相同站点时发送 cookie;
  3. Lax:与 Strict 类似,但用户从外部站点导航至 URL 时(例如通过链接)除外。 在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到 URL 时才会发送。如 link 链接;

cookie samesite限制 strict可缓解CSRF攻击

示例:

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly;SameSite=Strict

二、Node缓存

1、强制缓存

当客户端请求后,会先访问缓存数据库看缓存是否存在。如果存在则直接返回,不存在则请求真的服务器。
强制缓存直接减少请求数,是提升最大的缓存策略。 如果考虑使用缓存来优化网页性能的话,强制缓存应该是首先被考虑的。
强制缓存不需要与服务器发生交互。
在这里插入图片描述
可以造成强制缓存的字段是 Cache-control 和 Expires
但是Expires设置的绝对时间,不好用,如果客户端修改本地时间,cookie失效
所有要使用Cache-control,Cache-control这是的相对时间

// 表示有效时间为20s

Cache-control: max-age=20 

cache-control设置:

  1. no-cache:相当于需要使用协商缓存,禁止使用强制缓存;
  2. no-store:相当于不使用强制缓存和协商缓存;
  3. public 任何路径的缓存者(本地缓存、代理服务器),可以无条件的缓存改资源,不设置默认为public;
  4. private 只针对单个用户或者实体(不同用户、窗口)缓存资源;

2、协商缓存也叫对比缓存

当强制缓存失效(超过规定时间)时,就需要使用对比缓存,由服务器决定缓存内容是否失效。对比缓存是可以和强制缓存一起使用。

1. last-modified

缺点:

  1. last-modified是以秒为单位的,假如资料在1s内可能修改几次,那么该缓存就不能被使用的;
  2. 如果文件是通过服务器动态生成,那么更新的时间永远就是生成的时间,尽管文件可能没有变化,所以起不到缓存的作用;

2. Etag

Etag是根据文件内容,算出一个唯一的值。服务器存储着文件的 Etag 字段。
之后的流程和 Last-Modified 一致,只是 Last-Modified 字段和它所表示的更新时间改变成了 Etag 字段和它所表示的文件 hash,把 If-Modified-Since 变成了 If-None-Match。
服务器同样进行比较,命中返回 304, 不命中返回新资源和 200。 Etag 的优先级高于 Last-Modified

缺点:

  1. 每次请求的时候,服务器都会把文件读取一次,以确认文件有没有修改;
  2. 大文件进行etag 一般用文件的大小 + 文件的最后修改时间 来组合生成这个etag;

三、Node鉴权

目前常用的鉴权有四种:

  • HTTP Basic Authentication
  • session-cookie
  • Token 验证
  • OAuth(开放授权)

这里主要讨论session-cookie和Token 验证

1、session-cookie

session 是缓存在服务端的,cookie 则是缓存在客户端,他们都由服务端生成,为了弥补 Http 协议无状态的缺陷。

1.session-cookie认证

  1. 服务器在接受客户端首次访问时在服务器端创建seesion,然后保存seesion(我们可以将seesion保存在 内存中,也可以保存在redis中,推荐使用后者),然后给这个session生成一个唯一的标识字符串,然后在 response header 中种下这个唯一标识字符串;
  2. 签名。这一步通过秘钥对sid进行签名处理,避免客户端修改sid;(非必需步骤)
  3. 浏览器中收到请求响应的时候会解析响应头,然后将sid保存在本地cookie中,浏览器在下次http请求的请求头中会带上该域名下的cookie信息。
  4. 服务器在接受客户端请求时会去解析请求头cookie中的sid,然后根据这个sid去找服务器端保存的该客户端的session,然后判断该请求是否合法。

在这里插入图片描述

2.实例:用户登录认证

使用session-cookie做登录认证时,登录时存储session,退出登录时删除session,而其他的需要登录后才能操作的接口需要提前验证是否存在session,存在才能跳转页面,不存在则回到登录页面。

  • 在koa中做一个验证的中间件,在需要验证的接口中使用该中间件。
//前端代码
async login() {
  await axios.post('/login', {
    username: this.username,
    password: this.password
  })
},
async logout() {
  await axios.post('/logout')
},
async getUser() {
  await axios.get('/getUser')
}
//中间件 auth.js
module.exports = async (ctx, next) => {
  if (!ctx.session.userinfo) {
    ctx.body = {
      ok: 0,
      message: "用户未登录" };
  } else {
    await next();
  }
};

//需要验证的接口
router.get('/getUser', require('auth'), async (ctx) => {
  ctx.body = {
    message: "获取数据成功",
    userinfo: ctx.session.userinfo
  }
})

//登录
router.post('/login', async (ctx) => {
  const {
    body
  } = ctx.request
  console.log('body', body)
  //设置session
  ctx.session.userinfo = body.username;
  ctx.body = {
    message: "登录成功"
  }
})

//登出
router.post('/logout', async (ctx) => {
  //设置session
  delete ctx.session.userinfo
  ctx.body = {
    message: "登出系统"
  }
})

2、Token

token 是一个令牌,浏览器第一次访问服务端时会签发一张令牌,之后浏览器每次携带这张令牌访问服务端就会认证该令牌是否有效,只要服务端可以解密该令牌,就说明请求是合法的,令牌中包含的用户信息还可以区分不同身份的用户。一般 token 由用户信息、时间戳和由 hash 算法加密的签名构成。

1. Token认证流程

  1. 客户端使用用户名跟密码请求登录;
  2. 服务端收到请求,去验证用户名与密码;
  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端;
  4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者Local Storage 里;
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token;
  6. 服务端收到请求,然后去验证客户端请求里面带着的 Token(request头部添加Authorization),如果验证成功,就向客户端返回请求的数据 ,如果不成功返回401错误码,鉴权失败;

2. Token和session的区别

session-cookie的缺点:

  1. 认证方式局限于在浏览器中使用,cookie 是浏览器端的机制,如果在app端就无法使用 cookie;
  2. 为了满足全局一致性,我们最好把 session 存储在 redis 中做持久化,而在分布式环境下,我们可能需要在每个服务器上都备份,占用了大量的存储空间;
  3. 在不是 Https 协议下使用 cookie ,容易受到 CSRF 跨站点请求伪造攻击。

3. token的缺点:

  1. 加密解密消耗使得 token 认证比 session-cookie 更消耗性能;
  2. token 比 sid 大,更占带宽;

4. token与cookie的区别

  1. token 认证不局限于 cookie ,这样就使得这种认证方式可以支持多种客户端,而不仅是浏览器。且不受同源策略的影响;
  2. 不使用 cookie 就可以规避CSRF攻击;
  3. token 不需要存储,token 中已包含了用户信息,服务器端变成无状态,服务器端只需要根据定义的规则校验这个 token 是否合法就行。这也使得 token 的可扩展性更强。

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

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

相关文章

node.js express创建本地服务以及使用pm2启动服务

在node.js环境下安装插件&#xff1a; npm i body-parser npm i express 同目录下创建app.js // 引入express中间件 const express require(express); const bodyParser require(body-parser); // 创建web服务器 const app express(); // 使用body-parser中间件解析JSON类型…

对于mp4 android可以正常播放 ios和mac safari不能播放问题处理

直接对原mp4文件进行重新转码就可以了 ffmpeg -i origin.mp4 -vcodec h264 -profile:v high -level 4.1 orgin_hl.mp4 原因源文件不符合苹果基本规则苹果官网文档

在SOLIDWORKS中改善放样的3个要点

在SolidWorks中&#xff0c;“放样”和“扫描”特征是以特征操作复杂和控制艰难而闻名的。通常需要进行精确的选择和仔细的草图管理才能获得最准确并美观的结果。在本文中&#xff0c;我们将向您展示三个简单的技巧&#xff0c;使您的放样特征更上一层楼&#xff0c;同时避免出…

docker映射了端口,宿主机不生效

1、问题产生原因 docker run -d --name my-redis -p 6379:6379 -v /usr/redis.conf:/usr/local/etc/redis/redis.conf team-redis:3.2 redis-server /usr/local/etc/redis/redis.conf 这容器跑起来了&#xff0c;端口6379没用。搞的我一直怀疑哪里出错了&#xff0c;查看配置…

第一篇计算机领域顶会文章怎么发,Best Paper Award其实很简单?

标题&#xff1a;第一篇计算机领域顶会文章怎么发&#xff0c;Best Paper Award其实很简单&#xff1f;&#xff01; 开头&#xff1a; 计算机顶会&#xff0c;即计算机领域的顶级学术会议&#xff0c;是指在计算机科学及其相关领域内具有极高学术水平和广泛影响力的国际会议…

Web应用加密数据传输方案

目录 概述 最初的方案 改进后的方案 秘钥的过期时间 概述 介于公司最近发布了一个面向C端用户的Web系统&#xff0c;为防止前端调用后端的API接口时&#xff0c;数据传输的内容轻易的被黑客获取&#xff0c;而设计的一个前后端数据加密传输方案 最初的方案 在最开始&#xf…

什么是数据分析,企业数据分析的流程是什么?

“有数据、有准确数据的企业在商业市场中能打败50%的同行&#xff1b; 而能根据数据进行揭示过去、预测未来、优化流程的企业&#xff0c;在商业市场中能打败99%的同行&#xff01;“ 那么&#xff0c;企业到底应该如何开展数据分析工作呢&#xff1f;这篇从基本概念讲起&#…

【html+css 绚丽Loading】 000014 三元波动盘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

C++模拟实现priority_queue(优先级队列)

一、priority_queue的函数接口 从上图我们可以看出&#xff0c; priority_queue也是一个容器适配器&#xff0c;我们使用vector容器来模拟实现priority_queue。 namespace bit{#include<vector>#include<functional>template <class T, class Container vector…

Unity教程(十二)视差背景

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

生命科学与医学类专业数据库有哪些

一、Cell Press Cell Press的期刊是生物工程科学方面权威的学术期刊&#xff0c;影响因子一直名列前茅&#xff0c;在生物、医学研究领域享有很高声誉&#xff0c;是公认的了解生物医学最新学术成果的必读文献。可通过Elsevier的ScienceDirect平台访问全文。 二、中华医学期刊…

黑神话:悟空,第一回合boss位置详解大全!

《黑神话&#xff1a;悟空》是一款以中国经典神话为背景的动作角色扮演游戏&#xff0c;玩家将在游戏中扮演齐天大圣孙悟空&#xff0c;经历一系列惊心动魄的冒险和战斗。在游戏的第一章节中&#xff0c;玩家将会遇到各种强大的BOSS&#xff0c;击败它们不仅可以顺利通关&#…

一场机器人盛宴:如何兼顾“月亮”与“六便士”? |直击2024 WRC

一年一度的世界机器人大会是整个机器人行业发展的缩影&#xff0c;从中能看到的是整个行业以及企业内心所怀揣的对未来的理想。 而就2024年来说&#xff0c;这是一场属于机器人的盛宴&#xff0c;也是具身智能公司的集体狂欢。 作者|思杭 编辑|皮爷 出品|产业家 “我们…

Python高阶函数 - reduce

reduce函数作用就是把一个函数作用在一个序列上&#xff0c;这个函数必须接收两个参数&#xff0c;reduce函数把结果继续和序列的下一个元素做累积计算&#xff0c;跟递归有点相似。 reduce函数参数主要包括两个&#xff0c;一个是以上说的作用函数&#xff0c;另外一个是seque…

Shell 脚本开发学习

Shell 教程 1. Shell 脚本 Shell 脚本&#xff08;shell script&#xff09;&#xff0c;是一种为shell编写的脚本程序。注&#xff1a;shell和shell script是两个不同的概念。 2. Shell 环境 Linux 的 Shell 种类众多&#xff0c;常见的有&#xff1a; 。Bourne Shell (/u…

gpt_academic,一个读/写论文的利器

推荐gpt_academic&#xff0c;一个读/写论文的利器 最近看到github上标星60K的读论文和写论文的AI开源工具。 我自己试了一下&#xff0c;配置了五个公司&#xff08;openai、kimi、讯飞、阿里和百度&#xff09;AI的key&#xff0c;能正常使用。 然后我让它读论文&#xff0c…

15 字符数组与二维数组(定义、初始化、访问、遍历、内存调试分析),数组编程练习

目录 1 字符数组&#xff08;字符串&#xff09; 1.1 介绍 1.2 字符数组的定义与初始化 1.2.1 使用字符列表进行初始化 1.2.1.1 VS Code 调试内存 1.2.2 使用字符串字面量进行初始化 1.3 字符数组的访问和遍历 2 多维数组 2.1 介绍 2.2 二维数组的定义 2.2.1 先定义…

探索ACPL-302J光耦合器的多功能性

ACPL-302J是一款高度集成的2.5A栅极驱动光耦合器&#xff0c;经过精心设计&#xff0c;可用于驱动大功率工业应用中的IGBT&#xff08;绝缘栅双极晶体管&#xff09;和功率MOSFET。其精巧的设计和强大的功能使其成为效率、安全性和可靠性至关重要的系统中不可或缺的组件。本文详…

Nature | 应变不敏感的柔性可拉伸射频组件(柔性传感/柔性健康监测/可穿戴电子/界面调控/电子皮肤/柔性电子/集成电路)

韩国首尔汉阳大学Yei Hwan Jung和Hyoungsuk Yoo团队&#xff0c;在《Nature 》上发布了一篇题为“Strain-invariant stretchable radio-frequency electronics”的论文。论文内容如下&#xff1a; 一、 摘要 可实现无线通信和无线能量传输功能的射频&#xff08;radio-frequen…

《黑神话:悟空》专题 收集相关的攻略、壁纸、视频、辅助器等

本专题专注于收集游戏《黑神话&#xff1a;悟空》的相关资料&#xff0c;如游戏攻略、壁纸、音乐、视频等。《黑神话&#xff1a;悟空》是一款以中国神话为背景的动作角色扮演游戏。故事取材于中国古典小说“四大名著”之一的《西游记》。你将扮演一位“天命人”&#xff0c;为…