秋招突击——8/21——知识补充——计算机网络——cookie、session和token

文章目录

    • 引言
    • 正文
      • Cookie——客户端存储和管理
      • Session——服务端存储和管理
      • Token
      • 补充
        • 签名和加密的区别
        • 常见的加密算法和签名算法
    • 面试题
      • 1、HTTP用户后续的操作,服务端如何知道属于同一个用户?如果服务端是一个集群机器怎么办?
      • 2、如果禁用了Cookie,怎么实现Session
      • 3、Cookie、Session和Token有什么区别?
      • 4、JWT原理和校验机制
      • 5、JWT令牌为什么能够就解决集群部署问题
      • 6、JWT的缺点
      • 7、什么是跨域?什么情况下会发生跨域请求?
    • 总结

引言

  • 马上要面试了,总是觉得会被问到对应的cookie、session和token等解决HTTP无状态的一些协议,这里就整理一下。
  • 除此之外,心里比较紧张,因为估计是最后一轮技术面,过了这个我秋招算是结束了一半了吧!
  • 先别扯这些,继续看吧,不能浪费时间,面试完了,晚上好好整理一下,然后在刷两道题目。
  • 参考信息
    • 图解|cookie、session、token的那些事儿
    • 19 让我知道你是谁:HTTP的Cookie机制
    • 凤凰架构——凭证

正文

  • HTTP本身是无状态,但是很多应用都是基于状态记录实现的,电子商城要记录用户购买商品数量、视频网站需要记录用户的登录状态和保存用户的浏览记录。
  • 主要是通过cookie、session和token解决

在这里插入图片描述

Cookie——客户端存储和管理

1、基本介绍

  • 提示作用的小纸条
    • 是服务器发送到客户端浏览器,并保存在本地的一小块数据,会在浏览器下次向同一服务器再次发送请求时,被携带并发送到服务器上。
  • 具体作用
    • 身份识别,管理会话事物:告知服务端两个请求是否来自同一个浏览器
    • 对网页的个性化设置:用户自定义设置、主题等
    • 广告跟踪:第三方收集你访问目标网站的cookie,然后针对性的对你投放广告

2、Cookie的创建交互过程

  • 服务端Set-Cookie标记
    • 服务端受到客户端的HTTP请求后,在返回的响应中,会添加set-cookie字段
      • 其中包含了创建的独特的身份标识数据“key=value
  • 客户端保存cookie
    • 客户端收到请求之后,会保存下Cookie
    • 后续每一次请求,都附加Cookie信息发送给服务器
    • 如果更换了浏览器就没有办法再次成功创建链接

3、具体交互过程见下图
在这里插入图片描述
4、存在的问题

  • 明文传输
    • 容易被劫持攻击
    • 跨站伪造请求:利用你的cookie向银行发起转账请求
  • 网络负载高
    • 每次发送信息都会有额外的流量消耗
  • 数量和容量限制
    • cookie有容量和数量的限制,无法发送复杂消息
  • 潜在的网络攻击

5、Cookie中包含的信息字段

  • Expires
    • 过期截至时间
  • Max-Age
    • 最大生存时间,接受时间+最大生存时间 就是过期时间
  • 作用域
    • Domain:当前cookie发送给特定的网站域名
    • Path:访问路径

Session——服务端存储和管理

1、简介

  • Session表示服务器和浏览器的一次会话过程
  • 完全由服务端掌握

2、通信流程

  • 1、保存通信信息并生成Session ID

    • Session机制将用户的所有活动信息、上下文信息、登录信息等存储在服务端
    • 根据会话信息生成一个唯一标识的ID发送给客户端
  • 2、客户端保存SessionID标签并放置在请求头上

    • 客户端保存,并在后续的通信中,将Session ID放在请求头
  • 3、客户端验证SessionID读取通信细节

3、主要实现方式

  • Cookie

    • 首选,默认开通并使用的方式
  • URL重写

    • 会话标识号以参数的形式附加在超链接的URL地址后面

在这里插入图片描述

4、存在问题

  • 海量用户时,巨大的存储压力

    • Session存储在服务端,用户量很大的场景,占用空间会很多
  • 分布式系统中的信息共享问题

    • 分布式系统中使用不同的机器存储Session,会有共享问题,无法保证访问的Session在当前机器中存在
      • 信息复制和重建浪费资源
      • 定制化哈希,将session映射到不同的机器上
      • 使用session代理实现信息共享。

Token

1、简介

  • 服务端根据客户端发送过来的信息生成的令牌,发送给客户端
  • 具有时效性的一种验证身份的手段

2、交互流程

  • token生成过程
    • 准备载荷PayLoad
      • 以Json的格式保存用户非敏感信息,但是能够表示用户 状态的信息
    • 编码载荷PayLoad
      • 将json转成字符串 ,并使用Base64编码
    • 准备头部header
      • Token类型和哈希算法
    • 组合头部和载荷
      • 使用.连接起头部和载荷
    • 生成签名
      • 头部 + 载荷特定哈希算法生成哈希值私钥进行签名
      • 将签名的结果进行Base64编码
    • 组装和发送Token
      • 头部(base64编码).载荷(base64编码).签名(base64编码) 进行连接,形成token串,然后进行发送。

在这里插入图片描述

  • token验证过程
    • 提取Token
      • 提取token中的header字段和PayLoad字段
    • 生成临时signature
      • 使用服务端保存的密钥,base64编码下的header和payload进行加密,生成临时签名
    • 比较签名是否修改
      • 比较临时signature和原来的signature是否相同的
        • 相同,说明没有修改过,验证是否过期,没有过期就处理请求
        • 不同,说明已经修改过了,不合法,返回失败信息401(未授权状态码)

在这里插入图片描述

补充

签名和加密的区别

1、目的不同

  • 加密
    • 保护数据的机密性,防止未经授权的人访问和读取数据
    • 只有授权用户才能解密的格式
      • 对于对称加密而言,就是同时持有密码的两方才能解密
      • 对于非对称加密而言,就是公钥进行加密,然后私钥进行界面,持有私钥的才能获取信息
  • 签名
    • 验证数据的完整性和来源的真实性——发送者有很多,只有持有私钥发送的才是合法的
    • 签名
      • 持有私钥方,对数据进行加密。(其他人持有公钥可以解密,但是没有私钥,没有办法加密,所以无法修改)
      • 接收方使用发送方的公钥的来验证签名的有效性,确认数据在传输过程中是否被更改过。

2、使用方式不同

  • 加密

    • 非对称加密
      • 公钥进行加密,私钥持有者进行解密,是单向发送的
    • 对称加密
      • 通信双方使用相同密钥,双向通信
  • 签名

    • 私钥
      • 对数据进行签名,生成签名文件
      • 签名者持有的,Token中就是的服务端就是签名持有者
    • 公钥
      • 对签名进行验证,对私钥进行解密,验证数据是否完整
      • 公开给所有需要验证签名的人
常见的加密算法和签名算法

签名算法

  • RSA
  • DSA
  • ECDSA

加密算法

  • 对称加密算法
    • AES、ADS、IDEA
  • 非对称加密算法
    • RSARCDHE

面试题

1、HTTP用户后续的操作,服务端如何知道属于同一个用户?如果服务端是一个集群机器怎么办?

Session Cookie机制

  • 通过session cookie机制实现用户登录状态的管理
    • 服务端验证客户端的用户信息后,通过验证会对当前的会话生成唯一的session id,分别保存在服务器端以及通过cookie 发送给客户端,并设定set-cookie字段
    • 后续客户端在访问网站时,将带有session id的cookie发送给服务端,服务端通过匹配数据库来获取之前的用户信息,避免重复登陆

集群请求

  • ** redis保存所有Session ID**
    • 使用redis作为缓存保存所有的Session ID,然后由redis进行session id的检索和判定
    • 单点故障,多机部署成本高
  • 使用JWT
    • JWT的状态信息是保存在客户端的,不过会附加上对应的signature,防止token被修改

2、如果禁用了Cookie,怎么实现Session

  • 一般是通过cookie传输session id的
  • 可以通过重写URL来实现,在URL中增加一个字段sessionid=

3、Cookie、Session和Token有什么区别?

存储位置

  • Cookie是存储在客户端,通过HTTP头传递给服务器来通信
  • Session是存储在服务端,服务器的内存或者数据库
  • Token存储在客户端,但是以加密的方式存储在客户端LocalStorage和SessionStorage

安全性

  • cookie存储在客户端,存在窃取和篡改的风险
  • Session存储在服务端,通过session-id在客户端和服务器之间进行关联,避免敏感数据直接暴漏
  • Token加密算法生成,有效期短,并且单向不可逆

跨域支持不同

  • Cookie不支持跨域传输,不同域名下cookie不能混用
  • Session不支持跨域传输,Session一般是通过cookie来传输SessionID
  • Token是保存在客户端的localStorage,并且作为请求头的一部分发送给服务器,不同域名的Token可以共享,只要的密钥共享就行了

状态管理不同

  • cookie是应用程序通过在客户端临时存储数据,实现状态管理的一种机制
  • session是服务器记录状态的方式,为每一个会话分配一个session ID,并将其和用户状态相关联
  • token是用于认证和授权的机制,表示用户的身份信息和权限信息

4、JWT原理和校验机制

  • 如下图
    • 生成token

      • 服务器校验用户的账号和密码,然后生成token,主要有三部分构成,分别是header和payload
      • header指明了当前token的类型,默认一般是jwt,然后签名算法是加密这个token的常见的加密算法
      • payload是负载,包含了用户的标识符,用户的权限信息,
      • 然后对payload和header分别进行base64编码,并使用.链接
      • 接着使用指定的签名算法,使用保存在服务端的私钥对前两者的链接进行加密,生成signature,然后再用base64编码
      • 最后将上述三者使用.链接,然后在发送给客户端
    • 校验token

      • 获取token中的header和payload,然后使用保存的密钥对其进行加密,生成临时token
      • 然后再和signature进行比较
        在这里插入图片描述

5、JWT令牌为什么能够就解决集群部署问题

  • JWT中包含了用户的身份、状态等信息,这些信息是保存在客户端的,然后服务端只需要保存的对应的私钥就行了!

6、JWT的缺点

1、难以主动失效

  • 一旦签发,所有的逻辑都和服务器无关,除非另外自动到期失效。
    • 黑名单:将需要额外判断失效的令牌存起来,如果在这里面就默认是无效的
      2、防盗用
  • 令牌里面含有用户的身份认证信息,一旦泄露很危险,所以一般设置的过期时间都比较短

7、什么是跨域?什么情况下会发生跨域请求?

同资源的定义

  • 协议、端口、域名相同
  • 限制一个网页中的脚本只能访问同源下的资源,不能访问其他域下的资源

跨域限制

  • 跨域请求在浏览器上是不被允许的,只要在浏览器上发生了跨域请求,就会报错,No Access-Control-Allow-Origin

绕过跨域限制的方式

  • 使用反向代理
    • 通过Nginx等工具设置反向代理,将请求发送到目标服务器
  • CORS跨域共享技术

总结

  • 目前是将cookie、Session还有token都画图画了一遍,理解更加深刻了,基本上很多东西都是可以根据这个图片内容推导出来的!
  • 加油!继续准备面试!

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

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

相关文章

android13隐藏调节声音进度条下面的设置按钮

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 3.代码修改 4.编译运行 5.彩蛋 1.前言 将下面的声音调节底下的三个点的设置按钮,隐藏掉。 效果如下 2.情况分析 查看布局文件 通过布局我们可以知道这个按钮就是 com.android.keyguard.AlphaOptimizedImageB…

记忆化搜索与状态压缩:优化递归与动态规划的利器

记忆化搜索是解决递归和动态规划问题的一种高效优化技术。它结合了递归的灵活性和动态规划的缓存思想,通过保存已经计算过的子问题结果,避免了重复计算,大幅提升了算法的效率。当问题状态复杂时,状态压缩技术可以进一步优化空间使…

跨域解决 | 面试常问问题

跨域解决 | 面试常问问题 跨域问题一直是前端开发中不可避免的一部分,它涉及到浏览器的同源策略和安全机制。本文将深入解析跨域问题的本质,并探讨前端和后端的多种解决方案,同时分享一些扩展与高级技巧。最后,我们还将总结跨域解…

UE基础 —— Components

目录 Component Instancing Instanced Static Mesh Component Instanced Static Mesh Differences of an ISM and a Static Mesh Component Hierarchical Instanced Static Mesh Instancing Systems Working with ISMs Prefabrication Custom Data Creating and Edit…

ElasticSearch 8.15.0 与 Kibana 8.15.0 尝鲜体验

还不算晚,虽然已经距离发布过去了快半个月~ 跟着下面的步骤进行一步一步操作(CV),只需要改动一下用户名、密码这些数据即可从零开始用 Docker安装 ES 与 Kibana 最新版,据说 Kibana 还有 AI 助手嘞(虽然是 8.12 推出的)~ 最后强调一点&#…

自动化开发流程:使用 GitHub Actions 进行 CI/CD

在现代软件开发过程中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)是确保高质量软件交付的关键组成部分。GitHub Actions 提供了一种简便的方式来实现 CI/CD 流程的自动化。本文将介绍…

Unity XR Interaction Toolkit 通过两个手柄控制物体放大缩小

1:给物体添加 XR General Grab Transformer 脚本 2:XR Grab Interactable 的 select mode 选择 Multiple

java-队列--黑马

队列 别看这个,没用,还是多刷力扣队列题 定义 队列是以顺序的方式维护一组数据的集合,在一端添加数据,从另一端移除数据。一般来讲,添加的一端称之尾,而移除一端称为头 。 队列接口定义 // 队列的接口定…

Linux——驱动——杂项设备

一、杂项设备驱动 1、概念 杂项设备(Miscellaneous Devices)在Linux内核中是一种特殊的设备类型,用于表示那些不适合被归类为其他标准设备类型的设备。这些设备通常具有不规则的特性和非标准的通信协议或接口。 2、操作流程 杂项设备注册过…

中国数据库的崛起:从本土化挑战到全球化机遇

引言 谈起中国的崛起,大家第一反应可能是“中国制造”“高铁奇迹”“电商帝国”,但今天我们要聊的,是一个比这些还要神秘的存在——中国的数据库技术。或许你平时并不会经常关注它,但这个隐身在你手机、电脑、服务器背后的无形力…

002、架构_概览

GoldenDB 主要由管理节点、计算节点、数据节点、全局事务节点等模块组成,各个节点无需共享任何资源,均为独立自治的通用计算机节点,之间通过高速互联的 网络通讯,从而完成对应用数据请求的快速处理和响应。 管理节点在数据库中主要…

如何在寂静中用电脑找回失踪的手机?远程控制了解一下

经过一番努力,我终于成功地将孩子哄睡了。夜深人静,好不容易有了一点自己的时间,就想刷手机放松放松,顺便看看有没有重要信息。但刚才专心哄孩子去了,一时就忘记哄孩子之前,顺手把手机放哪里去了。 但找过手…

种树问题——CSP-J1真题讲解

【题目】 小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他休息。则小明一共有( ) 种选择时间段的方案 A. 31 B. 18 C. 21 D. 33 【答案】 B 【解析…

Vue.js学习笔记(七)使用sortablejs或el-table-draggable拖拽ElementUI的el-table表格组件

文章目录 前言一、el-table-draggable是什么?二、使用步骤1.安装使用2.sortablejs 总结 前言 记录 el-table-draggable 插件使用方法。 一、el-table-draggable是什么? el-table-draggable的存在就是为了让vue-draggable支持element-ui中的el-table组件…

卸载nomachine

网上的方法:提示找不到命令 我的方法: step1. 终端输入 sudo find / -name nxserver 2>/dev/null确认 NoMachine 的实际安装路径。你可以使用 find 命令在系统中查找 nxserver 脚本的位置。 找到路径后,你可以使用该路径来卸载 NoMachine。 如下图,紫色框中是我的路径…

Android - lock/unlock bootloader

在执行 adb remount 时高版本经常会提示失败 此时就需要对设备的进行解锁操作。记录两个部分,Google解锁和展锐解锁。 目录 一、Google解锁 二、展锐解锁 三、补充跳过按键检测的方案 一、Google解锁 官网介绍的unlock方法如下:锁定/解锁引导加载程序…

RK3588 技术分享 | 在Android系统中使用NPU实现Yolov5分类检测-迅为电子

随着人工智能和大数据时代的到来,传统嵌入式处理器中的CPU和GPU逐渐无法满足日益增长的深度学习需求。为了应对这一挑战,在一些高端处理器中,NPU(神经网络处理单元)也被集成到了处理器里。NPU的出现不仅减轻了CPU和GPU…

Linux基础环境开发工具gcc/g++ make/Makefile git

1.Linux编译器-gcc/g使用 1. 预处理(进行宏替换) 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。 选项“-o”是指目标…

【Java数据结构】---二叉树OJ

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 ,Java 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 文章目录 相同的树另一颗树的子树翻…

linux死锁问题和cpu使用率过高问题排查

1、问题共同点 死锁问题和cpu使用率过高都是需要我们找出对应的问题线程。 死锁问题需要我们找出哪两个线程出现了死锁情况。 cpu使用率过高需要我们找出哪个或哪些线程占用了大量的cpu。 2、命令排查 2.1、查看机器上的Java进程 jcmd或 jps2.2、查看对应Java进程的线程级别…