OAuth2.0实战(三)-使用JWT(下)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: OAuth2.0实战(三)-使用JWT(下)

5 为什么令牌要编码且签名?

授权服务颁发JWT后给到xx软件,xx拿着令牌请求受保护资源服务,即我在公众号里的文章。显然令牌要在公网传输。

所以传输过程令牌还要做到:

  • 编码,以防乱码
  • 签名及加密,以防数据信息泄露。

JJWT是开源较方便的JWT工具,开箱即用。封装Base64URL编码和对称HMAC、非对称RSA的一系列签名算法。

使用JJWT可方便生成一个经过签名的JWT令牌,以及解析一个JWT令牌。

String sharedTokenSecret="hellooauthhellooauthhellooauthhellooauth";//密钥
Key key = new SecretKeySpec(sharedTokenSecret.getBytes(),
                SignatureAlgorithm.HS256.getJcaName());
//生成JWT令牌
String jwts=
Jwts.builder().setHeaderParams(headerMap).setClaims(payloadMap).signWith(key,SignatureAlgorithm.HS256).compact()
//解析JWT令牌
Jws<Claims> claimsJws =Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(jwts);
JwsHeader header = claimsJws.getHeader();
Claims body = claimsJws.getBody();  

6 优点

6.1 计算代替存储

时间换空间。

这种计算并结构化封装,减少了“共享DB” 因远程调用而带来的网络传输性能损耗,所以可能节省时间。

6.2 加密

因JWT令牌内部已包含重要信息,所以传输过程都必须被要求密文传输,被强制要求加密也保障了传输安全性。

6.3 增强系统可用性和可伸缩性

JWT令牌,通过“自编码”方式包含身份验证需信息,不再需要服务端额外存储,所以每次的请求都是无状态会话。符合尽可能遵循无状态架构设计原则,即增强了系统可用性和伸缩性。

6.4 降低 AuthServer 压力

客户端获取令牌后,后续资源服务器可做自校验,无需到AuthServer校验。

6.5 简化AuthServer实现

无需对用户状态会话进行维护和管理

7 缺点

无状态和吊销无法两全

  • 无法在使用过程中修改令牌状态。
    比如我在使用xx时,可能因为莫须有原因修改了在公众号平台的密码或突然取消了给xx的授权。这时,令牌状态就该有变更,将原来对应令牌置无效。
  • 但使用JWT时,每次颁发的令牌都不会存在服务端,无法改变令牌状态。这表示JWT令牌在有效期内畅通无阻。


那么可以把JWT令牌存储在一个分布式内存数据库比如Redis中吗?

NO!这违背JWT意义 - 将信息结构化存入令牌本身。通常有两种方案:


将每次生成JWT令牌时的秘钥粒度缩小到用户级别,即一个用户一个秘钥

如此,当用户取消授权或修改密码,可让该密钥一起修改。这种方案一般还需配套单独密钥管理服务

在不提供用户主动取消授权的环境里面,若只考虑修改密码场景,即可把用户密码作为JWT的密钥。这也是用户粒度。这样用户修改密码也就相当于修改了密钥。

网络传输开销

随 claims 增多而增大。

8 令牌的生命周期

令牌都有有效期,只是JWT可把有效期的信息存在本身结构。

OAuth 2.0的令牌生命周期,通常有三种情况:

  1. 令牌自然过期
  2. image.png
  3. 该过程不排除主动销毁令牌的可能,比如令牌被泄露,授权服务可让令牌失效。


访问令牌失效后可使用刷新令牌请求新令牌,提高用户使用三方软件的体验。


让三方软件比如xx,主动发起令牌失效请求,然后授权服务收到请求后让令牌立即失效。

何时需要该机制?

比如用户和三方软件间存在一种订购关系:我购买了xx软件,那么到期或退订时且我授权的token还未到期情况下,就需这样一种令牌撤回协议,支持xx主动发起令牌失效请求。作为开放平台,也建议有责任的三方软件遵守这样的一种令牌撤回协议。

image.png

9 总结

OAuth 2.0 的核心是授权服务,没有令牌就没有OAuth,令牌表示授权后的结果。令牌在OAuth 2.0系统中对于第三方软件都是不透明的。需要关心令牌的,是授权服务和受保护资源服务。


JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次

JWT 不加密的情况下,不能将秘密数据写入 JWT

JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数

JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑

JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证

为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输


参考

目录
相关文章
|
2月前
|
数据采集 JSON 算法
Python爬虫——基于JWT的模拟登录爬取实战
Python爬虫——基于JWT的模拟登录爬取实战
63 1
Python爬虫——基于JWT的模拟登录爬取实战
|
6月前
|
存储 缓存 数据库
【万字长文】微服务整合Shiro+Jwt,源码分析鉴权实战
介绍如何整合Spring Boot、Shiro和Jwt,以实现一个支持RBAC的无状态认证系统。通过生成JWT token,实现用户无状态登录,并能根据用户角色动态鉴权,而非使用Shiro提供的注解,将角色和权限信息硬编码。此外,文章还探讨了如何对Shiro的异常进行统一捕获和处理。作为应届生,笔者在学习Shiro的过程中进行了一些源码分析,尽管可能存在不足和Bug,但希望能为同样需要实现权限管理的开发者提供参考,并欢迎各位大佬指正完善。
372 65
【万字长文】微服务整合Shiro+Jwt,源码分析鉴权实战
|
4月前
|
JSON 数据安全/隐私保护 数据格式
Nest.js 实战 (八):基于 JWT 的路由身份认证鉴权
这篇文章介绍了身份验证的重要性和多种处理策略,重点放在了JWT(JSON Web Token)认证在Nest.js框架中的应用。文章包含了JWT认证的流程,如何在Nest.js中实现,以及如何创建JWT认证策略。包括了安装依赖,创建处理认证流程的文件,以及如何使用HttpException过滤器来处理未登录访问。
234 0
Nest.js 实战 (八):基于 JWT 的路由身份认证鉴权
|
4月前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
416 0
|
6月前
|
JSON 安全 Java
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
557 0
|
7月前
|
安全 关系型数据库 MySQL
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
121 3
|
7月前
|
SQL 安全 Java
微服务之Springboot整合Oauth2.0 + JWT
微服务之Springboot整合Oauth2.0 + JWT
188 1
|
7月前
|
存储 缓存 NoSQL
【视频+源码】登录鉴权的三种方式:token、jwt、session实战分享
【视频+源码】登录鉴权的三种方式:token、jwt、session实战分享
137 1
|
21天前
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
76 5
|
4月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
270 0

热门文章

最新文章

下一篇
DataWorks