jwt太难懂?一篇文章带你征服它

本文详细介绍了JWT(JSON Web Token)在Spring Boot应用中的集成与使用,包括JWT的签发、验证以及与Spring Security的结合。通过实例代码展示了JWT的签发和验证关键步骤,并探讨了JWT的安全性和实际使用中可能遇到的问题,如token注销和续租。文章还提到了JWT在多平台登录、跨域支持等方面的优势,以及如何解决性能和用户信息拉取的问题。
摘要由CSDN通过智能技术生成

本文的完整示例代码,见github仓库。小q只在文中介绍最关键的代码块。

https://github.com/yuanluoji/purestart-springboot-jwt
复制代码

关于jwt是什么,这里就不再啰嗦了。总体来讲,它有HeaderPayloadSignature三个部分,每一部分,都有一些细分的属性,这个原理扫一眼就可以,对我们的使用没有实质性的帮助。

使用jwt可以让后台服务彻底的无状态化,让登录这个过程无需session的参互,这样服务端就会获得强大的横向扩容能力,前面的nginx也不用配置ip_hash这样蛋疼的东西。

我发现很多jwt的代码实例,都写的非常的复杂模糊。尤其是和SpringBoot的集成上,由于SpringSecurity的参与,这个过程更加的复杂。

本篇文章将主要介绍和SpringBoot的集成,让jwt真正走到实践中来。

首先,我们来看一看jwt的外衣是什么样子。就是下面这一长串。

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ5dWFubHVvamkiLCJpYXQiOjE2MDI0OTA0NDEsImV4cCI6MTYwMjQ5MjI0MX0.Qrz30s56F--cQu_fs0LWQhiZtcoLbdAuQK6dIVk4b_aSZ5is8nTs1bR7mh0qefZdiFvFk4N__sg0UouKbhH8_g
复制代码

敏感的同学一眼就能看出来,最后一步是通过base64编码的。使用官方的html页面进行解码,可以看到它也仅仅是编码而已,其中的内容并没有加密。我们可以轻而易举的从Playload中,获取yuanluoji这样的字眼。

1. JWT使用

使用JWT,我们是期望获得登陆验证功能的,用它来替换Cookie,用它来模拟Session。大体使用流程如下:

  1. 前端提交用户名和密码到任意一台服务器
  2. 服务器验证用户名和密码(spring security或者shiro
  3. 如果验证成功,将使用jwt的api生成一个token
  4. 这个token将会返回给前端,前端将会把它保存起来(cookie、上下文或者其他),之后每次请求,都把这个token加在http头里发送到服务端
  5. 服务端能够验证token的合法性,因为里面有过期时间和防篡改机制,所以token需要完整发送

在Java中,比较流行的有两个包。一个是官方auth0的,不过好像因为使用比较复杂所以用的较少;另外一个就是jjwt。通过pom可以直接引入它。

<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt-api</artifactId>
	<version>0.11.2</version>
</dependency>
<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt-impl</artifactId>
	<version>0.11.2</version>
	<scope>runtime</scope>
</dependency>
<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
	<version>0.11.2</version>
	<scope>runtime</scope>
</dependency>
复制代码

先来看一下Jwt的使用方式。首先是签发token的代码,片段如下:

public String generateToken(Map<String, Object> claims, String subject) {
    Date now = Calendar.getInstance().getTime();
    return Jwts.builde
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值