当前位置: 首页 > news >正文

Spring Security 之 JWT介绍

相关文章:

  1. OAuth2的定义和运行流程
  2. Spring Security OAuth实现Gitee快捷登录
  3. Spring Security OAuth实现GitHub快捷登录
  4. Spring Security的过滤器链机制
  5. Spring Security OAuth Client配置加载源码分析
  6. Spring Security内置过滤器详解
  7. 为什么加载了两个OAuth2AuthorizationRequestRedirectFilter分析
  8. Spring Security 自定义授权服务器实践
  9. Spring Security 自定义资源服务器实践
  10. Spring Security 自定义用户信息端点与多种登录方式共存

什么是JWT

Json Web Token 简称JWT,是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含的协议格式,用于在通信双方传递JSON对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥来签名,防止被篡改。

官网: https://jwt.io
标准:https://tools.ietf.org/html/rfc7519

JWT令牌的优点:

  1. JWT基于JSON,非常方便解析
  2. 可以在令牌中自定义丰富的内容,易扩展
  3. 通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高
  4. 资源服务使用JWT可不依赖认证服务即可完成授权

缺点:

  1. JWT令牌较长,占存储空间比较大

JWT组成

在这里插入图片描述
这是一段JWT,一个JWT就是一个字符串,由三部分组成:头部、载荷、签名

头部(Header)

头部用于描述关于该JWT的最基本的信息,例如其类型(JWT)以及签名所用的算法(如HMAC SHA256或RSA)等,这也可以被表示成一个JSON对象。

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

typ:类型 alg:签名的算法
再对JSON字符串进行Base64编码,得如下字符串:

ewoiYWxnIjoiSFMyNTYiLAoidHlwIjoiSldUIgp9

负载(Payload)

第二部分是负载,用来存放有效信息,这些有效信息包含三个部分:

  1. 标准中注册的声明
    iss: jwt签发者
    sub:jwt所面向的用户
    aud:接收jwt的一方
    exp:jwt的过期时间,这个过期时间必须要大于签发时间
    nbf:定义在什么时间之前,该jwt都是不可用的
    iat:jwt的签发时间
    jti:jwt的唯一身份标识,主要用来作为一次性token,从而避免重放攻击
  2. 公共的声明
    公共的声明可以添加任何信息,一般添加用户相关信息或其他业务需要的必要信息,但不建议添加敏感信息,因为该部门在客户端可解密
  3. 私有声明
    私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对标解密的,意味着该部分信息可以归类为明文信息
    这个指的就是自定义的claim,比如:
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

sub 标准的声明,name自定义的声明(公共的或者私有的)

再base64后得到jwt的第二部分:

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

签名(signature)

JWT的第三部分是一个签证信息,这个签证信息由三部分组成:

  1. header(base64后)
  2. payload(base64后)
  3. secret(盐,保密)
    这部分将base64加密后的header、base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret,然后构成jwt的第三部分。
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

🚫 secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt签发和jwt验证,所以它就是你服务端的私钥,不能流露出去。

最终将这三部分用.连接成一个完整的字符串,构成最终的JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

相关文章:

  • 天天写SQL,这些神奇的特性你知道吗?
  • java计算机毕业设计跨境电商网站源码+系统+数据库+lw文档+mybatis+运行部署
  • 归并排序和计数排序
  • 统计学习算法实现(01)——决策数
  • Nignx服务器,项目部署和Yapi,Swagger工具
  • Elasticsearch 集群搭建
  • spring cloud 快速上手系列 -> 03-消息队列 Stream -> 035-发送消息
  • 【SpringBoot2】SSMP整合综合案例(上)
  • 【JavaScript】JS开发中五个常用功能/案例(41-45)(牛客题解)
  • Go 语言 设计模式-抽象工厂模式
  • 全网没有之一的API 文档:Swagger
  • dubbo环境搭建ZooKeeper注册中心
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • 欧拉函数算法的实现
  • Ubuntu 创建本地 Git 并与 Github(私有库) 交互(上传与下载)| 记录 | 踩坑
  • (三)从jvm层面了解线程的启动和停止
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • echarts花样作死的坑
  • Linux gpio口使用方法
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 闭包--闭包之tab栏切换(四)
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 利用DataURL技术在网页上显示图片
  • 前端设计模式
  • 使用parted解决大于2T的磁盘分区
  • 算法系列——算法入门之递归分而治之思想的实现
  • 消息队列系列二(IOT中消息队列的应用)
  • 一文看透浏览器架构
  • Semaphore
  • 如何在招聘中考核.NET架构师
  • ​第20课 在Android Native开发中加入新的C++类
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • ${factoryList }后面有空格不影响
  • (4)STL算法之比较
  • (C++20) consteval立即函数
  • (C语言)fread与fwrite详解
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (第二周)效能测试
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET单元测试
  • .NET多线程执行函数
  • .pyc文件是什么?
  • @Autowired和@Resource的区别
  • @FeignClient注解,fallback和fallbackFactory