一分钟带你了解JWT认证!

摘要:
JWT认证基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或会话信息。这也就意味着JWT认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。签名的作用是保证JWT没有被篡改过。到此JWT的基础和认证原理已经讲完了,下一篇文章将介绍下SpringBoot中整合JWT,敬请期待哦。
目录

一、JWT简介

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

更多信息可以查看官网:https://jwt.io/introduction/

二、JWT认证和session认证的区别

  1. session认证

http协议是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发送的请求,所以为了让我们的应用能识别是哪个用户发出的,我们只能在服务器存储一份用户登陆的信息,这份登陆信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用个就能识别请求来自哪个用户了,这就是传统的基于sessino认证。

  1. JWT认证

基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或会话信息。这也就意味着JWT认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

三、JWT认证流程

一分钟带你了解JWT认证!第1张

认证流程如下:

  1. 用户使用账号和密码发出post请求;
  2. 服务器使用私钥创建一个jwt;
  3. 服务器返回这个jwt给浏览器;
  4. 浏览器将该jwt串在请求头中像服务器发送请求;
  5. 服务器验证该jwt;
  6. 返回响应的资源给浏览器。

四、JWT组成

先来看一张JWT的信息的截图:

一分钟带你了解JWT认证!第2张

从上图可以看到,JWT含有三部分:头部(header)、载荷(payload)、签名(signature)。

  1. 头部(header)

JWT的头部有两部分信息:

  • 声明类型,这里是JWT
  • 声明加密的算法,通常直接使用HMAC SHA256

头部示例如下:

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

头部一般使用base64加密,加密后密文:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

  1. 载荷(payload)

该部分一般存放一些有效的信息。JWT的标准定义包含五个字段:

  • iss:该JWT的签发者
  • sub: 该JWT所面向的用户
  • aud: 接收该JWT的一方
  • exp(expires): 什么时候过期,这里是一个Unix时间戳
  • iat(issued at): 在什么时候签发的

载荷示例如下:

{
  "sub": "1234567890",
  "name": "Java碎碎念",
  "iat": 1516239022
}
  1. 签名(signature)

前面两部分都是使用Base64进行编码的,即前端可以解开知道里面的信息。signature 需要使用编码后的header和payload以及我们提供的一个密钥,然后使用header中指定的签名算法(HS256)进行签名。签名的作用是保证 JWT 没有被篡改过。

三个部分通过.连接在一起就是我们的 JWT 了,所以我们生成的JWT如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphdmHnoo7noo7lv7UiLCJpYXQiOjE1MTYyMzkwMjJ9.LLJIkhJs6SVYlzn3n8fThQmhGutjTDI3RURTLtHV4ls

注意:密钥就是用来进行JWT的签发和JWT的验证,所以,它就是你服务端的私钥,在任何场景都不应该泄露出去。

五、JWT使用场景

JWT主要使用场景如下:

  • 授权

这是JWT使用最多的场景,一旦用户登录,每个后续的请求将包括JWT,从而允许用户访问该令牌允许的路由、服务和资源。

  • 信息交换:JSON

JWT可以用在各方之间安全地传输信息,因为JWT可以进行签名,所以您可以确定发件人是他们所说的人。另外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否未被篡改。

到此JWT的基础和认证原理已经讲完了,下一篇文章将介绍下SpringBoot中整合JWT,敬请期待哦。

推荐阅读

1.利用SpringBoot+Logback手写一个简单的链路追踪
2.SpringBoot中如何优雅的读取yml配置文件?
3.SpringBoot中如何灵活的实现接口数据的加解密功能?
4.SpringBoot中神奇的@Enable*注解?
5.Java中Integer.parseInt和Integer.valueOf,你还傻傻分不清吗?


限时领取免费Java相关资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高并发分布式、大数据、机器学习等技术。
关注下方公众号即可免费领取:

Java碎碎念公众号

免责声明:文章转载自《一分钟带你了解JWT认证!》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇二叉查找树(BST)的实现JavaEE系列之(二)commons-fileupload实现文件上传、下载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

websocket+probuf.原理篇

1、WebSocket     WebSocket,大家都知道,既然名字包含Socket,那么和Socket肯定差别不大,对,你没有搞错,的确差别不大。   在网络编程中,我们一般的协议都是基于TCP/IP,WebSocket也不例外。和HTTP一样,他也有自己的头部和具体的数据而已。 来看看。 这是一个,websocket发起的连接,首先一个http的请...

MSF使用之meterpreter模块

一、简介 Meterpreter是Metasploit提供的一个非常强大的后渗透工具 Meterpreter可以看成特殊的Payload,之前我们的Payload都是为了获得目标系统的shell 这里的payload就是shellcode,以获得目标系统的shell为目的的payload 我们获得的shell有些缺陷,仅利用shell来收集更多的信息、做更...

公钥与私钥

在对称加密的时代,加密和解密用的是同一个密钥,这个密钥既用于加密,又用于解密。这样做有一个明显的缺点,如果两个人之间传输文件,两个人都要知道密钥,如果是三个人呢,五个人呢?于是就产生了非对称加密,用一个密钥进行加密(公钥),用另一个密钥进行解密(私钥)。 1.公钥私钥原理 张三有两把钥匙,一把是公钥,另一把是私钥。    张三把公钥送给他的朋友们—-李四、...

Nginx实现JWT验证-基于OpenResty实现

介绍 权限认证是接口开发中不可避免的问题,权限认证包括两个方面 接口需要知道调用的用户是谁 接口需要知道该用户是否有权限调用 第1个问题偏向于架构,第2个问题更偏向于业务,因此考虑在架构层解决第1个问题,以达到以下目的 所有请求被保护的接口保证是合法的(已经认证过的用户) 接口可以从请求头中获取当前用户信息 每个请求都有uuid用于标识 JWT(J...

json web token 网上学习笔记

JSON Web Token(JWT) - 实现系统集成授权访问 这是一个第三方系统访问AnyReport报表系统使用JWT授权的实现案例,AnyReport报表系统暴露报表资源URL供第三方系统访问,第三方系统可以使用iframe,src设置为报表链接访问报表资源,这时资源URL类似restful api需要被认证的系统才能访问,通过JWT的好处...

浅谈 SQL 注入(注入篇)

一、SQL注入简介 1.1 什么是SQL注入 在用户可控制的参数上过滤不严或没有任何限制,使得用户将传入的参数(如URL,表单,http header)与SQL语句合并构成一条 SQL语句传递给web服务器,最终传递给数据库执行增删改查等操作,并基于此获取数据库数据或提权进行破坏。 1.2 SQL注入产生的原因 SQL Injection: 程序员在编写代...