计算机网络之Token、JWT

本文深入探讨了计算机网络中的Token和JWT(JSON Web Tokens)机制。JWT是一种用于安全身份验证的标准方法,它在客户端和服务端之间通过签名的Token进行通信,确保信息的安全。JWT由Header、Payload和Signature三部分组成,无需服务器存储会话信息,降低了服务器负载。文中详细介绍了JWT的工作流程、数据结构以及其在跨域认证中的应用。

计算机网络之Token、JWT

1.登录验证的方式

image-20220208163318937

2.token定义

image-20220208163353696

3.taken刷新

image-20220208163737302

4.JWT跨域认证

image-20220208164133113

5.JWT跨域认证起源

image-20220208164432045

6.JWT原理

image-20220208165043281

7.JWT的数据结构

7.1介绍

image-20220208165227624

image-20220208165245995

7.2Header

image-20220208165449022

7.3Playload

image-20220208165501584

7.4Signature

image-20220208165514715

7.5Base64URL

image-20220208165537280

8.JWT组成部分

一个JWT由三部分组成:
Header(头部) —— base64编码的Json字符串
Payload(载荷) —— base64编码的Json字符串
Signature(签名)—— 使用指定算法,通过Header和Payload加盐计算的字符串
各部分以" . "分割,如:
eyJhbGciOiJIUzUxMiJ9.eyJjcnQiOjE1MjgzNDM4OTgyNjgsImV4cCI6MTUyODM0MzkxOCwidXNlcm5hbWUiOiJ0b20ifQ.E-0jxKxLICWgcFEwNwQ4pfhdMzchcHmsd8G_BTsWgkUmVwPzDd7jJlf94cAdtbwTLMm27ouYYzTTxMXq7W1jvQ
直接通过base64解码可获得:
Header:
{“alg”:“HS512”}
Payload:
{“crt”:1528343898268,“exp”:1528343918,“username”:“tom”}

9.JWT使用方式

image-20220208165811376

10.JWT特点

image-20220208165844526

11.传统身份验证的方法

传统身份验证的方法
HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。
解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。
上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。

12.基于 Token 的身份验证方法

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
1.客户端使用用户名跟密码请求登录
2.服务端收到请求,去验证用户名与密码
3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

11.JWT介绍

实施 Token 验证的方法挺多的,还有一些标准方法,比如 JWT,读作:jot ,表示:JSON Web Tokens
在典型业务场景中,为了区分用户和安全保密,必须对API请求进行鉴权,
但是不能要求每一个请求都进行登录操作。合理做法是,在第一次登录之后产生一个有一定有效期的tokn,并将其存储于浏览器的Cookie或LocalStorage之中,之后的请求都携带该token,请求到达服务器端后,服务器端用该tokn对请求进行鉴权。在第一次登录之后,服务器会将这个token用文件、数据库或缓存服务器等方法存下来,用于之后请求中的比对。或者,更简单的方法是,直接用密钥对用户信息和时间戳进行签名对称加密,这样就可以省下额外的存储,也可以减少每一次请求时对数据库的查询压力。这种方式,在业界已经有一种标准的实现方式,该方式被称为JSON Web Token(JWT,音同jot,详见JWT RFC7519)。
token的意思是“令牌”,里面包含了用于认证的信息。这里的token是指JSON Web Token(UWT)。

12.JWT认证流程

1.客户端使用用户名和密码请求登录
2.服务端收到请求后会去验证用户名和密码,如果用户名和密码跟数据库记录不一致则验证失败,如果一致则验证通过,服务端会签发一个Token返回给客户端
3.客户端收到请求后会将Token缓存起来,比如放在浏览器Cookie中或者本地存储中,之后每次请求都会携带该Token
4.服务端收到请求后会验证请求中携带的Tokn,验证通过则进行业务逻辑处理并成功返回数据

在这里插入图片描述

13.JWT组成

在JWT中,Token有三部分组成,中间用.隔开,并使用Base64编码:
header
payload
signature
如下是JWT中的一个Token示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1MjgwMTY5MjIsImlkIjowLCJuYmYiOjE1MjgwMTY5MjIsInVzZXJuYW1lIjoiYWRtaW4ifQ.LjxrK9DuAwAzUD8-9v43NzWBN7HXsSLfebw92DKd1JQ

header介绍
JWT Token的header中,包含两部分信息:
1.Token的类型
2.Token所使用的加密算法
例如:
{
“typ”: “JWT”,
“alg”: “HS256”
}
该例说明Token类型是WT,加密算法是HS256(lg算法可以有多种)。
上面的内容要用 Base64 的形式编码一下,所以就变成这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload载荷介绍
Payload中携带Token的具体内容,里面有一些标准的字段,当然你也可以添加额外的字段,来表达更丰富的信息,可以用这些信息来做更丰富的处理,比如记录请求用户名,标准字段有:
1.iss:JWT Token的签发者
2.Sub:主题
3.exp:JWT Token过期时间
4.aud:接收WT Token的一方
5.iat:WT Token签发时间
6.nbf:JWT Token生效时间
7.jti:JWT Token ID
比如下面这个 Payload ,用到了 iss 发行人,还有 exp 过期时间。另外还有两个自定义的字段,一个是 name ,还有一个是 admin 。
{
“iss”: “ninghao.net”,
“exp”: “1438955445”,
“name”: “wanghao”,
“admin”: true
}
使用 Base64 编码以后就变成了这个样子:
eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ
header
payload
secret

Signature签名介绍
JWT 的最后一部分是 Signature ,Signature是Token的签名部分,这部分内容有三个部分,把用 Base64 编码的 header.payload与header再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端,加密后的内容即为Signature
注:一般通过配置文件来配置Secret的值,通常配置在conf/config.yaml配置文件中
var encodedString = base64UrlEncode(header) + “.” + base64UrlEncode(payload);
HMACSHA256(encodedString, ‘secret’);
处理完成以后看起来像这样:
SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

最后这个在服务端生成并且要发送给客户端的 Token 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
签名后服务端会返回生成的Token,客户端下次请求会携带该Token,服务端收到Token后会解析出header.payload,然后用相同的加密算法和密码对header.payload再进行一次加密,并对比加密后的Token和收到的Token是否相同,如果相同则验证通过,不相同则返回HTTP401 Unauthorized的错误。

14.Authorization

在这里插入图片描述
在这里插入图片描述

15.WWW-Authenticate

在这里插入图片描述
在这里插入图片描述

16.HTTP Bearer认证

http认证根据凭证协议的不同,划分为不同的方式。常用的方式有:
HTTP基本认证
HTTP摘要认证
HTTP Bearer认证
本篇文章介绍HTTP Bearer认证。
下面通过图详细的了解下HTTP Bearer认证过程:

在这里插入图片描述

Bearer认证也是http协议中的标准认证方式,在Bearer认证中的凭证称为Bearer_token 或者Access_token。该种方式的优点就是灵活方便,因为凭证的生成和验证完全由开发人员设计和实现。一般凭证的设计尽量能保证以下几点:
1.用户信息安全性,即保证重要信息不被泄露和恶意破解
2.避免重放攻击
3.更方便的适应更多的应用场景,主要体现在在服务端不需要凭证状态保存,分布式场景中,不需要状态共享
4.少查库,减少服务端负担。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoGo在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值