什么是JWT及其在网络安全中的应用和实现原理?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1032个文字,预计阅读时间需要5分钟。
目录 + 起源 + Session认证 + Token认证 + 什么是JWT + JWT的数据结构 + Header + Payload + Signature + JWT的优势 + 如何使用JWT + 总结 + 起源 + 需要了解一门技术,首先从为什么生产开始说起。JWT + 主要用于用户登录 +
JWT是一种用于在各方之间安全地传输信息的开放标准(JSON Web Token)。它主要用于用户登录,提供一种无需服务器存储的认证方式。JWT的主要优势在于它的简洁性和安全性。使用JWT,可以避免在客户端和服务端之间传输敏感信息,同时提高系统的可扩展性和性能。
目录
- 起源
- session认证
- token认证
- 什么是JWT
- JWT的数据结构
- Header
- Payload
- Signature
- JWT的优点
- 怎么使用JWT
- 总结
起源
需要了解一门技术,首先从为什么产生开始说起是最好的。JWT 主要用于用户登录鉴权,所以我们从最传统的 session 认证开始说起。
session认证
众所周知,mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="io.github.yehongzhi.jwtdemo.mapper.UserMapper"> <select id="findByUserNameAndPassword" resultType="io.github.yehongzhi.jwtdemo.model.User"> select * from user where user_name = #{userName} and pass_word = #{passWord} </select> </mapper>
user 表结构如下:
启动项目,然后用 postman 请求 login 接口。
返回的 jwt 字符串如下:
eyJhbGciOiJIUzI1NiIsInppcCI6IkRFRiJ9.eNqqVspLzE1VslJ6OnHFsxnzX67coKSjlJgOFDEzqAUAAAD__w.qib2DrjRKcFnY77Cuh_b1zSzXfISOpCA-g8PlAZCWoU
接着我们写一个接口接收这个 jwt,并做验证。
@RestController @RequestMapping("/jwt") public class TestController { @Resource private JwtUtil jwtUtil; @RequestMapping("/test") public Map<String, Object> test(@RequestParam("jwt") String jwt) { //这个步骤可以使用自定义注解+AOP编程做解析jwt的逻辑,这里为了简便就直接写在controller里 Claims claims = jwtUtil.parseJWT(jwt); String name = claims.get("name", String.class); String age = claims.get("age", String.class); HashMap<String, Object> map = new HashMap<>(); map.put("name", name); map.put("age", age); map.put("code", "0"); map.put("msg", "请求成功"); return map; } }
像这样能正常解析成功的话,就表示该用户登录未过期,并且已认证成功,所以可以正常调用服务。那么有人会问了,这个 jwt 字符串能不能被伪造呢?
除非你知道 secretKey,否则是不能伪造的。比如客户端随便猜一个 secretKey 的值,然后伪造一个jwt:
eyJhbGciOiJIUzI1NiIsInppcCI6IkRFRiJ9.eNqqVspLzE1VslJ6OnHFsxnzX67coKSjlJgOFDEzqAUAAAD__w.bHr9p3-t2qR4R50vifRVyaYYImm2viZqiTlDdZHmF5Y
然后传进去解析,会报以下错误:
还记得原理吧,是根据前面两部分(Header、Payload)加上 secretKey 使用 Header 指定的哈希算法计算出第三部分(Signature),所以可以看出最关键就是 secretKey。secretKey只有服务端自己知道,所以客户端不知道 secretKey 的值是伪造不了jwt字符串的。
总结
最后讲讲 JWT 的缺点,因为任何技术都不是完美的,所以我们得用辩证思维去看待任何一项技术。
安全性没法保证,所以 jwt 里不能存储敏感数据。因为 jwt 的 payload 并没有加密,只是用 Base64 编码而已。无法中途废弃。因为一旦签发了一个 jwt,在到期之前始终都是有效的,如果用户信息发生更新了,只能等旧的 jwt 过期后重新签发新的 jwt。续签问题。当签发的 jwt 保存在客户端,客户端一直在操作页面,按道理应该一直为客户端续长有效时间,否则当 jwt有效期到了就会导致用户需要重新登录。那么怎么为 jwt 续签呢?最简单粗暴就是每次签发新的 jwt,但是由于过于暴力,会影响性能。如果要优雅一点,又要引入 Redis 解决,但是这又把无状态的 jw t硬生生变成了有状态的,违背了初衷。
所以印证了那句话,没有最好的技术,只有适合的技术。
到此这篇关于一文了解什么是JWT的文章就介绍到这了,更多相关JWT内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!
本文共计1032个文字,预计阅读时间需要5分钟。
目录 + 起源 + Session认证 + Token认证 + 什么是JWT + JWT的数据结构 + Header + Payload + Signature + JWT的优势 + 如何使用JWT + 总结 + 起源 + 需要了解一门技术,首先从为什么生产开始说起。JWT + 主要用于用户登录 +
JWT是一种用于在各方之间安全地传输信息的开放标准(JSON Web Token)。它主要用于用户登录,提供一种无需服务器存储的认证方式。JWT的主要优势在于它的简洁性和安全性。使用JWT,可以避免在客户端和服务端之间传输敏感信息,同时提高系统的可扩展性和性能。
目录
- 起源
- session认证
- token认证
- 什么是JWT
- JWT的数据结构
- Header
- Payload
- Signature
- JWT的优点
- 怎么使用JWT
- 总结
起源
需要了解一门技术,首先从为什么产生开始说起是最好的。JWT 主要用于用户登录鉴权,所以我们从最传统的 session 认证开始说起。
session认证
众所周知,mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="io.github.yehongzhi.jwtdemo.mapper.UserMapper"> <select id="findByUserNameAndPassword" resultType="io.github.yehongzhi.jwtdemo.model.User"> select * from user where user_name = #{userName} and pass_word = #{passWord} </select> </mapper>
user 表结构如下:
启动项目,然后用 postman 请求 login 接口。
返回的 jwt 字符串如下:
eyJhbGciOiJIUzI1NiIsInppcCI6IkRFRiJ9.eNqqVspLzE1VslJ6OnHFsxnzX67coKSjlJgOFDEzqAUAAAD__w.qib2DrjRKcFnY77Cuh_b1zSzXfISOpCA-g8PlAZCWoU
接着我们写一个接口接收这个 jwt,并做验证。
@RestController @RequestMapping("/jwt") public class TestController { @Resource private JwtUtil jwtUtil; @RequestMapping("/test") public Map<String, Object> test(@RequestParam("jwt") String jwt) { //这个步骤可以使用自定义注解+AOP编程做解析jwt的逻辑,这里为了简便就直接写在controller里 Claims claims = jwtUtil.parseJWT(jwt); String name = claims.get("name", String.class); String age = claims.get("age", String.class); HashMap<String, Object> map = new HashMap<>(); map.put("name", name); map.put("age", age); map.put("code", "0"); map.put("msg", "请求成功"); return map; } }
像这样能正常解析成功的话,就表示该用户登录未过期,并且已认证成功,所以可以正常调用服务。那么有人会问了,这个 jwt 字符串能不能被伪造呢?
除非你知道 secretKey,否则是不能伪造的。比如客户端随便猜一个 secretKey 的值,然后伪造一个jwt:
eyJhbGciOiJIUzI1NiIsInppcCI6IkRFRiJ9.eNqqVspLzE1VslJ6OnHFsxnzX67coKSjlJgOFDEzqAUAAAD__w.bHr9p3-t2qR4R50vifRVyaYYImm2viZqiTlDdZHmF5Y
然后传进去解析,会报以下错误:
还记得原理吧,是根据前面两部分(Header、Payload)加上 secretKey 使用 Header 指定的哈希算法计算出第三部分(Signature),所以可以看出最关键就是 secretKey。secretKey只有服务端自己知道,所以客户端不知道 secretKey 的值是伪造不了jwt字符串的。
总结
最后讲讲 JWT 的缺点,因为任何技术都不是完美的,所以我们得用辩证思维去看待任何一项技术。
安全性没法保证,所以 jwt 里不能存储敏感数据。因为 jwt 的 payload 并没有加密,只是用 Base64 编码而已。无法中途废弃。因为一旦签发了一个 jwt,在到期之前始终都是有效的,如果用户信息发生更新了,只能等旧的 jwt 过期后重新签发新的 jwt。续签问题。当签发的 jwt 保存在客户端,客户端一直在操作页面,按道理应该一直为客户端续长有效时间,否则当 jwt有效期到了就会导致用户需要重新登录。那么怎么为 jwt 续签呢?最简单粗暴就是每次签发新的 jwt,但是由于过于暴力,会影响性能。如果要优雅一点,又要引入 Redis 解决,但是这又把无状态的 jw t硬生生变成了有状态的,违背了初衷。
所以印证了那句话,没有最好的技术,只有适合的技术。
到此这篇关于一文了解什么是JWT的文章就介绍到这了,更多相关JWT内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

