JWT原理 使用(入门篇)

1、JWT简介

JWT:Json Web Token,是基于Json的一个公开规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,他的两大使用场景是:认证和数据交换

使用起来就是,由服务端根据规范生成一个令牌(token),并且发放给客户端。此时客户端请求服务端的时候就可以携带者令牌,以令牌来证明自己的身份信息。

作用:类似session保持登录状态 的办法,通过token来代表用户身份。

2,JWT生成

3,JWT校验

4,一些问题

a、token到底生成什么样最好?(规则),每个用户要唯一

b、token返回给客户端之后,服务端还要保存吗?

c、校验token时,怎么保证数据并没有被黑客拦截并篡改?(安全)

d、token颁发给客户端之后,要不要有过期时间?

e、多次登录生成的token都是一样的吗?都是可用的吗?

5,JWT规则详解

一个JWT实际上就是一个字符串,它由三部分组成:头部、载荷与签名 header.payload.signature

一个正常的token为: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjYyNywiZXhwIjoxNTcwMDE0ODg1fQ.vPbQh4syxNCzkKXKPSM93LzzLqoJdzPDNeKz8tz9cFM4NzhIOdPrJcH2DG-9-9MCUufCgrAhhGjuo85GKV4bOQ

6,JWT令牌的优点:

a、jwt基于json,非常方便解析

b、可以再令牌中自定义丰富的内容,易扩展(payload可以扩展)

c、通过签名,让JWT防止被篡改,安全性高

d、资源服务使用JWT可不依赖认证服务即可完成授权

7,demo测试

 1 /**
 2 * JWT 测试controller
 3 *
 4 * @author wangmeng
 5 * @date 2019/9/2
 6 */
 7 @RestController
 8 @RequestMapping(value = "/user", produces = { "application/json; charset=UTF-8" })
 9 public class JWTController {
10  
11  
12     private static final String SECRET = "wangmengtest.@163.com";
13  
14  
15     @RequestMapping("/login/{username}/{password}")
16     public Map login(@PathVariable String username, @PathVariable String password) {
17         Map result = new HashMap();
18         if (username.equals("admin") && password.equals("123456")) {
19             String jwt = Jwts.builder().
20                     setSubject(username).
21                     signWith(SignatureAlgorithm.HS512, SECRET).
22                     compact();
23             result.put("token", jwt);
24         } else {
25             result.put("message", "账号密码错误");
26         }
27  
28  
29         return result;
30     }
31  
32  
33     @RequestMapping("/goods/{token}")
34     public Map verifyToken(@PathVariable String token) {
35         Map result = new HashMap();
36         Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
37         result.put("username", claimsJws.getBody().getSubject());
38         return result;
39     }
40 }

请求测试:

1、生成token

2、使用token请求,获取username

8、问题解答

a、token到底生成什么样最好?(规则),每个用户要唯一

三部分组成:头部、载荷与签名 header.payload.signature

b、token返回给客户端之后,服务端还要保存吗?

服务端不需要保存

c、校验token时,怎么保证数据并没有被黑客拦截并篡改?(安全)

signature中有私钥来进行签名,可以保证安全性

d、token颁发给客户端之后,要不要有过期时间?

需要设置token过期时间

e、多次登录生成的token都是一样的吗?都是可用的吗?

可以再payload加上时间戳,来保证每次生成的token都不一样,都是可用的

 后记

JWT还有很多内容需要挖掘,这里只是入门篇,后面有时间还会看看JWT源码 以及一些常见的坑。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏陌无崖知识分享

一文带你读懂Micro框架如何读取配置文件

我们在写程序的时候,一个无法避免的步骤就是配置文件的编写,有了配置文件,就要有相应的加载机制,比如读取配置文件到实体中,配置文件因为语法简单,具有灵活性,在程序...

13510
来自专栏nice_每一天

springboot集成redis实现消息发布订阅模式-跨多服务器

基础配置参考 https://blog.csdn.net/llll234/article/details/80966952

11510
来自专栏python前行者

python库Camelot从pdf抽取表格数据

首先,让我们看一个简单的例子:eg.pdf,整个文件只有一页,这一页中只有一个表格,如下:

53130
来自专栏编程坑太多

「走进k8s」Kubernetes1.15.1必备知识静态pod(17)

PS:静态pod主要可以把主要的组件进行容器化,etcd,kube-apiserver,kube-controller-manager,kebe-schedul...

30820
来自专栏每天学点Android知识

Flutter版本玩Android(2)——主页面数据获取

上一部分构造了主页面,这一部分主要完成主页面三个tab的数据获取,下一步的点击事件目前都未处理。

9260
来自专栏Web行业观察

MessagePack:最可能取代JSON的存在。

科普一个冷门的,但是很强的技术:MessagePack,简称msgpack。msgpack不是软件,是一个标准,可以先把它看成二进制的json,“二进制json...

21120
来自专栏移动安全

前端使用第三方数据如何最大程度保证安全

前后端分离,通常是前端通过api去获取后端的数据,如果后端的数据是可靠源,那么只要后端的接口靠谱,

9230
来自专栏算法猿的成长

5天破10亿的哪吒,为啥这么火,Python来分析

不知道大家最近有没有去看电影,最近身边的朋友都在向我安利一部叫做《哪吒之魔童降世》的动漫电影。大家无一例外,都说非常的好看。

11940
来自专栏python爱好部落

Python结合jquery Ajax 的实例

jQuery对Ajax的操作进行了封装。jQuery中.ajax()属于最底层的方法。 先来看一个简单的例子:

28920
来自专栏全栈修炼

56 道高频 JavaScript 与 ES6+ 的面试题及答案

用正则表达式匹配字符串,以字母开头,后面是数字、字符串或者下划线,长度为 9 - 20

16440

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励