这是我参与「第五届青训营 」笔记创作活动的第1天,今天我学习了几种后端服务器鉴别用户身份的方法,主要分为两种,一种是传统Session的方式,另一种是今天主要学习的JWT。
为什么需要Session
众所周知,http协议是无状态的,所以服务器无法通过浏览器的http请求判断出来是哪一个用户的请求。这时候Cookie应运而生,通过在服务器记录登录用户的信息,然后将session id写入用户的cookie中,后续浏览器发送的请求都将带上cookie,然后服务器通过cookie中的session id在内存中找到保存的session信息,就能得到用户的信息。
Session为什么不好用
传统session方式将用户信息保存在内存中
- 当登录用户数量越来越多时,内存的占用也将越来越大
- 多个服务之间的Session交换增大了网络开销和内存开销
- 因为需要依赖cookie,所以难以解决跨域问题
解决办法
这些问题可以通过专用redis来进行缓解,将session保存到一个专门的redis中,这样不会占用单个服务大量的内存,还能减少session交换带来的额外空间凯开销和网络开销。但是这是治标不治本的做法,redis虽然作为一个专用session存储的地方足够强大,但是其性能终究是有上限的,并且其单体结构健壮性堪忧,万一redis爆炸那么所有session都将失效,是不能接受的。
JWT 全名 JSON Web Token
JSON Web Token Introduction - jwt.io
JWT的思想是将用户信息交给客户端保存,服务器不保留状态。用户登录后,每个后续请求都将包含 JWT,允许用户访问使用该令牌允许的路由、服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小,并且能够跨不同域轻松使用。
JWT的紧凑形式由三个部分组成分别是:
- header
- payload
- signature
因此,JWT 通常为xxxxx.yyyyy.zzzzz
简而言之,header存储加密方式,payload存储用户信息,这两个是明文,signature存储header和payload以及服务器secert的签名,用于防止篡改。这样每次服务器拿到JWT都可以获取到真实的用户信息,通常来说,JWT的安全性会由https来进行保证,单说JWT,由于明文传输,其实并不算安全。