Cookie,Session,Token,JWT授权方式对比

news2024/9/17 7:37:03

文章目录

    • HTTP
    • Cookie
    • Session
      • Session认证流程
      • Session 共享方案
    • Token
      • Token认证流程
    • JWT
      • JWT认证流程

HTTP

HTTP 本质上是无状态的,每个请求都是互相独立、毫无关联的,协议不要求客户端或服务器记录请求相关的信息。服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。所以服务器与浏览器为了进行会话跟踪,就主动的去维护了一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器,而这个状态需要通过 cookie 和 session 去实现。

  • 更多HTTP相关的知识:
    • HTTP协议之基础篇

Cookie

  • Cookie 存储在客户端,Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
  • Cookie是不可跨域的: 每个 Cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。
  • Cookie存在安全隐患,通过拦截或本地文件找到你的Cookie可以进行攻击。
  • Cookie 有大小限制(不能超过4K)以及浏览器也可能存在对Cookie的个数限制(一般最多保存20个cookie)。
  • 移动端对 Cookie 的支持不是很好。

Session

  • Session 是客户端与服务端维持的一个有状态会话。
  • Session 是常见的基于Cookie 实现的,也可以基于传输时用body来传输Session来实现。
  • Session 存储在服务器端,SessionId 会被存储到客户端的Cookie 中,也可以存储在LocalStorage(浏览器)。
  • Session 能够有效管理用户登录的状态:续期、销毁等。
  • 当网站采用集群部署的时候,会遇到多台 web 服务器之间如何做 Session 共享的问题。
  • 服务端需要存储Session数据,当用户同时在线量比较多时,服务端内存压力也大。

Session认证流程

在这里插入图片描述

  • 用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的Session并存储。
  • 请求返回时将此 Session 的唯一标识信息 SessionId 返回给浏览器
  • 浏览器接收到服务器返回的 SessionId 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionId 属于哪个域名。
  • 当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息:
    • 如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionId,再根据 SessionId查找对应的 Session 信息。
  • 如果没有找到说明用户没有登录或者登录失效如果找到 Session 证明用户已经登录可执行后面操作。

以上的Session认证实现是基于Cookie的。假如浏览器禁止 Cookie或不支持 Cookie。一般会把 SessionId 跟在 url 参数后面即重写 url,所以 Session 不一定非得需要靠 Cookie实现。

Session 共享方案

Session复制

  • 任何一个服务器上的 session 发生改变(增删改),该节点会把这个 session 的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要 session ,以此来保证 session 同步
  • 优点: 可容错,各个服务器间 session 能够实时响应。
  • 缺点: 会对网络负荷造成一定压力,如果 session 量大的话可能会造成网络堵塞,拖慢服务器性能。

粘性 Session /IP 绑定策略

  • 采用 Ngnix 中的 ip_hash 机制,将某个 ip的所有请求都定向到同一台服务器上,即将用户与服务器绑定。
  • 优点: 简单,不需要对 session 做任何处理。
  • 缺点: 缺乏容错性,如果当前访问的服务器发生故障,用户被转移到第二个服务器上时,他的 session 信息都将失效。

Session 共享

  • 使用分布式缓存方案,比如Redis 来缓存 Session。
  • 把 session 放到 Redis 中存储,虽然架构上变得复杂,并且需要多访问一次 Redis ,但是这种方案带来的好处也是很大的:
    • 实现了 session 共享,可以水平扩展。
    • 服务器重启 session 不丢失(不过也要注意 session 在 Redis 中的刷新/失效机制)。
    • 不仅可以跨服务器 session 共享,甚至可以跨平台。

Session 持久化

  • 将 session 存储到数据库中,保证 session 的持久化。
  • 优点: 服务器出现问题,session 不会丢失。
  • 缺点: 如果网站的访问量很大,把 session 存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销维护数据库。

Token

  • 访问资源接口(API)时所需要的资源凭证
  • 简单Token的组成: 无意义的一串随机字符串。
  • 特点:
    • 服务端无状态化、可扩展性好
    • 支持移动端设备
    • 安全
    • 支持跨程序调用

Token认证流程

在这里插入图片描述

  • 客户端使用用户名和密码请求登录;服务端收到请求,去验证用户名与密码。(也可以使用短信验证码,邮箱等方式登录)
  • 验证成功后,服务端会签发一个Token并存储,然后把这个Token发送给客户端。
  • 客户端收到 Token以后,会把它存储起来 (Cookie 或者 LocalStorage) 。
  • 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token。
  • 服务端收到请求,然后拿着服务端存储的Token去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请求的数据。

普通Token其实就是照着SessionId的思路实现的。这样就不依赖于Cookie或者Session了。

JWT

  • JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案。
  • JWT 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准。
  • JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。
  • 可以使用 HMAC 算法或者是 RSA 的公/私秘钥对 JWT 进行签名。因为数字签名的存在,这些传递的信息是可信的。
  • 可以将JWT当作一种特殊的Token,Token中会携带用户的很多信息。

JWT认证流程

在这里插入图片描述

  • 客户端使用用户名和密码请求登录;服务端收到请求,去验证用户名与密码。(也可以使用短信验证码,邮箱等方式登录)
  • 验证成功后,服务端会通过自己加密算法签发一个Token(服务端不存储),这个Token中会携带很多用户信息等其他信息,然后把这个Token发送给客户端。
  • 客户端收到 Token以后,会把它存储起来 (Cookie 或者 LocalStorage) 。
  • 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token。
  • 服务端收到请求,然后服务端会解密客户端请求里面带着的Token,如果验证成功,就向客户端返回请求的数据。

普通Token和JWT的区别:服务端验证客户端发来的token信息要进行数据的查询操作;JWT验证客户端发来的token信息就不用, 在服务端使用密钥校验就可以,不用数据的查询。

  • 每种方案各有优缺点,选择适合业务的方案就可以。

你知道的越多,你不知道的越多。

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

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

相关文章

升级一下《单词猜谜》

网上的单词猜谜都是英文的,不会英语的头痛 于是,我把《单词猜谜》改成中文,并且加上了点新功能: import random as rdmc rdm.randint(1, 3)name1 input("你的名字叫什么?:") if c 1:turns1 …

详解BigDecimal

目录 1.概述 2.基本API 2.1.创建 BigDecimal 对象: 2.3.基本运算方法: 2.4.精度控制方法: 2.5.比较 2.6.转换 3.注意事项 4.底层实现原理 1.概述 精度丢失,由于现代计算机中采用了浮点数来表示小数,这种表示…

小马哥训练营-Java EE单体架构

什么是Servlet Servlet 是一种基于 Java 技术的 Web 组件,用于生成动态内容,由容器管理。类似于其他 Java 技术组件,Servlet 是平台无关的 Java 类组成,并且由 Java Web 服务器加载执行。通常情况,由 Servlet 容器提供…

(十一)CSharp-LINQ-查询表达式(2)

一、查询表达式 1、查询表达式的结构 查询表达式由 from 子句和查询主体组成。 子句必须按照一定的顺序出现。from 子句和 select…group 子句这两部分是必需的。其他子句是可选的。在 LINQ 查询表达式中,select 子句在表达式最后。可以有任意多的 from…let…wh…

Nginx服务器的六个修改小实验

一、Nginx虚拟主机配置 1.基于域名 (1)为虚拟主机提供域名解析 配置DNS 修改/etc/hosts文件 (2)为虚拟主机准备网页文档 #创建网页目录 mkdir -p /var/www/html/abc mkdir -p /var/www/html/def ​ #编写简易首页html文件 ec…

Finalshell安全吗?Xshell怎么样?

文章目录 一、我的常用ssh连接工具二、Xshell2.1 下载:认准官网2.2 Xshell 配置2.3 Xftp和WinSCP 一、我的常用ssh连接工具 之前讲过: 【服务器】远程连接选SSH(PUTTY、Finalshell、WinSCP) 还是 远程桌面(RDP、VNC、…

代码随想录训练营第四十二天|01背包、416.分割等和子集

01背包 代码随想录理论讲解 背包问题分类 01背包 问题描述 有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 动归五部曲 确定dp数组及下…

基于java web高校社交系统 /springboot高校社交系统

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的系统应运而生,各行各业相继进入信息管理时代&#…

CSS处理页面元素浮动的几个办法

CSS处理页面元素浮动的几个办法 不使用浮动的情况下&#xff0c;子盒子1和2分别在盒子1中占据一行的空间。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" cont…

Java 8新特性:方法引用的介绍与使用

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. 什么是方法引用&#xff1f; 2. 方法引用的…

【30天熟悉Go语言】9 Go函数全方位解析

作者&#xff1a;秃秃爱健身&#xff0c;多平台博客专家&#xff0c;某大厂后端开发&#xff0c;个人IP起于源码分析文章 &#x1f60b;。 源码系列专栏&#xff1a;Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列&#xff08;含&#xff1a;Ribbon、Feign&…

【好书精读】网络是怎样连接的 之 数据收发完成之后 从服务器断开并删除套接字

&#xff08; 该图由AI制作 &#xff09; 目录 数据收发完成后协议栈要执行的操作 数据发送完毕后断开连接 删除套接字 数据收发操作小结 第一步是创建套接字 然后 客户端会向服务器发起连接操作 数据收发阶段 执行断开操作 数据收发完成后协议栈要执行的操作 数据发…

html_css模拟端午赛龙舟运动

文章目录 ⭐前言&#x1f496; 样式布局&#x1f496; 添加龙舟&#x1f496; 添加css_animation运动 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本期给大家分享css实现赛龙舟运动。 &#x1f496; 样式布局 风格&#xff1a;卡通 首先采用一张包括水元素的照片…

液体泄露识别检测算法 监控识别管道液体泄漏

液体泄露识别检测算法通过 yolov8python网络模型技术&#xff0c;液体泄露识别检测算法对管道的液体泄露情况进行全天候不间断实时监测&#xff0c;检测到画面中管道设备液体泄露现象时&#xff0c;将自动发出警报提示相关人员及时采取措施。YOLOv8 算法的核心特性和改动可以归…

硬件入门之什么是二级管

硬件入门之什么是二级管 文章目录 硬件入门之什么是二级管一、二极管是什么&#xff1f;二极管在电路中的作用很广泛&#xff1a; 单向导电&#xff0c;续流&#xff0c;稳压等等 二、分类二极管实际应用场景二极管分类1.通用二极管2..肖特二极管 3.稳压二极管&#xff08;利用…

零基础学会python编程——输入 / 输出函数与变量

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 学习目标 一.输入与输出函数 1.print 函数 【例2-1】 【例2-2】 【例2-3】 …

深度详解Nginx正向代理与反向代理

正向代理和反向代理的概念 1、正向代理2、反面代理以租房为例解释正向代理和反向代理&#xff1f;正向代理和反向代理配置 1、正向代理 它的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器&#xff0c;这个代理服务器呢,他能访问那个…

一文弄懂git原理及相关操作

文章目录 前言Git 是什么&#xff1f;Git 与 SVN 的区别Git 快速入门Git 相关网站Git 工作流程Git 工作空间Git 文件状态 Git 安装在 Linux 上安装在 Mac 上安装在 Windows 上安装从源代码安装 Git 配置Git 常用命令git initgit clonegit addgit commitgit branchgit tag查看信…

字符设备驱动内部实现原理解析

字符设备驱动内部实现原理解析 一. 字符设备驱动对象内部实现原理解析二. 字符设备驱动的注册流程三. 代码示例 一. 字符设备驱动对象内部实现原理解析 用户层&#xff1a; ​ 当用户打开&#xff08;open&#xff09;一个文件时,会生成一个文件描述符表 内核层&#xff1a; 内…

极致呈现系列之:Echarts散点图的数据魔力

目录 什么是散点图散点图的特点及应用场景散点图的特点散点图的应用场景 Echarts中散点图的常用属性Vue3中创建散点图美化散点图样式 在数据分析和可视化过程中&#xff0c;散点图是一种常见且重要的工具。散点图可以帮助我们直观地观察两个变量之间的关系&#xff0c;并发现其…