一文读懂:Session、Cookie与Token

我是小白刚刚接触JWT,看了b站一些相关视频、查了中国知网和csdn其他人的文章之后,总结出了这篇文章。写文章的初心是为了检验自己是否透彻了解了知识点以及之后复习。如果标题党了,斯米马赛请原谅!!!欢迎大家批评指导!

目录

  • 引言
    • Cookie概述
      • Cookie的工作原理
    • Session概述
      • Session的工作原理
    • 为什么session比Cookie更安全?
    • Token概述
      • 基于Token的工作原理
    • 为什么要引入Token,session存在的问题是什么?
      • session存在的问题
      • Token的优点

引言

由于HTTP协议本身是无状态的,当服务器对用户请求进行响应后,便会断开与客户端的连接。当用户通过相同的客户端再次访问服务器时,服务器无法自动识别用户的身份,也无法确认当前请求是否源自先前的客户端。
随着交互式Web应用的快速发展,如购物网站等需要用户登录的应用场景日益增多,这就要求实现会话管理,以便记录并追踪用户的登录状态。因此,为了解决这一问题,cookie、session以及JWT(JSON Web Token)等身份认证工具应运而生。

Cookie概述

在Web应用中,Cookie是HTTP协议制定的一种会话跟踪技术,它是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。

Cookie是一种运输信息的工具,在客户端和服务端之间往返运输信息的“小包裹”

Cookie的工作原理

Cookie的工作原理图

  1. 设置 Cookie ,服务器通过 HTTP 响应头向浏览器发送一个或多个 Cookie。Cookie 包含名称、值、过期时间、路径和域等信息。例如:“Set-Cookie: username=john; Expires=具体时间; Path=/; Domain=example.com”。
  2. 存储 Cookie
    浏览器接收 Cookie 后,将其存储在本地文件或内存中。浏览器会根据 Cookie 的域、路径和过期时间等信息,确定在后续访问中哪些 Cookie 应发送给服务器。
  3. 发送 Cookie
    当再次访问同一个网站时,浏览器在 HTTP 请求头中自动包含该网站设置的 Cookie。例如:“Cookie: username=john”。服务器可据此获取用户信息。
  4. 修改和删除 Cookie
    修改:服务器发送新的 Set-Cookie 响应头来覆盖旧的 Cookie。
    删除:通过设置 Cookie 的过期时间为过去的时间来实现。例如:“Set-Cookie: username=; Expires=很早以前的时间; Path=/; Domain=example.com”。

Session概述

session翻译过来就是会话,它的主要作用是在用户与服务器交互的过程中,保持用户的状态信息。

例如,在用户登录一个网站后,服务器可以使用 Session 来记录用户的登录状态,以便在用户浏览不同页面时,服务器能够识别出该用户已经登录,无需再次输入用户名和密码。

Session的工作原理

session的工作原理图

  1. 创建 Session:用户首次访问特定页面(如“/setSession.jsp”)时,因未携带“jsessionid”,服务器会创建新的 Session,作为该用户的独立存储区域,可保存特定信息,如放入“name”,便于后续识别和使用相关数据。
  2. Session ID 传递与存储:服务器创建 Session 时生成唯一“jsessionid”,浏览器接收响应后将其存于 cookie。后续用户访问其他页面,浏览器会自动在请求中携带此“jsessionid”。
  3. 识别与获取 Session 数据:用户访问“/getSession.jsp”等页面时,浏览器在请求中带上 cookie 中的“jsessionid”。服务器接收请求后,将其与服务器端所有 Session 比较,找到对应 Session 后可取出特定数据(如“name”),实现用户状态识别和数据获取,提供个性化服务。

为什么session比Cookie更安全?

既然有Cookie了,为什么还要引入session?Cookie的缺陷在哪?session解决了Cookie的什么问题?
可以参考这篇:
Cookie对象的缺陷与应对策略

  1. 存储位置不同:session 保存在服务器端,信息不容易被窃取或篡改;cookie 保存在客户端,相对容易被攻击。
  2. 加密措施:session 使用加密措施保护传输数据,cookie 没有此保护。
  3. 过期时间:session 数据可设置过期时间,过期后即使被窃取也无法使用;cookie 过期时间可被修改,易被滥用。
  4. HTTPOnly 属性:session 可设置 HTTPOnly 属性禁止客户端脚本直接访问,避免客户端脚本攻击。综上所述,session 比 cookie 更安全。

这里的安全性问题也可以参考一下csdn @Rongwenbin 博主的文章:
老生常谈session、cookie的区别、安全性

Token概述

Token是服务端根据用户信息生成的独一无二的令牌。用户第一次登录时,服务端生成令牌,由客户端保存。当客户端再次访问服务器时,只需要带上令牌,无需用户名和密码。

基于Token的工作原理

token工作原理
核心内容如下:

一、前端操作
用户在前端输入用户名和密码。

二、服务器端生成 Token
服务器端(如 MySQL 校验成功后)返回一个 Token 给前端。

三、请求 API 携带 Token
前端在发送 HTTP 请求 API 时携带 Token.

四、服务器端校验 Token
服务器端采用过滤器对 Token 进行校验,若校验通过则返回请求数据,若校验不通过则返回错误码。

为什么要引入Token,session存在的问题是什么?

session存在的问题

1.内存开销 session是基于服务器进行验证的,存储在服务端。每次认证用户要发起请求时,服务端就要存储信息,当越来越多的请求发起,内存开销会不断增加。
2. 可扩展性 如果用户量少的话,一台服务器不存在扩展性问题,但是如果用户很多,使用服务器集群,也就是很多台服务器,那么在负载均衡的时候,不能保证每一次都发到同一台机器上,这样就没法验证身份,用户又会返回登录界面,重新登录。
3.跨域资源共享(CORS):当需要让数据跨多台移动设备使用时,跨域资源的共享会是一个让人头疼的问题。在使用 Ajax 抓取另一个域的资源,就可能会出现禁止请求的情况。
4.跨站请求伪造(CSRF):用户在访问银行网站时,很容易受到跨站请求伪造的攻击,并且容易被利用访问其他的网站。在这些问题中,可扩展性是最突出的,因此有必要去寻求一种更行之有效的方法。

Token的优点

无状态,可扩展: Token是无状态的,也就是不在服务端存储。这样的好处就是可以根据需求增加机器,无需考虑用户是否登录。
安全性 :请求中发送 token 而不再是发送 cookie 能够防止跨站请求伪造(CSRF)。即使在客户端使用 cookie 存储 token,cookie 也仅是一个存储机制而不是用于认证。不将信息存储在 Session 中,让我们少了对 session 操作。
多平台跨域:再来谈论一下跨域资源共享(CORS):对应用程序和服务进行扩展的时候,需要介入各种设备和应用程序。只要用户有一个通过了验证的 token,数据和资源就能够在任何域上被请求到。

参考文献:
[1]详细了解Cookie Session Token 2019(22)
[2]基于Cookie的会话跟踪技术及应用 2021(10)

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

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

相关文章

企业AI助理与知识库管理系统:重塑企业知识管理的新篇章

在数字化转型的浪潮中,企业正面临着前所未有的机遇与挑战。如何高效管理、快速获取并利用企业内部的知识资源,成为了提升企业竞争力的关键。近年来,企业AI助理与知识库管理系统的结合,正逐步成为企业知识管理的新趋势,…

【C语言】循环嵌套:乘法表

循环嵌套&#xff0c;外层循环执行一次&#xff0c;内层循环执行i次。分别控制 在循环的过程中加一层循环。 多层循环属于循环嵌套、嵌套循环 #include <stdio.h> #include <math.h> /* 功能&#xff1a;循环嵌套 乘法表 时间&#xff1a;2024年10月 地点&#xf…

老机MicroServer Gen8再玩 OCP万兆光口+IT直通

手上有一台放了很久的GEN8微型服务器&#xff0c;放了很多年&#xff0c;具体什么时候买的我居然已经记不清了 只记得开始装修的时候搬家出去就没用了&#xff0c;结果搬出去有了第1个孩子&#xff0c;孩子小的时候也没时间折腾&#xff0c;等孩子大一点的时候&#xff0c;又有…

使用Python PyQt5 vscode 制作流水灯或者交通灯

需要用到 Python PyQt5 vscode&#xff0c;其他的各模块引用在代码里面有&#xff0c;自己找找就行 制作流水灯代码 import sys from PyQt5.QtCore import (QEvent, QTimer, Qt,QPoint) from PyQt5.QtWidgets import (QApplication, QMenu,QMainWindow) from PyQt5.QtGui imp…

限时设计ui

ctrl-------放大缩小 空格-----画面移动 alt------复制 页面<画板<图层 添加交互事件 原型 点击蓝色的圆&#xff0c;从1跳转到2 点击绿色的圆&#xff0c;从2跳转到1

如何实现安川MP3300运动控制器与西门子1200系列PLC进行ModbusTCP通讯

在工业自动化中&#xff0c;实现不同品牌、不同型号设备之间的通讯是确保生产流程顺畅、高效运行的关键。本文详细介绍了安川MP3300运动控制器与西门子1200系列PLC进行ModbusTCP通讯的具体方法。 一&#xff0e;软硬件需求 1.一台安川MP3300CPU301&#xff0c;其IP地址是192.…

类和对象的认识

类&#xff1a;类是用来描述一个对象的&#xff0c;在java中万物皆对象&#xff0c;通过对类的抽象&#xff0c;类有哪些属性和行为&#xff0c;将这些抽象出来就是类。比如&#xff1a;狗&#xff0c;有名字&#xff0c;年龄&#xff0c;要吃饭的行为等等&#xff0c;将这些动…

ssh连接慢的问题或zookeeper远程连接服务超时

问题原因&#xff1a; 在SSH登录过程中&#xff0c;服务器会通过反向DNS查找客户端的主机名&#xff0c;然后与登录的IP地址进行匹配&#xff0c;以验证登录的合法性。如果客户端的IP没有域名或DNS服务器响应缓慢&#xff0c;这可能导致SSH登录过慢。为了解决这个问题&#xf…

【无处躲藏的图片】和【时隐时现的图片】

文章目录 一、效果二、源码1. pom依赖2. 核心源码13. 核心源码2 一、效果 二、源码 1. pom依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency…

vue3基础入门以及常用api使用

setup setup 的返回值可以是函数 data(){ return { a:111, c:this.name } }, setup(){ let name 1111 return ()> 哈哈哈 }//结果页面就是会显示 哈哈哈setup和 OptionsAPI关系 data能和setup能同时存在&#xff0c;但不建议 data能读到setup里边的数据 setup是最早的生命…

【二刷hot-100】day2

目录 1.无重复字符的最长子串 2.找到字符串中所有字母异位词 3.和为 K 的子数组 4.滑动窗口最大值 1.无重复字符的最长子串 class Solution {public int lengthOfLongestSubstring(String s) {Map<Character,Integer> dict new HashMap<>();int ret0;int i-1;for…

使用 GoZero 框架实现一个简单的course课程class系统

使用 GoZero 框架实现一个简单的课程增删改查&#xff08;CRUD&#xff09;功能需要进行以下步骤&#xff1a;设置 GoZero 项目、定义数据模型、创建相应的 API 接口以及实现 CRUD 操作。下面是一个示例代码&#xff0c;包括基本的课程管理功能。 ### 1. 安装 GoZero 首先&…

基于SSM党务政务服务热线管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;部门管理&#xff0c;办事信息管理&#xff0c;信息记录管理&#xff0c;系统管理 前台账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;部门&#xff0c;信息…

十月编程语言排行榜~

前言&#xff1a;TIOBE编程语言排行榜通过分析全球开发者的活动、代码搜索和问答社区的流量&#xff0c;提供了编程语言受欢迎度的动态图景。该指数是技术趋势的风向标&#xff0c;揭示了哪些编程语言在技术领域占据主导地位&#xff0c;哪些语言正在快速崛起或逐渐衰退。 ✨✨…

骨传导耳机哪款比较值得入手?五款热门机型实测内容分享!

在贴吧、论坛、知乎等社区网站上&#xff0c;大家可能经常看到用户吐槽、讨论骨传导耳机哪种好等话题。很多人反映&#xff0c;由于使用了不适合的骨传导耳机&#xff0c;出现了听力不适、佩戴不稳等诸多问题。作为一名有着丰富经验的数码测评师&#xff0c;我对此问题非常关注…

考研数据结构——C语言实现二叉树前,中,后序非递归遍历

定义二叉树节点&#xff08;BTree&#xff09;&#xff1a; ElemType value&#xff1a;存储节点的值。struct BTree* LeftChild&#xff1a;指向左子节点的指针。struct BTree* RightChild&#xff1a;指向右子节点的指针。 节点访问函数&#xff08;visit&#xff09;&#x…

Linux SSH无密码使用私钥远程登录连接详细配置流程

文章目录 前言1. Linux 生成SSH秘钥对2. 修改SSH服务配置文件3. 客户端秘钥文件设置4. 本地SSH私钥连接测试5. Linux安装Cpolar工具6. 配置SSHTCP公网地址7. 远程SSH私钥连接测试8. 固定SSH公网地址9. 固定SSH地址测试 前言 本文将详细介绍如何将Linux SSH服务与cpolar相结合&…

【算法】深入理解布隆过滤器

1. 什么是布隆过滤器&#xff1f; 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高的概率型数据结构&#xff0c;用于检测某个元素是否在一个集合中。与常见的数据结构如哈希表不同&#xff0c;布隆过滤器无法删除元素&#xff0c;并且会存在一定的误判率&…

实操部署amis-admin

当需要做一个web服务的时候&#xff0c;前端的实现很令我头疼。搜了一圈前端低代码框架后&#xff0c;注意到百度贡献的amis&#xff0c;通过json来写前端&#xff0c;很酷啊。不得不说&#xff0c;一个好的demo项目&#xff0c;真的能让人迅速进入状态&#xff0c;比直接看文档…

c++常用库函数

一.sort排序 快排的改进算法&#xff0c;评价复杂度为(nlogn). 1.用法 sort(起始地址&#xff0c;结束地址下一位&#xff0c;*比较函数) [起始地址&#xff0c;结束地址) (左开右闭) #include<bits/stdc.h> using namespace std; int main() {//sortvector<int&g…