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可不依赖认证服务即可完成授权
 

8、问题解答

a、token到底生成什么样最好?(规则),每个用户要唯一
三部分组成:头部、载荷与签名 header.payload.signature
 
b、token返回给客户端之后,服务端还要保存吗?
服务端不需要保存
 
c、校验token时,怎么保证数据并没有被黑客拦截并篡改?(安全)
signature中有私钥来进行签名,可以保证安全性
 
d、token颁发给客户端之后,要不要有过期时间?
需要设置token过期时间
 
e、多次登录生成的token都是一样的吗?都是可用的吗?
可以再payload加上时间戳,来保证每次生成的token都不一样,都是可用的
 
 
 
 

JWT使用

 

  1. 首先,前端通过Web表单将自己的用户名和密码发送到后端的接口。这一过程一般是一个HTTP POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探。
  2. 后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload(负载),将其与头部分别进行Base64编码拼接后签名,形成一个JWT。形成的JWT就是一个形同lll.zzz.xxx的字符串。
  3. 后端将JWT字符串作为登录成功的返回结果返回给前端。前端可以将返回的结果保存在localStorage或sessionStorage上,退出登录时前端删除保存的JWT即可。
  4. 前端在每次请求时将JWT放入HTTP Header中的Authorization位。(解决XSS和XSRF问题)
  5. 后端检查是否存在,如存在验证JWT的有效性。例如,检查签名是否正确;检查Token是否过期;检查Token的接收方是否是自己(可选)。
  6. 验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作,返回相应结果。

和Session方式存储id的差异

Session方式存储用户id的最大弊病在于Session是存储在服务器端的,所以需要占用大量服务器内存,对于较大型应用而言可能还要保存许多的状态。一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存储。

而JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。除了用户id之外,还可以存储其他的和用户相关的信息,例如该用户是否是管理员、用户所在的分组等。虽说JWT方式让服务器有一些计算压力(例如加密、编码和解码),但是这些压力相比磁盘存储而言可能就不算什么了。具体是否采用,需要在不同场景下用数据说话。

  • 单点登录  

Session方式来存储用户id,一开始用户的Session只会存储在一台服务器上。对于有多个子域名的站点,每个子域名至少会对应一台不同的服务器,例如:www.taobao.comnv.taobao.comnz.taobao.comlogin.taobao.com。所以如果要实现在login.taobao.com登录后,在其他的子域名下依然可以取到Session,这要求我们在多台服务器上同步Session。使用JWT的方式则没有这个问题的存在,因为用户的状态已经被传送到了客户端。

 

总结

JWT的主要作用在于(一)可附带用户信息,后端直接通过JWT获取相关信息。(二)使用本地保存,通过HTTP Header中的Authorization位提交验证。但其实关于JWT存放到哪里一直有很多讨论,有人说存放到本地存储,有人说存 cookie。

 

1.2JWT交互流程

1、用户登录

2、服务的认证,通过后根据secret生成token

3、将生成的token返回给浏览器

4、用户每次请求携带token

5、服务端利用公钥解读jwt签名,判断签名有效后,从Payload中获取用户信息

6、处理请求,返回响应结果

 
posted @ 2020-12-14 11:13  java_静止  阅读(575)  评论(0编辑  收藏  举报