1. JWT原理剖析
说起用户的登录系统,估计少侠们早就听说过JWT,
那么什么是JWT呢?
为什么应该使用JWT呢?
JWT与Session又有什么关系呢?
我会在下文中详细回答这些问题,在深入学习JWT工作原理之前,我们先来学习一下JWT是干什么用的。
JWT全称JSON Web Token,它的作用是用户授权Authorization,而不是用户的身份认证Authentication,
授权Authorization与认证Authentication在英文上看上去很相似,但是它们却是完全不一样的概念,含义差了十万八千里。
用户认证指的是使用用户名和密码来验证当前的用户身份,简单来说就是用户登录,而用户授权则指用户登录以后,当前用户是否有足够的权限访问特定的资源。
少侠们可以回忆一下,当用户登录失败的时候,返回的错误码应该是401_Unauthorized,未授权,
而当一个用户没有权限读取某一个资源的时候,返回的错误码应该是403_forbidden。
传统上,我们会使用服务器的Session来判断当前用户是否登录,用户登录以后服务器会创建一个用户登录的Session信息,并把Session保存起来,然后把Session的ID通过Cookie传给前端。
当这个用户需要访问某一个API的时候,Session的ID就会被包含在HTTP请求中一起发给后端,后端通过Session ID来判断用户是否已经登录,然后通过用户的权限来判断是否可以给用户提供响应的资源。
因为在服务器中需要保存用户的Session,所以我们称这种登录模式为有状态登录,
但是JWT的出现彻底改变了用户的认证与授权过程,使用JWT来替换浏览器的Cookie,
因为JWT只负责处理授权,所以JWT信息(Token)只需要保存在客户端,而不需要保存在服务器上,从而就可以实现无状态登录,
因为从本质上来说,JWT跟登录根本就没有关系。
接下来,我们快速了解一下使用Session的有状态登录与使用JWT的无状态登录有什么不一样?
传统上我们会使用Session和Cookie来保持用户的授权信息。
第一步登录过程,
用户使用用户名和密码来登录系统,
服务器会来验证用户名和密码是否正确。
如果正确,服务器会给这个用户创建一个包含用户登录信息角色权限的一个叫做Session的东西,然后把这个Session保存起来,同时把Session ID以Cookie的形式发送给前端,表示用户验证成功登录完成了。
接下来,如果用户希望访问某些资源,前端要向后端发起一个HTTP的请求,同时相应的Cookie也会跟随着请求一起发送给服务器,
而服务器取得Cookie以后,就会去查找是否有Session ID,
然后通过Session ID提取相应的Session来确定用户的身份与权限,