JWT简单介绍

目录

JWT

概述

token认证和session认证的区别

传统的session认证

基于session认证所显露的问题

基于token的鉴权机制

JWT 的主要应用场景

优点

JWT搭建(基于java)

创建生成token的方法

验证token是否有效

获得 token 中 playload 部分数据


概述

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT 可以使用 HMAC 算法或者是 RSA 的公私秘钥对进行签名。

token认证和session认证的区别

传统的session认证

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

但是这种基于 session 的认证使应用本身很难得到扩展,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于session认证应用的问题就会暴露出来.

基于session认证所显露的问题

Session:每个用户经过认证后,我们都要在服务端做一次记录,以方便用户下一次的请求的鉴别,通常session保存在内存中,这样一来,随着用户的数量的增多,我们的服务端的开销明显会增大

扩展性:用户认证之后,服务端做认证记录,认证被保存在内存中的话,这意味着用户下次请求还是要请求服务端,才能拿到授权的资源,这样限制了负载均衡器的能力,也就意味着限制了应用的扩展

CSRF(跨站请求伪造):因为基于cookie来进行用户识别的,cookie如果被截获,那么用户就很容易的收到跨站请求的伪造攻击

基于token的鉴权机制

它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token 认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

流程:

  1. 用户使用账号和密码发出 post 请求;

  2. 服务器使用私钥创建一个 jwt;

  3. 服务器返回这个 jwt 给浏览器;

  4. 浏览器将该 jwt 串在请求头中像服务器发送请求;

  5. 服务器验证该 jwt;

  6. 返回响应的资源给浏览器

JWT 的主要应用场景

身份认证在这种场景下,一旦用户完成了登陆,在接下来的每个请求中包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。由于它的开销非常小,可以轻松的在不同域名的系统中传递,所有目前在单点登录中比较广泛的使用了该技术。信息交换在通信的双方之间使用JWT 对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。

优点

1.简洁(Compact): 可以通过 URL,POST 参数或者在 HTTP header 发送,因为数据量小,传输速度也很快

2.自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库

3.因为 Token 是以 JSON 加密的形式保存在客户端的,所以JWT 是跨语言的,原则上任何 web 形式都支持。

4.不需要在服务端保存会话信息,特别适用于分布式微服务。

5.由于私钥加密的缘故,也自然而然会更加的安全

JWT搭建(基于java)

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

创建生成token的方法

/**
* jwt 生成 token
* @param id
* @param account * @return
*/
public static String token (Integer id, String account){
String token = "";
try {
//过期时间 为 1970.1.1 0:0:0 至 过期时间 当前的毫秒值 + 有效时间
Date expireDate = new Date(new Date().getTime() + 10*1000);
//秘钥及加密算法
Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
//设置头部信息
Map<String,Object> header = new HashMap<>();
header.put("typ","JWT");
header.put("alg","HS256");
//携带 id,账号信息,生成签名
token = JWT.create()
.withHeader(header)
.withClaim("id",id)
.withClaim("account",account)
.withExpiresAt(expireDate)
.sign(algorithm);
}catch (Exception e){
e.printStackTrace(); return null;
}return token;
}

验证token是否有效

public static boolean verify(String token){
try {
//验签
Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
JWTVerifier verifier = JWT.require(algorithm).build();
DecodedJWT jwt = verifier.verify(token); return true;
} catch (Exception e) {//当传过来的 token 如果有问题,抛出异常
return false;
}
}

获得 token 中 playload 部分数据

/**
* 获得 token 中 playload 部分数据,按需使用
* @param token
* @return
*/
public static DecodedJWT getTokenInfo(String token){
return JWT.require(Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE")).build().verify(token);
}

用户登录成功后将用户 id 和账号存储到 token 中返回给客户端,之后客户端每次请求将 token 发送到服务器端验证, 在服务器中进行验证.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JWT(JSON Web Token)是一种用于在网络应用程序之间安全传输信息的开放标准。它以 JSON 为基础并使用数字签名或消息认证码(MAC)来验证信息的完整性和真实性。 JWT 由三个部分组成:头部、载荷和签名。 头部包含 JWT 使用的签名算法信息,例如 HMAC SHA256 或 RSA。载荷包含需要传输的信息,例如用户 ID 或权限信息。签名是将头部、载荷和秘钥组合后生成的哈希值,用于验证信息的真实性。 JWT 的工作原理如下: 1. 用户使用用户名和密码进行身份验证。 2. 服务器验证用户名和密码的正确性。 3. 如果验证成功,服务器生成 JWT 并将其发送回客户端。 4. 客户端将 JWT 存储在本地并在每个后续请求中将其包含在请求头部中。 5. 服务器在接收到请求时,验证 JWT 的签名并检查载荷中的信息是否与所需的一致。如果验证成功,服务器会处理请求。 JWT 的优点是: 1. 轻量级和简单JWT 以 JSON 格式编码,易于理解和实现。 2. 安全性:使用数字签名或消息认证码(MAC)验证信息的完整性和真实性,确保信息不被篡改或伪造。 3. 可扩展性:JWT 载荷可以包含任意数量的属性和元数据,使其非常适合用于身份验证和授权。 4. 无状态:JWT 包含所有必要的信息,因此服务器不需要存储任何会话信息,使其易于扩展和实现负载均衡。 然而,JWT 也存在一些缺点,例如: 1. JWT 一旦生成就无法撤销,因此必须确保密钥的安全性。 2. JWT 中包含的信息对于攻击者来说是可见的,因此敏感信息不应该存储在 JWT 中。 3. JWT 无法在传输过程中进行更新,因此在过期之前必须生成新的 JWT。 总体来说,JWT 是一种非常有用的身份验证和授权解决方案,但在使用时需要仔细考虑其安全性和缺点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重开之Java程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值