当下,JWT(JSON Web Token)令牌认证已经变得愈来愈流行。本文主要介绍JWT令牌认证与传统的Session会话认证机制的区别。数据库
HTTP是一种无状态协议,那就意味着当前的客户端的请求与任何以前的请求是独立不依赖的,而服务器也并不会记录任何请求信息。例如,若是你只是简单地访问静态页面(例如访问 www.yiidian.com ),服务器实际上不须要知道客户端是谁,而只会给客户端返回纯粹的页面内容。另外一方面,若是你想在Facebook上进行资料上的更改,则必须向一点教程网服务器证实你是该账户的拥有者。简而言之,您须要先验证本身的身份,而后服务器才能为你提供访问敏感信息的权限。在了解JWT认证以前,咱们先来看看传统的Session会话认证吧。浏览器
在Session会话认证模型中,在用户登陆并受权后,服务器将建立客户端惟一的Session。服务器将Session ID返回给客户端,而后客户端将其存储在浏览器的cookie中。在随后的HTTP调用中,cookie将自动包含在HTTP请求头中,服务器将经过cookie中记录的Session ID得知客户端的身份。尽管cookie存储在客户端,可是因为验证是在服务器上完成的,所以该认证模型属于服务器端会话。说到这里,您可能会想:HTTP协议不是无状态的么?那服务器如何记住客户端的身份?缓存
从技术上讲,HTTP无状态协议不会禁止服务器存储信息。大多数Web应用程序都须要存储某种形式的状态,以便知道客户端的Session ID是否有效。例如,服务器可能会把Session ID存储在服务器内存,这样,只要先前通过身份验证的客户端再次发出请求,服务器就能够简单地在内存查找Session ID,并验证客户端是否已经经过了身份验证。服务器
在分布式架构中,客户端在其中一台服务器验证经过后,Session ID只会存储在当前服务器中,当客户端访问其余服务器时,并不能查找到以前的Session ID,这样就没法正常验证了。为了确保全部服务器具备相同Session ID,其中一种方法是让全部服务器使用共享的Redis缓存(如上图所示)。微信
在JWT(JSON Web Token)认证模型中,服务器不会在用户登陆后返回Session ID,而是将签名(加密)的Token字符串返回给客户端。此签名的Token本质上是一个JSON对象,其中包含服务器使用私钥或公钥/私钥签名的身份验证信息。cookie
在后续的HTTP请求中,客户端只须要在请求中传递该JWT加密字符串,而且确保每一个服务器实例均可以解密Token并验证用户身份。架构
无需使用缓存/数据库来存储Session IDyii
没法从服务器撤消Token,服务器只能肯定Token是否有效分布式
本文首发微信公众号:一点教程。欢迎关注公众号,得到独家整理的学习资源和平常干货推送。学习
若是您对个人系列教程感兴趣,也能够关注个人网站:yiidian.com