Cookie、Session、JWT 那些事

news2024/11/15 4:08:37

文章目录

  • 前言
  • 一、概念
    • 1、Cookie:
    • 2、Session:
    • 3、JWT
  • 二、应用
    • 1. 基本使用
    • 2. 实现 “退出” 功能
  • 总结


前言

目前 C/S 模式盛行,HTTP 是其中最常见的通信协议,我们知道 HTTP 协议是无状态的,但是这场景完全不够用。

比如,我们微信扫描登录一个网站后,肯定不希望频繁登录嘛,那我们的诉求就是希望在一段时间内,网站能够 “记忆” 我们的登录状态,而这个 “记忆” 的能力 HTTP 是没法完成的,所以需要我们额外做点什么 …

你想想,两端通信过程,状态信息要么存在客户端、要么存在服务端,简言之,现在的问题是,要如何存、存哪里的问题。

当然,这块技术已经很成熟了,我们只需要学会怎么去用就 OK 了。

而本文的主角:Cookie、Session、JWT 这些技术就是专门来解决这类问题的。


一、概念

1、Cookie:

前面我们提到,通信状态可以保存在客户端,这里的客户端一般指我们的浏览器,而浏览器就提供了 Cookie 这么一门技术,简单理解就是以 Key / Value 形式存储数据。

当我们向服务器发起请求的时候,就会在 HTTP 请求头上携带上 Cookie 信息,传递到服务端,由服务端进行处理。

什么是 Cookie?

Cookie 是一段不超过 4KB 的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。

安全性?

Cookie 有自身的一些限制,同时也存在一些安全性的问题,比如 不支持跨域、Cookie 容易被窃取 等,所以,你在使用的时候你需要注意!

2、Session:

会话。字如其名,好比你通过微信和朋友聊天,是不是要先进入对话窗口?这个对话窗口,就可以理解成一个简单的会话。

我俩聊天,前前后后说的这些话,一时半会都刻在双方脑子里,不是那种说完就忘了的,会话也是这个理,它有上下文、也是有记忆的、只不过这个记忆就需要客户端或者服务端来 “记” 下来。

既然是对话,肯定涉及两方,因此客户端、服务端一个都不能缺,是吧?

我们再看,通常我们的服务端是中心化的,可以承接千千万万的客户端连接,我们要如何管理这千千万万的连接呢?

在服务端来中心化的管理这些连接,我们也习惯称 会话管理,本质就是管理这些对话状态嘛。

具体怎么用呢?

用户 A 进行了登陆,服务端记录登录状态,并创建一次会话,服务端这边保存了用户的会话数据(用户id、姓名 …),并给这次会话分配全局唯一ID,也称为会话ID(sessionId)。

有效期内,在服务端我们可以通过这个 sessionId 直接定位到其对应的会话状态。

当然,还没完,客户端想要和服务端通信,手里总的拿点凭证吧?于是我们就把这个 sessionId 返回给客户端,客户端怎么存呢?

Cookie,你看,这就串联起来了!

用户登录后,服务端返回 sessionId,然后客户端将 sessionId 存到 Cookie 中,每次请求服务端时,从 Cookie 中取出 sessionId,并放置到请求头中,然后服务端直接从请求头中取出来用就可以了。

3、JWT

所有信息都放在服务端来存储,服务端的压力是不是有点大?能不能将这些压力分担到千千万万的客户端?

答案是可以的,这就是我们目前常用的 JWT 技术。

全称:JSON Web Token,是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

简单说,我们的信息通过特殊方式处理后,就能得到一串相对精简的字符串,也常叫 token,而我们也可以通过这个 token 反解析出具体的信息,这就是 JWT 的处理思路。

有了这种技术之后,在某些场景之下,我们就不需要在服务端中心化的存储这些 会话 状态了,因为这些会话数据都交给了客户端自己保管,每次请求时都会带上。

那服务端怎么验证这个会话呢?前面提到,我们可以直接从 token 解析出用户会话数据,一般就包括用户 id,昵称 等,基本上够用了。

诶,听起来很完美?

别急,凡是有利有弊,服务端不再中心化的记录这些会话状态,最大的问题就是没法管理会话。比如,你想要实现 “退出” 功能,就没法做到了,至于怎么做,我们后面分析。

JWT:

JWT 分为三段,包括头部、有效负载和签名,它们使用 Base64 进行编码后得到一串字符串,也称为 token,我们看个例子:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjdXJyZW50LXVzZXIiOiIwOjI4Ouafj-ayuTEyMyIsIngtb3JpZ2luLXN5c3RlbSI6InBpY2h1IiwiZXhwIjoxNjc3NDM4MDAwfQ.-wtyD7woxpgE9fFXjdcUV_mryuwmXvcFGSZuB4dNdZc
  • 头部:声明了编码对象的类型和密码签名的算法。

  • 有效负载:其中包含与令牌有关声明的详细信息。

  • 签名:防止信息被篡改。签名的格式可以是使用共享密钥的对称算法(HS256)或使用公钥和私钥的不对称算法(RS256)。

对于JWT,最好的选择是非对称选项,因为对于需要认证 JWT 的服务而言,它仅需要密钥的公共部分。

我们在线解密看看:

在这里插入图片描述

由于这里使用 Base64 进行编码,并没有进行不可逆的加密,直接进行解码就能得到明文,所以,要避免存放重要信息,防止泄漏。当然,你也可以将重要的信息加密后存放。

JWT 的优点:

在于支持跨语言,JSON 格式提供了语言无关性;同时,Token 占用字节小,便于传输。

JWT 的缺点:

Token 的注销方式。由于 Token 不存储在服务端,当用户注销时,Token 的有效时间可能还没有到,所以如何在用户注销的同时让 Token 失效是实现上的难点。

二、应用

鉴于目前 JWT 的流行,以及在工作中使用的较多,我们就以 JWT 来看看实战效果。

1. 基本使用

当用户登录时,根据用户信息使用 JWT 生成一个 token,然后返回给前端,前端每次向服务端发起请求的时候都带上 token。

服务端接收到请求后,一般是网关来验证 token 的合法性(一般就是简单的反解析)、并从 token 中获取到用户的信息进行使用。

生成 token:

val token = JWT.create()
        .withExpiresAt(Date(System.currentTimeMillis() + expire))
        .withClaim(CURRENT_USER, "${user.id}:$name")
        .sign(Algorithm.HMAC256(properties.jwtSecret))

你可以看到,我们这里定义了 token 过期时间、必要的用户信息、以及选择的签名算法。

解析 token:


   ...

  try {

   ...

   final List<String> authorization = request.getHeaders().get("authorization");
   final DecodedJWT jwt = JWT.require(algorithm).build().verify(authorization.get(0));
   String user = jwt.getClaim(CURRENT_USER).asString();
   String userId = user.split(":")[0];

  } catch (JWTDecodeException | SignatureVerificationException te) {
      throw new JWTException(401, null, "会话已过期");
  }  catch (TokenExpiredException e) {
      // 过期token不做处理,由下游拦截
      log.warn("[Token Filter] 失效token [{}]", authorization);
  }

   ...

从请求头里取出存放 token 的 authorization 字段,再使用 JWT 进行反编码即可,当 token 无效或者过期会直接抛出异常,我们用 try … catch … 捕获之后按需处理即可。

其实,就这两个简单的步骤,我们就完成了使用 JWT 实现基本的会话状态保存了能力。

2. 实现 “退出” 功能

前面说过,由于 JWT 是非中心化的管理方式,是没法直接做到这个功能的,不过我们可以找点 “野路子”。

分场景来看:

1)一般的后台系统:

如果选择退出登录时,可以让前端直接清理掉浏览器的缓存,这样再去请求接口时,由于请求头没有携带 token,后端会直接返回重定向到登录页面,然后引导用户登录就行了。

那以前的 token 是不是也可以直接用?

是的,所以后端还是要做好 token 有效期的控制,比如 一天、甚至直接让它凌晨某个时间点统一过期点,第二天在强制进行登录即可。

可以看到,这种场景下,我们直接使用 JWT 就可以完成了。

2)C 端:

对 C 端用户这块一般要求就要高点了,这个时候在服务端中心化的维护会话状态就非常有必要了。

我们可以在服务端生成 token 后,顺便在 redis 记录一下 token 的过期时间,然后每次请求时,验证下过期时间。

这种方式和传统的 session 方式很类似?

每次,处理流程上都差不多,但还是有优点:我们这里只记录了 token 过期时间,并没有记录更多的用户信息,所以,相对来说占用的存储空间更小。

在哪里验证 token 有效期?

还是在网关,这是所有请求的入口,方便全局控制。

Cookie 和 Token 有点像?

本质都是 K/V 存储关键信息,token 需要存到浏览器的 localStorage 中,而 Cookie 由浏览器存储到小文本中。

Cookie 是不允许跨域访问的,token 则不存在这个问题。

总结

直接选择 Cookie + Session 这套方案?

可以的,也是非常盛行、经得起时间考验的方案。

选用 JWT?

当然也没问题,优点更突出,目前主流方案。

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

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

相关文章

让物流园区可视可控,顺丰供应链与亚马逊云科技的供应链新解法

导读&#xff1a;物流园区如何破解供应链断点&#xff1f;在物流园区附近&#xff0c;我们经常看到周边道路停满了集装箱卡车。这是物流园区的一个典型痛点&#xff0c;由于园区内部业务情况的不可见性&#xff0c;司机们往往到了园区才被告知业务繁忙&#xff0c;需要长时间排…

字符串反转-课后程序(JAVA基础案例教程-黑马程序员编著-第九章-课后作业)

【案例9-2】 字符串反转 【案例介绍】 1.案例描述 在使用软件或浏览网页时&#xff0c;总会查询一些数据&#xff0c;查询数据的过程其实就是客户端与服务器交互的过程。用户&#xff08;客户端&#xff09;将查询信息发送给服务器&#xff0c;服务器接收到查询消息后进行处…

中国版ChatGPT高潮即将到来,解密ChatGPT底层网络架构

2022年11月30日人工智能研究实验室OpenAI发布全新聊天机器人ChatGPT&#xff0c;在中国用户无法访问的前提下&#xff0c;上线仅两个月月活用户就突破了1亿。ChatGPT如同重磅炸弹&#xff0c;一时间火遍全球。面对这一万亿级市场机遇&#xff0c;在国内&#xff0c;无论是资本方…

2.28性能测试概念

一.自动化测试的亮点1)使用注解:避免生成过多对象,造成资源和时间的浪费2)通过static修饰静态变量,全局只创建了一次驱动对象,在测试前再卸载驱动.避免重复创建驱动对象造成时间和资源的浪费3)通过使用参数化,保持用例的简洁,提高了代码的可读性.4)使用测试套件:一次性执行所有…

2022年AI顶级论文 —生成模型之年(下)

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 过去十年来&#xff0c;人工智能技术在持续提高和飞速发展&#xff0c;并不断冲击着人类的认知。 2012年&#xff0c;在ImageNet图像识别挑战赛中&#xff0c;一种神经网络模型&#xff08;AlexNet&am…

流媒体付服务器 ZLMediaKit 学习记录

1.官方github&#xff1a;ZLMediaKit 依赖于 media-server 库 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init 之后 cd ZLMediaKit mkdir build…

嵌入式软件自动化测试的趋势

现在软件市场越来越推崇敏捷开发和持续交付&#xff0c;要在这样的环境下取得竞争优势&#xff0c;各个企业必须得开发出稳健的应用程序&#xff0c;为用户提供无可比拟的直观体验。而且,这些应用程序还要能够达到组织机构的业务目标。 自动化测试的重要意义 在这个竞争日益激…

和钟南山院士合影,被人民日报缅怀,吴孟达骨灰葬在马来西亚成谜

不知不觉当中&#xff0c;香港著名演员吴孟达&#xff0c;已经离开人世间两年了&#xff0c;可是关于他的话题却依然没有停息。在影迷的记忆里&#xff0c;吴孟达是星爷的黄金搭档&#xff0c;两个人曾经一起携手&#xff0c;拍摄出来很多部优秀的影视剧。 时光荏苒&#xff0c…

Revit中复合墙图层的规则和CAD识别翻模墙

一、Revit中用于指定复合墙图层的规则&#xff0c;具体内容? 在编辑复合墙的结构时&#xff0c;请使用“指定图层”工具将“编辑部件”对话框中的行指定给图层或预览窗格中的区域&#xff0c;并遵循这些原则。 在预览窗格中&#xff0c;样本墙的各个行必须保持从左到右的顺序显…

面试了1个自动化测试,开口40W年薪,只能说痴人做梦...

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是3年工作经验&#xff0c;但面试…

Docker前端工程npm平滑过渡到pnpm v7的姿势

前言 pnpm挺多优点的&#xff0c;比如安装依赖速度很快&#xff0c;命令行也可以少打几个字符&#xff1b; 标题为啥说平滑&#xff0c;就是尽可能的少破坏性的迁移【针对现有的工程的改造】&#xff0c; 但是又能受用到pnpm的部分特性&#xff0c;使其效益符合我们的期望即可…

RK3588平台开发系列讲解(系统篇)init.d介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、Linux启动简介二、sysvinit配置三、inid.d介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇介绍init.d相关知识。 一、Linux启动简介 Linux用户空间启动时,第一个会启动init进程,用来引导启动其…

0101基础-认证授权-springsecurity

文章目录1 基础概念1.1 认证1.2 会话1.3 jwt1.4 授权2 授权的数据模型3 RBAC3.1 基于角色的访问控制3.2 基于资源的访问控制4 名词解析4.1 SSO4.2 CAS4.3 联合登陆4.4 多端登录&#xff1a;同一账号不同终端登录4.5 OAuth1 基础概念 1.1 认证 认证是为了保护系统的隐私数据和…

【高数】不定积分之有理函数的积分

文章目录前言有理函数积分的通用解法有理函数的特殊解法前言 这个专栏开始更新高等数学的解题方法&#xff0c;本专栏没有特别强调概念&#xff0c;主要是让大家熟悉考研中的一些题型以及如何求解 关键步骤用蓝色高亮提示 总结方法用红色高亮提示 注意事项用绿色高亮提示 希望…

【数据库】数据库基本概念和类型

一、数据库基本概念 1、数据 所谓数据&#xff08;Data&#xff09;是指对客观事物进行描述并可以鉴别的符号&#xff0c;这些符号是可识别的、抽象的。它不仅仅指狭义上的数字&#xff0c;而是有多种表现形式&#xff1a;字母、文字、文本、图形、音频、视频等。现在…

MAML算法详解(元学习)

文章目录回顾元学习MAML算法MAML和预训练模型的区别数学推导MAML实施细节总结回顾元学习 元学习的基本知识参考这篇博客元学习和机器学习的对比 MAML算法 学习初始化参数&#xff0c;所有任务的初始化的参数都是一样的 MAML和预训练模型的区别 MAML使用的是ϕ\phiϕ…

计算机网络笔记、面试八股(五)—— 浏览器输入URL

本章目录5. 从输入URL到浏览器显示页面过程中都发生了什么5.1 URL输入5.2 DNS解析5.2.1 域名的等级5.2.2 DNS解析的流程5.2.3 DNS查询方式5.3 建立TCP连接5.4 发送HTTP/HTTPS请求5.5 服务器处理请求并返回HTTP响应5.6 浏览器解析渲染页面5.7 HTTP请求结束&#xff0c;断开TCP连…

【C语言】“qsort函数详解”与“使用冒泡思想模拟使用qsort”

✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦&#xff01;&#xff01;✨✨✨✨ 文章目录✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦&#xff01;&#xff01;✨✨✨✨qsort的介绍&#xff1a;一、qsort函数的使用✨比较int类型数据比较字符型数据比较结构体数据冒泡思想…

2023湖北土建施工员证报考条件考试时间及报考流程 启程别

2023湖北土建施工员证报考条件考试时间及报考流程 启程别 土建施工员证是建设厅七大员中的施工员证的一种。分为土建、装饰装修、市政、设备安装。土建施工员证怎么报考等一系列相关问题启程别告诉你 施工员证报考条件 其实施工员证的报考条件没有那么复杂&#xff0c;基本上年…

一起学习 学习二叉树

前言 树是数据结构中的重中之重&#xff0c;尤其以各类 二叉树为学习的难点。一直以来&#xff0c;对于树的掌握都是模棱两可的状态&#xff0c;现在希望通过写一个关于二叉树的专题系列。在学习与总结的同时更加深入的了解掌握二叉树。本系列文章将着重介绍一般二叉树、完全二…