关于JSON Web Token (JWT)——目前最流行的跨域身份验证解决方案

目录

session

cookie和session的共同点

cookie和session区别

JWT

1 概述:和session、cookie有什么钱区别?哪里更好?

2 结构

3 使用

 4 JWT和整合


示意图:

 



1.什么是cookie
Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

2.为什么要用cookie
由于http协议是一种无状态的协议(客户端和服务端互相不认识)

Cookies是一些存储在用户电脑上的小文件。它是被设计用来保存一些站点的用户数据,这样能够让服务器为这样的用户定制内容。页面代码能够获取到Cookie值然后发送给服务器,比如Cookie中存储了所在地理位置,以后每次进入地图就可以默认定位到改地点。

3.cookie的原理
cookie的执行原理:就是当客户端访问服务器的时候(服务器运用了cookie),服务器会生成一份cookie传输给客户端,客户端会自动把cookie保存起来,以后客户端每次访问服务器,都会自动的携带着这份cookie。

简单来说,就是当客户端访问服务器时,服务器会生成一个票据给客户端,当客户端收到票据的之后就保存起来,以后再访问服务器就会自动带着票据。

简易cookie原理示意图  如下图所示:

 

4.cookie的特点:

  • 保存到客户端,容易被篡改(删除、禁用)

  • 保存的数据量有限的

  • 简单易懂好用

5.cookie的缺点:

  1. 保存在客户端,容易被篡改。
  2. 大小受限,本身最大4kb

session


1.什么是session
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了session是一种特殊的cookie。cookie是保存在客户端的,而session是保存在服务端。

2.为什么要用session
由于cookie 是存在用户端,而且它本身存储的尺寸大小也有限,最关键是用户可以是可见的,并可以随意的修改,很不安全。那如何又要安全,又可以方便的全局读取信息呢?于是,这个时候,一种新的存储会话机制:session 诞生了

3.session原理
当客户端第一次请求服务器的时候,服务器生成一份session保存在服务端,将该数据(session)的id以cookie的形式传递给客户端;以后的每次请求,浏览器都会自动的携带cookie来访问服务器(session数据id)。

  • 简易cookie原理示意图  如下图所示:

cookie和session的共同点


cookie和session都是用来跟踪浏览器用户身份的会话方式。

cookie和session区别


cookie是保存在客户端的

cookie有大小限制

session是保存在服务器端

session更加安全

session会比较占用服务器性能,当访问增多时应用cookie
 

JWT

官网: https://jwt.io/

 

1 概述:和session、cookie有什么钱区别?哪里更好?

传统的 Web 应用中,使用 session 来存在用户的信息,每次用户认证通过以后,服务器需要创建一条记录
保存用户信息,通常是在内存中 , 但:
1. 随着认证通过的用户越来越多,服务器的在这里的开销就会越来越大
2. 由于 Session 是在内存中的,这就带来一些扩展性的问题
3. 当我们想要扩展我们的应用,让我们的数据被多个移动设备使用时,我们必须考虑跨资源共享问
4. 需要客户端(浏览器)中使用 cookie 存储 session ID 值,但是移动端设备没有 cookie

 

JSON Web Token (JWT) ,是一个开放标准 (RFC 7519) ,它定义了一种紧凑的、自包含的方式,用于作为 JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
1. JWT存放在客户端(前端),每次请求的请求头中,携带此JWT发送给服务器,服务器端负责接
收和验证
2. 服务器端可以不用存储JWT,这样可以降低服务器的内存的开销
3. JWT和语言无关,扩展起来非常方便,无论是PC端还是移动端,都可以很容易的使用
4. 不受cookie的限制

 sessionJWT的主要区别就是保存的位置,session是保存在服务端的,而JWT是保存在客户端的

2 结构

JWT 本身就是一个固定格式的字符串

  • Header,头部
  • Payload,载荷
  • Signature,签名
注意,把这三部分使用点(.)连接起来,就是一个 JWT 字符串

 

1. 头部
header 一般的由两部分组成: token 的类型(“JWT”)和算法名称(比如: HMAC SHA256 或者 RSA 等)。
{ "typ" : "JWT" , "alg" : "HS256" }
2. 载荷
payload 主要用来包含声明( claims ),这个声明一般是关于实体 ( 通常是用户 ) 和其他数据的声明。用户 可以自定义数据用来存放在token key-value 值。
头部 载荷 分别进行 Base64 编码之后得到两个字符串,然后再将这两个编码后的字符串用英文句号 . 连接在一起(头部在前),形成新的字符串:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImphY2siLCJ1c2VyIjoiMjAyMjAx
MDEiLCJyb2xlIjoiYWRtaW4ifQ.EsLwe5Nf4YkuwcLLqz7JC - PyfeviMPFLLxNsCp77KIM
3. 签名
最后,将上面拼接完的字符串用 HS256 算法进行加密,在加密的时候,还需要提供一个密钥(
secret )。
加密后的内容也是一个字符串,这个字符串就是 签名
把这个签名拼接在刚才的字符串后面就能得到完整的 JWT 字符串。
header 部分和 payload 部分如果被篡改,由于篡改者不知道密钥是什么,也无法生成新的 signature 部分, 服务端也就无法通过。
JWT 中,消息体是透明的,使用签名可以保证消息不被篡改。
例如,使用 HMACSHA256 加密算法,配合秘钥,将前俩部进行加密,生成 签名 如下:

 在代码中,我们使用JWT封装的工具类,也可以完成此操作

3 使用

springboot 中可以很容易的使用 JWT ,只需要引入相关依赖,封装一个 JWT 的工具类,并且编写
Controller 的拦截器,对指定路径进行拦截验证 token 即可。
1. 添加依赖信息

 2. 编写JwtUtil.java工具类

 

 

 3. 编写测试代码

 

 4 JWTswagger整合

注意: 1. 修改代码 createRestApi() 方法中扫描的包的位置

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

登登登__

期待每一份真诚

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

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

打赏作者

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

抵扣说明:

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

余额充值