| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> JWT入门 -> 正文阅读 |
|
[网络协议]JWT入门 |
1、什么是 JWT?
一句话:JWT 用于分布式系统的单点登录 SSO 场景,主要用来做 身份鉴别 或者 资源(接口)安全性的一种技术(机制)。 2、服务器的接口安全性问题1、Token 生成和获取的阶段:一般来说都在登录的时候,就生成 Token。 2、然后在未来的每一次请求需要进行安全校验的情况下,都需要携带 Token 到服务端进行比较。 3、传统的做法一般可以使用 Map 或者 Session 来完成,但是这个会消耗大量服务资源。 4、现在比较主流的最佳使用解决方案是:JWT。因为它是无状态并且不会消耗太多服务器资源的一种解决方案。 3、传统的 Session 认证我们知道,HTTP 协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据 HTTP 协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为 Cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于 Session 认证。 但是这种基于 Session 的认证使应用本身很难得到扩展,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于 Session 认证应用的问题就会暴露出来。 4、基于 Session 认证所显露的问题Session:每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言 Session 都是保存在内存中,而随着认证用户的增多,服务器的开销会明显增大。 扩展性:用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力,这也意味着限制了应用的扩展能力。 CSRF:因为是基于 Cookie 来进行用户识别的,Cookie 如果被截获,用户就会很容易受到跨站请求伪造的攻击。 5、基于 Token 的鉴权机制基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。 流程上是这样的:
这个 Token 必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持 6、JWT 长什么样?JWT 是由三段信息构成的,将这三段信息文本用
JWT 构成 第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature). header jwt的头部承载两部分信息:
完整的头部就像下面这样的 JSON:
然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.
playload 载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分。
标准中注册的声明 (建议但不强制使用) :
公共的声明 : 公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密. 私有的声明 : 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。 定义一个payload:
然后将其进行base64加密,得到Jwt的第二部分。(base64 是一种编码方式,是可以解码恢复到原来的样子的)
signature jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
这个部分需要base64加密后的header和base64加密后的payload使用
将这三部分用
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。 如何应用 一般是在请求头里加入
服务端会验证token,如果验证通过就会返回相应的资源。整个流程就是这样的: 7、使用 JWT新建一个 Spring Boot 工程。 7.1 引入依赖
7.2 生成 Token
7.3 进行验证
7.4 常见异常8、JWT 工具类
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 11:45:32- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |