暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java安全框架(三):JWT(Json Web Token)

一叶扁舟 2020-08-27
4290

Java安全框架(一):Spring Security基础
Java安全框架(二):Spring Security工作原理
Java安全框架(四):Spring Security + JWT综合应用(流程梳理)

一、概述

1、什么是无状态?

简单讲,服务里面一定要存一个session那就是有状态,不需要存就是无状态

2、服务架构演进

  • 单体架构(有状态)
    缺陷:Session在服务器中,如果服务器有多个,由于服务器轮询,会造成频繁跳转登录;服务器开销大

image.png

  • 分布式架构:Redis集中管理session(有状态)
    缺陷:服务端要一直维持session状态,redis挂掉了,所有用户要重新登录;服务器开销大

image.png

  • 微服务架构:JWT(无状态)
    优势:登陆后返回jwt,以后每次用户会携带jwt发送请求,服务端不需要再维持session状态

image.png

二、JWT基础知识

1、什么是JWT

通过json的形式作为web应用中的令牌,用于各方之间安全的信息传输。(json web token)

  • 优势
    image.png

2、JWT结构

(1)结构
标头(Header).有效载荷(Payload).签名(Signature)

  • Header
{
    “alg”: “HS256”,  // 签名算法
    “typ”: “JWT”    // 令牌类型
}
// 对上面做Base64编码
base64UrlEncode(header)
  • Payload(有效负荷中不要放敏感信息,因为Base64编码是可以解码的)
{
    “sub”: “1234567890”,
    “name”: “tom”,
    “admin”: true
}
// 对上面做Base64编码
base64UrlEncode(payload)
  • Signature(防止Header和Payload被篡改)
HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), “secret”);

(2)解密

image.png

(3)验证
将传入的token的第1、2部分加上secret进行加密,如果跟第3部分相同,则验证通过。

HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), “secret”);

3、JWT认证流程

image.png

三、JWT简单使用

1、引入依赖

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.4.0</version>
</dependency>

2、生成token

Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE, 6); 
// 生成令牌
String token = JWT.create()
        .withClaim("username", "张三") // 自定义用户名
        .withExpiresAt(instance.getTime()) // 设置过期时间
        .sign(Algorithm.HMAC256("securityJWT")); // 设置签名
// 输出令牌
System.out.println(token);
  • 生成的token
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1OTgzNDM5NDAsInVzZXJuYW1lIjoi5byg5LiJIn0.2mfqA8AMn9rK-OpKDYEbOO8hWb5DSdVOmL0a_mxq5CE

3、根据令牌和签名解析数据

// 创建验证对象
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("securityJWT")).build();
DecodedJWT decodedJWT = jwtVerifier.verify(“eyJ0eXAiOiJKV1Q...jkfSgrqD7BtZg7GeA");
System.out.println("用户名:" + decodedJWT.getClaim("username").asString());
System.out.println("过期时间:" + decodedJWT.getExpiresAt());

四、单点登录

1、什么是单点登录?

我们在某宝中,可以看到,里面有很多别的应用,而我们想要用,直接点就行了,并不需要再次登录,这就是单点登录。

image.png

2、单点登陆的原理

多个应用间是通过token进行传输,当你登录某宝之后,会产生一个token,在你后续访问过程中都会携带这个token,而当你点击其他应用时,也会把token传过去,应用会对token进行解密验证,验证成功,即可访问。

image.png

最后修改时间:2020-08-27 15:04:58
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论