jwt 认证-程序员宅基地

技术标签: python  java  网络  jwt  数据库  

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。

1. 基于token的认证

当用户成功登录系统并成功验证有效之后,服务器会利用某种机制产生一个token字符串,这个token中可以包含很多信息,例如来源IP,过期时间,用户信息等, 把这个字符串下发给客户端,客户端在之后的每次请求中都携带着这个token,携带方式其实很自由,无论是cookie方式还是其他方式都可以。当服务端收到请求,取出token进行验证(可以验证来源ip,过期时间等信息),如果合法则允许进行操作。

基于token的验证方式它有什么优点吗?

  1. 支持跨域访问,Cookie是不允许跨域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输.

  2. 无状态:Token机制在服务端不需要存储session信息,因为Token自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息.

  3. 解耦 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你的API被调用的时候,你可以进行Token生成调用即可.

  4. 适用性更广:只要是支持http协议的客户端,就可以使用token认证。

  5. 服务端只需要验证token的安全,不必再去获取登录用户信息,因为用户的登录信息已经在token信息中。

  6. 基于标准化:你的API可以采用标准化的 JSON Web Token (JWT).

那基于token的认证方式有哪些缺点呢?

  1. 网络传输的数据量增大:由于token中存储了大量的用户和安全相关的信息,所以比单纯的cookie信息(例如session_id)要大很多,传输过程中需要消耗更多流量,占用更多带宽,

  2. 和所有的客户端认证方式一样,如果想要在服务端控制token的注销有难度,而且也很难解决客户端的劫持问题。

  3. 由于token信息在服务端增加了一次验证数据完整性的操作,所以比session的认证方式增加了cpu的开销。

但是整体来看,基于token的认证方式还是比session和cookie方式要有很大优势。在所知的token认证中,jwt是一种优秀的解决方案。

2. jwt认证

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

一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。中间用点(.)分隔成三个部分。注意JWT 内部是没有换行的。

1fb43bf8db4110a77a564fe3cca10128.png

2.1 头部

header典型的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)。

1
2
3
4
{
  "alg": "HS256",
  "typ": "JWT"
}

2.2 Payload

Payload 部分也是一个JSON对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。

1
2
3
4
5
6
7
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

除了以上字段之外,你完全可以添加自己想要的任何字段,这里还是提醒一下,由于jwt的标准,信息是不加密的,所以一些敏感信息最好不要添加到json里面

1
2
3
4
{
    "Name":"菜菜",
    "Age":18
}

2.3 Signature

为了得到签名部分,你必须有编码过的header、编码过的payload、一个秘钥(这个秘钥只有服务端知道),签名算法是header中指定的那个,然后对它们签名即可。

1
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用”点”(.)分隔,就可以返回给用户。需要提醒一下:base64是一种编码方式,并非加密方式。

3. jwt使用

3.1 流程

  1. 客户端携带用户的登录凭证(一般为用户名密码)提交请求

  2. 服务端收到登录请求,验证凭证正确性,如果正确则按照协议规定生成token信息,经过签名并返回给客户端

  3. 客户端收到token信息,可以保存在cookie或者其他地方,以后每次请求的时候都携带上token信息

  4. 业务服务器收到请求,验证token的正确性,如果正确则进行下一步操作

98251ae3bbc6a0095443ab897e2b6a40.png

3.2 交互

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。

1
2
3
4
5
6
7
Authorization: Bearer <token>

fetch('api/user/1', {
  headers: {
    'Authorization': 'Bearer ' + token
  }
})

3.3 特点

(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。
(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

3.4 问题

  1. 用户登出,如何设置token无效?

  • 用户登出,浏览器端丢弃token

  • 使用redis数据库,用户登出,从redis中删除对应的token,请求访问时,需要从redis库中取出对应的token,若没有,则表明已经登出

两个不同的设备,一个设备登出,另外一个设备如何处理?

  • 服务器维护一个清单(记录该账号是否已经签发token),这样又回到session的老路了

  • 每一个设备与用户生成唯一的key,保存在redis中,即设备1的用户登出,只删除对应的token,设备2的token仍然存在

  • 服务器端维护一个版本号,相同用户不同设备登入,版本号加1,这样保持key的唯一性(和上面差不多)

source: //www.liuvv.com/p/722ed7e7.html

记得点「」和「在看」↓

爱你们

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huangjinjin520/article/details/124161870

智能推荐

Yolov1 + Yolov2 + Yolov3 发展史、论文、代码最全资源分享合集 ! ! !_yolov用什么语言-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏36次。点击上方“码农的后花园”,选择“星标”公众号 精选文章,第一时间送达YOLO之父Jeseph Redmon毕业于美国米德尔伯里学院计算机科学专业,辅修数学,他主要研究范围是..._yolov用什么语言

离散 Hopfield 神经网络的分类与matlab实现_离散hopfield神经网络 科研能力分类 例子 matlab-程序员宅基地

文章浏览阅读738次。科研能力是高校的核心能力,其高低已成为衡量一所高校综合实力的重要指标。科研能力的高低不仅影响高校自身的发展,对高校所在地区的经济发展也有很大的影响。如何准确评价高校的科研能力已成为摆在政府、企业和高校面前的一个十分重要的问题。影响科研能力的因素众多,且互相交叉,互相渗透和互相影响,无法用确定的数学模型进行描述。目前,高校科研能力评价的方法很多,但普遍存在工作繁琐、时间滞后等缺点,且人为主观因素对评价结果有很大的影响。如何快速,准确地对众多高校的科研能力进行客观、公正地评价?这是一个目前亟待解决的问题。_离散hopfield神经网络 科研能力分类 例子 matlab

VUE移动到指定位置(scrollIntoView)----亲测避坑_scrollintoview的坑-程序员宅基地

文章浏览阅读1.6w次,点赞6次,收藏20次。用(scrollIntoView)来实现移动到指定位置建议不要放在(mt-loadmore)里使用,不然头部会被挤上去----亲测html<div id="pronbit" ref="pronbit">需要移动到的位置</div>js//选中iddocument.getElementById(e).scrollIntoView({ behavior: "sm..._scrollintoview的坑

SyntaxErrorException系列日记一:FUNCTION xxxxxx.xxxxxx does not exist_function test.collection_set does not exist-程序员宅基地

文章浏览阅读4.2k次。错误记录:FUNCTION mytest.CONCATE does not exist 如下:CONCATE是错误的一般应该检查函数是否拼写错误SELECT city_id ,city_name,airport_name,city_code,city_pinyin,city_abbreviation FROM city_airport WHERE 1=1 AND city_function test.collection_set does not exist

设计模式精讲:单例模式-程序员宅基地

文章浏览阅读75次。一个类的静态内部类,在外面的类被加载的时候,它里面的静态的类是不会被加载的,只有当我们调用getInstance方法的时候才会被加载。实际上要加载一个类我们也可以这么来写:Class.forName("类的名字"),只把class放到内存里而不进行实例化,如果我们用这种方式把Mgr01加到内存之后,这个static的INSTANCE是实例化的,因为他是一个静态变量,load到内存就会初始化。这两种方法的缺点就是,实例在类加载时就被创建了,如果应用程序不需要使用该实例,那么就会浪费一定的内存空间。

“OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常和OSGeo.OGR.Ogr”的类型初始值设定项引发异常-程序员宅基地

文章浏览阅读3.3k次。出现这个的原因大概是:1、32位和64位用错,32位程序用的64位的dll,64位程序使用32位的dll。2、缺少依赖库。3、环境变量配置错误。缺少依赖库首先找到缺少哪些关联库,也可以直接把bin目录下的所有dll拷贝过去查询gdal***.dll的关联动态库:1、找到vs的命令提示符,如图2、输入:dumpbin /dependents c:\…\…\…\gdal***.dll即可看到该dll所关联的dll3、将gadl中能查到的属于上图中关联的dll,和gda_osgeo.gdal.gdalpinvoke”的类型初始值设定项引发异常

随便推点

SPSS实现单因素方差分析_单因素方差分析的数据格式是怎样的-程序员宅基地

文章浏览阅读4k次,点赞7次,收藏44次。总目录:SPSS学习整理SPSS实现单因素方差分析目的适用情景数据处理SPSS操作SPSS输出结果分析知识点目的检验单因素水平下的一个或多个独立因变量均值是否存在显著性差异,即检验单因素各个水平的均值是否来自同一个总体。(因变量为连续变量)适用情景方差分析前提:各个总体服从正态分布各个总体方差相等观测值独立数据处理SPSS操作SPSS输出结果分析基本信息基于平均值显著性为0.729,大于0.05,认为各组总体方差相等F=8.744,显著性为0.007,小于0._单因素方差分析的数据格式是怎样的

window xp IIS 安装遇到的错误并安装不成功_win xp 0x1009956b-程序员宅基地

文章浏览阅读667次。IIS安装时,安装程序无法复制一个或多个文件。特定错误码是0x4b8 故障现象安装IIS的时候一直提示如下错误,IIS无法正常安装。提示:安装程序无法复制一个或多个文件。特定错误码是 0x4b8。按“确定”以继续;或者按“取消”,停止安装并且再试一次。如果继续,组件可能无法正常运行。解决方案(1) 开始 > 运行 > 输入 CMD >再输入以下命令:esentutl /p %windir_win xp 0x1009956b

华为matebooke不能下python_华为MateBookE2019体验 到底怎么样-程序员宅基地

文章浏览阅读2.2k次。描述在上周的MateBook 13 i3版评测中有很多人问,这个是不是MateBook E 2019?我寻思着,看来 3999元的价格很深入人心嘛?大家都惦记着华为这个最便宜的骁龙笔记本。刚好 MateBook E 2019 就在我旁边,那就跟大家好好聊聊这个东西。颜值很华为一般来说,我们称既能当平板也能作为笔记本使用的产品为「二合一设备」,MateBook E 2019 包括平板和键盘保护盖两个..._matebook e 2019运行webots

Python扫雷游戏:安装PyQt5,Python3.x以上-程序员宅基地

文章浏览阅读117次。#coding: utf-8__note__ = """* 扫雷小游戏* 需要python3.x以上* 需要安装PyQt5* pip install PyQt5"""import systry:import PyQt5except ImportError:import tkinterfrom tkinter import messageboxerr_str = "请安装PyQt5后再打开: pip..._"def sl_initial(x_box,y_box): a=x_box*y_box hwnd = findwindow(none, \"扫雷\") #"

2024三掌柜赠书活动第五期:从零基础到精通Flutter开发_mk甄选-2024年flutter零基础极速入门到进阶实战[同步更新中]-程序员宅基地

文章浏览阅读1.1w次,点赞30次,收藏34次。Flutter开发领域有许许多多深奥的知识,笔者在写作过程中尽力涉及Flutter的各个方面,但是由于时间仓促,书中难免会存在一些疏漏和不足之处(鉴于本书的示例代码都是按照Flutter官方的组件库来介绍的,且Flutter的官方版本更新非常频繁,所以书中难免会有一些较早的使用方法等),敬请读者批评指正。一套代码,构建多平台精美的应用,本书从真实的开发场景出发,完整地讲解了Flutter框架,帮助你快速掌握Flutter的基础知识和开发技巧,助你在移动应用开发领域取得成功!_mk甄选-2024年flutter零基础极速入门到进阶实战[同步更新中]

YOLOv4安装和训练-程序员宅基地

文章浏览阅读7.5k次,点赞6次,收藏34次。环境Windows:10YOLOv4OpenCV:4.5.3Visual Studio 2019:16.11CUDA:11.2.0_460.89_win10cudnn:11.2-windows-x64-v8.1.1.33硬件NVIDIA GeForce RTX 3070 TiOpenCV 4.5.3网址:https://sourceforge.net/projects/opencvlibrary/files/4.5.3/OpenCV 4.5.3下载链接:https://nchc._yolov4安装和训练

推荐文章

热门文章

相关标签