Session与Cookie的区别(五)

 储存状态的方式

小明的故事说完了,该来把上面这一段变成网络的实际案例了。其实在网络世界中问题也是一样的。

前面已经提到过我们会把状态存在 Cookie 里面,让 Request 之间能够变得有关联。

假设我们今天要来做一个会员系统,那我要怎么知道这个 Request 代表的是哪一个会员?

最直觉的方式就是登入以后把会员帐号存在 Cookie 里面嘛,这样不就知道是谁了吗?

可是会碰到的问题就跟寄杯的故事一样,Cookie 里的东西是可以被窜改的,如果我改成了别人的会员帐号,我就可以伪造他的身份登入了!

解决方法跟上面寄杯的解法一样:

第一个解法就是把 Cookie 里面的内容给加密,这样就无法被窜改了。这种方式就称之为 Cookie-based session,意思就是你把所有的 Session 状态都存在 Cookie 里面。

所以不要把「用 Cookie 来操作 Session 机制」跟「Cookie-based session」搞混了,两者是不一样的。

至于缺点的话前面有提到,Cookie 的大小是有限制的,超过大小的话浏览器就不帮你存了。

因此当你想存的信息越来越多,Cookie 当然也越来越大,就有可能超过这个限制。

或者是哪天你的加密方式以及密钥被黑客破解,那黑客一样可以伪造任何人的身份。

第二个解法就是透过一个 ID 来辨识身份,这个 ID 称之为 Session Identifier,简称 Session ID。

Server 只在 Cookie 里面存一个 Session ID,其余的状态都存在 Server 那边,我习惯把 Server 那边的数据称为 Session Data:

其实就是小明笔记本的翻版而已

Session ID 的产生方式跟前面说的一样,通常会是一个无法猜测的随机数。

你可能会想说:「很难猜是一回事,但机率不是 0 啊!」,对,的确是有机率能够猜到,但是那个机率太低太低了(例如说几千亿分之一之类的)。

而且 Server 在你乱猜猜错几次之后就有可能把你 ban 掉不让你继续猜,所以没什么问题。

不过这边要特别注意的一点是 Session ID 基本上是种认证不认人的方式,也就是说一旦你的 Session ID 被偷走,别人就可以伪造你的身份来登录了。而这个 Session ID 通常都是保存在 Cookie 之中。

这就是为什么有些网站发生骇客入侵的情形之后你会突然被注销,因为黑客可能偷到一批 Session ID,这时候服务器就会把所有 Session 数据全部清空。

以故事来比喻就是把笔记本丢掉,买一本新的,这样被偷走的那些 Session ID 就没用了,而 Server 找不到你的 Session ID,自然就无法登入,因此把你给注销了。

网站发生问题时客服会要你先把 Cookie 清掉也是类似的道理,因为 Cookie 跟状态有关,有时候可能程序有一些 Bug,把你导到了错误的状态,把 Cookie 清空等于把状态清空,重新再开始,就有可能变得正常。

总结

其实我原本以为我很懂 Cookie 跟 Session,但越研究越发现好像不是这么一回事,只是我自我感觉良好而已。

但把该看的数据都看完一遍之后,再让自己沉淀个几天,大致上就能完全理解整个脉络的发展。

Session 是什么?就是一种让 Request 变成 Stateful 的机制。以小明的例子来说,Session 就是一种让客人之间能互相关联起来的机制。

在故事里面我们用了纸条跟手机里的信息来比喻,有多种方式可以达成 Session。

在网络世界中,也有很多种方式可以来实作 Session,前面介绍过第一种是地址栏,第二种就是靠 Cookie,而 Cookie 就是存在浏览器里的一些信息。

常见的错误认知是一定要有 Cookie 才能实作 Session,这是错误的。

有了 Session 之后,会碰到数据被窜改的问题,这时候有两种解决方式:

  • 一个是 Cookie-based session,意思是你照旧把状态存在 Cookie,但是加密以后再存。

  • 另一个方法是把状态存在 Server 端,靠一个 Session ID 来辨识,这个状态你可以存成档案,可以存在內存里,也可以存在数据库,只是实作方式的不同而已,但原理都是一样的。

而这个状态储存的地方在口语上也会被称之为「Session」,例如说:「帮我把 user id 存在 Session 里」,或者是「注销记得把 Session 清空」之类的。

所以在实际用法中,我认为 Session 之所以不好理解是因为太多地方用到同一个词,但却是在指代不同的东西(可是又很类似)。跟 API 有点像,太多地方都用到这个词了。

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

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

相关文章

vue 列表|表格环境中的下拉菜单

elementui组件为vue提供了各式各样的ui组件,但均为各类最为基本的控件,没有提供业务级的使用案例,为此进行扩展补充。 vue-elementui 基本入门使用 一、下拉菜单 下拉菜单与html中的select控件有所差距,select为表单控件的一员页…

windows(iis)服务器部署安装wordpress(php)网站教程

该教程包含iis安装,php安装,mysql安装,php网站部署上线,windows服务部署php网站,只需要这一篇文章就够了。 该教程为iis服务器部署安装wordpress(php)网站教程,同样适用wordpress网站迁移。 配置要求 1、windows服务器安装iis windows服务器安装iis管理器 打开控制面…

项目中使用git vscode GitHubDesktopSetup-x64

一、使用git bash 1.使用git bash拉取gitee项目 1.在本地新建一个文件夹(这个文件夹是用来存放从gitee上拉下来的项目的) 2.在这个文件夹右键选择 git bash here 3.输入命令 git init (创建/初始化一个新的仓库) 4.输入命令 git remote add origin …

医学影像PACS临床信息系统源码

医学影像临床信息系统(Picture Archiving and Communication Systems)PACS是指从医疗影像设备中获得数字影像,利用高速网络进行存储、管理、传输的医疗影像信息管理系统。通过该系统,能实现影像数字化、无胶片化管理。 登记系统 …

配置Picgo图床之COS、OSS、Github图床

简介 PicGo是一款开源的图片上传和管理工具,它提供了简单易用的界面和丰富的功能,方便用户上传、管理和分享图片。 以下是PicGo的一些主要特点和功能: 图片上传:PicGo支持将本地图片快速上传到云存储服务,如七牛云、…

JVM 之 OopMap 和 RememberedSet

前几天看周志明的《深入 Java 虚拟机》,感觉对 OopMap 和 RememberedSet 的介绍,看起来不太容易理解清楚。今天查了一些资料,并结合自己的一些猜想,把对这两种数据结构的理解写出来。目的只是为了简单易懂,而且多有推测…

解决Vue+Element UI使用表单rules国际化时From表单验证信息不能实时更新

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 博主在工作之余开始进行自动化测试平台的开发,虽然已经996一个月了但是还是在使劲挤时间做这件事情,目前平台使用前端框架vu…

LangChain手记 Overview

整理并翻译自DeepLearning.AILangChain的官方课程:Overview 综述(Overview) LangChain是为大模型应用开发设计的开源框架 LangChain目前提供Python和JavaScript(TypeScript)两种语言的包 LangChain的主攻方向是聚合和…

扩散模型实战(三):扩散模型的应用

推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散只是一种思想,扩散模型也并非固定的深度网络结构。除此之外,如果将扩散的思想融入…

MySQL 优化

问题描述 MySQL 的性能优化分为四个部分: 硬件和操作系统层面的优化架构设计层面的优化MySQL 程序配置优SQL 优化 一、硬件及操作系统层面优化 从硬件层面来说,影响 Mysql 性能的因素有,CPU、可用内存大小、磁盘读写速度、 网络带宽。 从操作…

docker solr-8.11.2安装部署

历史背景 现在solr官网仅能够下载到最新版本的安装包。并且支持docker。现在就用docker来部署一下 1、准备工作 docker环境部署(这个自己百度一下哈,很简单两个命令就能解决) yum -y install yum-utils yum -y install docker-ce 安装命令…

爬虫 学习HTML标签和元素的基本概念,了解网页的结构和内容

HTML&#xff08;Hypertext Markup Language&#xff09;是一种用于创建网页的标记语言&#xff0c;由一系列的标签组成。标签使用尖括号&#xff08;< 和 >&#xff09;包围&#xff0c;并且通常成对出现&#xff0c;一个是开始标签&#xff0c;一个是结束标签。 HTML文…

第7集丨Vue 江湖 —— 条件渲染

目录 一、v-show二、v-if2.1 基本使用2.2 条件渲染分组2.3 与 v-else-if、v-else 结合使用 三、v-if vs v-show四、测试案例 本节条件渲染所涉及到的指令有&#xff1a; v-showv-ifv-else-ifv-else 一、v-show 1. 用法&#xff1a; 语法: v-show" 表达式"&#xff…

FFmpeg 使用总结

FFmpeg 简介 FFmpeg的名称来自MPEG视频编码标准&#xff0c;前面的“FF”代表“Fast Forward”&#xff0c;FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。包括如下几个部分&#xf…

QT学习之旅 - Winsock入门

文章目录 服务端初始化为服务器创建套接字sockaddr和sockaddr_ininet_addrhtonl()、htons()、ntohl()、ntohs()四个函数htonl()函数htons()函数ntohs()函数ntohl()函数这些函数存在的意义(就是为了字节存放) 绑定getsockoptudp主函数处理 客户端 客户端和服务器应用程序的前几个…

webpack基础知识九:如何提高webpack的构建速度?

一、背景 随着我们的项目涉及到页面越来越多&#xff0c;功能和业务代码也会随着越多&#xff0c;相应的 webpack 的构建时间也会越来越久 构建时间与我们日常开发效率密切相关&#xff0c;当我们本地开发启动 devServer 或者 build 的时候&#xff0c;如果时间过长&#xff…

那些 MySQL 8.0 中的隐藏特性

在本文中&#xff0c;我想讨论 MySQL 8.0 中的几个相当新的特性&#xff0c;以及一个较老的特性。这些可能是您不知道的次要功能&#xff0c;但值得快速了解一下它们的工作方式以及在某些情况下可能的用途。 作者&#xff1a;Corrado Pandiani 本文来源&#xff1a;Percona 官网…

电源控制--品质因素Q值全解

什么是品质因素Q值&#xff1f; 在电源控制中&#xff0c;品质因素 Q 值通常用于描述电源滤波器的性能。电源滤波器用于减小电源中的噪声和干扰&#xff0c;以提供干净稳定的电源供应给电子设备。 品质因素 Q 值在电源滤波器中表示滤波器的带宽和中心频率之比&#xff0c;用于…

IP提取器对比器

需求&#xff1a; 一个html 页面 &#xff0c;有两个输入框 第一个输入框输入文本中包含多个ip&#xff0c;输入的ip是不规则的&#xff0c;需要使用正则表达式提取出 输入文本的ip地址 &#xff0c; 然后在第二个输入框中输入内容&#xff0c;并提取出内容的ip &#xff0c;如…

Spark 内存管理之 MemoryConsumer

MemoryConsumer 是内存的使用者&#xff0c;如 sort, shuffle。MemoryConsumer 的 spill 方法是抽象方法&#xff0c;由子类提供。 MemoryConsumer 的字段和构造方法如下&#xff1a; public abstract class MemoryConsumer {protected final TaskMemoryManager taskMemoryMan…