JWT的是什么

session共享

什么是session共享

        Session共享是指在分布式系统中,在多个服务器之间共享同一个用户的会话数据。在传统的Web应用中,用户的会话信息通常存储在服务器端的Session中,而每个用户的请求在同一个服务器上处理,因此可以轻松地访问和管理会话信息。

为什么要使用session共享

        在分布式系统中,用户的请求可能会被不同的服务器处理,这就导致了会话信息无法简单地在不同服务器之间共享的问题

解决方案:

  1. Session复制

    • 当一个服务器上的会话发生变化时,这些变化会被复制到其他所有服务器上。
    • 这意味着每个服务器都有会话数据的完整副本。
    • 但这种方法可能会导致性能问题和数据同步问题。
  2. Session中心化存储

    • 将会话数据存储在中央数据库或缓存系统中,如JWT或Redis。
    • 当用户访问任何服务器时,该服务器都会从中央存储中检索会话数据。
    • 这种方法可以确保数据的一致性和可伸缩性。
  3. 使用Cookie

    • 将会话标识符存储在用户的浏览器中作为Cookie。
    • 当用户访问其他服务器时,他们会带上这个Cookie,服务器可以从这个标识符中检索会话数据。
    • 这种方法简单,但依赖于用户的浏览器和Cookie的安全性。
  4. 粘性会话

    • 使用负载均衡器确保一旦用户被分配到一个服务器,他们后续的所有请求都被路由到该服务器。
    • 这确保了会话数据只存在于一个服务器上,从而避免了共享的需求。
    • 但这种方法限制了服务器的可伸缩性。
  5. 分布式会话管理

    • 使用专门的会话管理系统或服务来管理会话数据。
    • 这些系统通常提供高可用性、可扩展性和安全性。

Session中心化存储(JWT)介绍

什么是JWT(JSON Web Token)

在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程:

  1. 客户端使用用户名和密码请求登录
  2. 服务端收到请求,验证用户名和密码
  3. 验证成功后,服务端会签发一个token,再把这个token返回给客户端
  4. 客户端收到token后可以把它存储起来,比如放到cookie中
  5. 客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
  6. 服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据

详细过程:

  • 前端发送登录请求:用户在前端页面输入用户名和密码后,前端将这些凭证发送到后端的登录接口。
  • 后端验证用户信息:后端接收到登录请求后,首先验证用户提供的用户名和密码是否正确。如果验证通过,后端生成一个Token,并将Token与用户信息关联起来。
  • 后端生成Token:后端使用一种安全的算法(如JWT)生成一个Token,Token中包含用户的身份信息和其他必要的信息。Token可以包含用户ID、角色、过期时间等。
  • 后端返回Token给前端:后端将生成的Token作为响应返回给前端。前端可以将Token保存在本地,通常使用浏览器的Cookie或本地存储(如localStorage)来保存Token。
  • 前端发送请求时携带Token:在后续的请求中,前端需要在请求的头部(通常是Authorization头)中携带Token。这可以通过在每个请求的头部中添加"Authorization: Bearer {Token}"来实现。
  • 后端验证Token:后端在接收到请求时,会从请求头部中获取Token,并进行验证。验证包括检查Token的有效性、过期时间以及用户的权限等。如果Token验证通过,后端会处理请求并返回相应的数据。
  • Token的刷新和注销:在一些情况下,Token可能会过期或需要刷新。前端可以通过发送刷新Token的请求来获取新的Token,并更新本地保存的Token。另外,用户也可以选择注销登录,前端可以清除本地保存的Token。

这种基于token的认证方式相比传统的session认证方式更节约服务器资源,并且对移动端和分布式更加友好。其优点如下:

  1. 支持跨域访问:cookie是无法跨域的,而token由于没有用到cookie(前提是将token放到请求头中),所以跨域后不会存在信息丢失问题
  2. 无状态:token机制在服务端不需要存储session信息,因为token自身包含了所有登录用户的信息,所以可以减轻服务端压力
  3. 更适用CDN:可以通过内容分发网络请求服务端的所有资料
  4. 更适用于移动端:当客户端是非浏览器平台时,cookie是不被支持的,此时采用token认证方式会简单很多
  5. 无需考虑CSRF:由于不再依赖cookie,所以采用token认证方式不会发生CSRF,所以也就无需考虑CSRF的防御

而JWT就是上述流程当中token的一种具体实现方式,其全称是JSON Web Token,

官网地址:JSON Web Tokens - jwt.io

        通俗地说,JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。JWT的认证流程如下:

  1.         首先,前端通过Web表单将自己的用户名和密码发送到后端的接口,这个过程一般是一个POST请求。建议的方式是通过SSL加密的传输(HTTPS),从而避免敏感信息被嗅探
  2. 后端核对用户名和密码成功后,将包含用户信息的数据作为JWT的Payload,将其与JWT Header分别进行Base64编码拼接后签名,形成一个JWT Token,形成的JWT Token就是一个如同lll.zzz.xxx的字符串
  3.         后端将JWT Token字符串作为登录成功的结果返回给前端。前端可以将返回的结果保存在浏览器中,退出登录时删除保存的JWT Token即可
  4.         前端在每次请求时将JWT Token放入HTTP请求头中的Authorization属性中(解决XSS和XSRF问题)
  5.         后端检查前端传过来的JWT Token,验证其有效性,比如检查签名是否正确、是否过期、token的接收方是否是自己等等
  6.         验证通过后,后端解析出JWT Token中包含的用户信息,进行其他逻辑操作(一般是根据用户信息得到权限等),返回结果

为什么要用JWT

传统Session认证的弊端

        我们知道HTTP本身是一种无状态的协议,这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,认证通过后HTTP协议不会记录下认证后的状态,那么下一次请求时,用户还要再一次进行认证,因为根据HTTP协议,我们并不知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在用户首次登录成功后,在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这是传统的基于session认证的过程

然而,传统的session认证有如下的问题:

  1. 每个用户的登录信息都会保存到服务器的session中,随着用户的增多,服务器开销会明显增大
  2. 由于session是存在与服务器的物理内存中,所以在分布式系统中,这种方式将会失效。虽然可以将session统一保存到Redis中,但是这样做无疑增加了系统的复杂性,对于不需要redis的应用也会白白多引入一个缓存中间件
  3. 对于非浏览器的客户端、手机移动端等不适用,因为session依赖于cookie,而移动端经常没有cookie
  4. 因为session认证本质基于cookie,所以如果cookie被截获,用户很容易收到跨站请求伪造攻击。并且如果浏览器禁用了cookie,这种方式也会失效
  5. 前后端分离系统中更加不适用,后端部署复杂,前端发送的请求往往经过多个中间件到达后端,cookie中关于session的信息会转发多次
  6. 由于基于Cookie,而cookie无法跨域,所以session的认证也无法跨域,对单点登录不适用

JWT认证的优势

对比传统的session认证方式,JWT的优势是:

  1. 简洁:JWT Token数据量小,传输速度也很快
  2. 因为JWT Token是以JSON加密形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持
  3. 不需要在服务端保存会话信息,也就是说不依赖于cookie和session,所以没有了传统session认证的弊端,特别适用于分布式微服务
  4. 单点登录友好:使用Session进行身份认证的话,由于cookie无法跨域,难以实现单点登录。但是,使用token进行认证的话, token可以被保存在客户端的任意位置的内存中,不一定是cookie,所以不依赖cookie,不会存在这些问题
  5. 适合移动端应用:使用Session进行身份认证的话,需要保存一份信息在服务器端,而且这种方式会依赖到Cookie(需要 Cookie 保存 SessionId),所以不适合移动端

JWT结构

JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串

JWTString=Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

1.Header
JWT头是一个描述JWT元数据的JSON对象,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);typ属性表示令牌的类型,JWT令牌统一写为JWT。最后,使用Base64 URL算法将上述JSON对象转换为字符串保存

{"alg": "HS256","typ": "JWT"
}


2.Payload
有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。 JWT指定七个默认字段供选择

iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT

这些预定义的字段并不要求强制使用。除以上默认字段外,我们还可以自定义私有字段,一般会把包含用户信息的数据放到payload中,如下例:

{"sub": "1234567890","name": "Helen","admin": true
}

请注意,默认情况下JWT是未加密的,因为只是采用base64算法,拿到JWT字符串后可以转换回原本的JSON数据,任何人都可以解读其内容,因此不要构建隐私信息字段,比如用户的密码一定不能保存到JWT中,以防止信息泄露。JWT只是适合在网络中传输一些非敏感的信息

3.Signature
签名哈希部分是对上面两部分数据签名,需要使用base64编码后的header和payload数据,通过指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用header中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名
H M A C S H A 256 ( b a s e 64 U r l E n c o d e ( h e a d e r ) + " . " + b a s e 64 U r l E n c o d e ( p a y l o a d ) , s e c r e t ) HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用.分隔,就构成整个JWT对象

注意JWT每部分的作用,在服务端接收到客户端发送过来的JWT token之后:

header和payload可以直接利用base64解码出原文,从header中获取哈希签名的算法,从payload中获取有效数据
signature由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改。服务端获取header中的加密算法之后,利用该算法加上secretKey对header、payload进行加密,比对加密后的数据和客户端发送过来的是否一致。注意secretKey只能保存在服务端,而且对于不同的加密算法其含义有所不同,一般对于MD5类型的摘要加密算法,secretKey实际上代表的是盐值

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

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

相关文章

prometheus从0编译/安装与运行(2.45.3版本举例)

安装 官方介绍:Getting started | Prometheus 下载二进制安装 wget https://github.com/prometheus/prometheus/releases/download/v2.45.3/prometheus-2.45.3.linux-amd64.tar.gz tar xvfz prometheu-*.tar.gz cd prometheus-* 代码编译安装 安装依赖包 #yum in…

【MySQL知识体系】第1章 初识 MySQL

文章目录 第1章 初识 MySQL1.1 MySQL 介绍1.1.1 什么是 MySQL?1.1.2 MySQL 的特点?1.1.3 MySQL 默认端口? 1.2 安装 MySQL1.2.1在MacOS上安装MySQL1.2.2 在Windows上安装MySQL 1.3 如何选择 MySQL 客户端1.3.1 在MacOS上安装Workbench1.3.2 在…

解读:DUSt3R: Geometric 3D Vision Made Easy

概述:给定一个无约束图像集,即一组具有未知相机姿态和内在特征的照片,我们提出的 DUSt3R 方法会输出一组相应的点阵图,从中我们可以直接恢复通常难以一次性估算的各种几何量,如相机参数、像素对应关系、深度图和完全一…

【微信】【Windows端】开启2024最新版微信内置浏览器Devtools调试窗口

▒ 目录 ▒ 🛫 导读需求开发环境 1️⃣ 预备知识浏览器框架进程关系 2️⃣ 逆向分析关键字xweb-enable-inspectx64dbg分析 3️⃣ 验证菜单按钮方式快捷键F12方式同时打开多个Devtools调试窗口 🛬 文章小结📖 参考资料 🛫 导读 需…

金现代产品方案部部长王宁,将出席“ISIG-低代码/零代码技术与应用发展峰会”

3月16日,第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导,企智未来科技(LowCode低码时代、RPA中国、AIGC开放社区)主办。大会旨在聚合每一位产业成员的力量,深入探索低…

每日OJ题_牛客HJ87 密码强度等级(IO型OJ)

目录 牛客HJ87 密码强度等级 解析代码 牛客HJ87 密码强度等级 密码强度等级_牛客题霸_牛客网 题目描述 密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。 一、密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二…

数字工厂管理系统如何帮助电子企业改善仓储难题

随着科技的飞速发展,电子企业面临着日益增长的仓储管理挑战。传统的仓储管理模式已经难以满足企业高效、准确、实时的管理需求,因此,数字工厂管理系统的引入成为解决这一难题的关键。数字工厂管理系统通过集成先进的信息技术,为电…

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理一、Unity中 屏蔽透明区域的点击事件1.1 使用Image组件自带的参数检测1.2 根据点击的坐标计算该点的像素值是否满足阈值 二、Unity中屏蔽 不规则图片按钮点击的事件 总结 🎬 博客主页:htt…

​谷歌seo外链服务哪家好?

首先你要知道的,就是外链能起到的作用,不是说工具查一查外链数有增加就可以的,外链最重要的作用就是提升关键词排名,发的外链没有效果是没有任何意义的,而且外链基本上是一次性服务,服务完了没有效果完全就…

day9 指针 函数封装

1:在主函数定义字符数组,在自定义函数中实现字符串比较 4 int my_strcmp(char *a,char *b);5 int main(int argc, const char *argv[])6 {7 //strcmp 函数比叫ascii码值大小8 char a[10]"hello";9 char b[10]"helloo";1…

NTFS安全权限

NTFS是新技术文件系统(New Technology File System)的缩写,是一种用于Windows操作系统的文件系统。NTFS提供了高级的功能和性能,包括文件和目录的权限控制、加密、压缩以及日志等。它被广泛应用于Windows NT、Windows 2000、Windo…

神州大地人类来源猜想

在公元前2000年以前,伟大的中华民族还是石器时代,我们有很多美好的神话和传说,三皇五帝就是这个时代伟大部落或者部落首领的故事。 关于人类的历史,从基因学上最新的研究成果大概是这样的,虽然从300万年前就诞生了人类…