JWT的初步了解以及session、cookie机制
1.什么是状态保持?
想要了解JWT,首先需要知道什么是状态保持,举一个例子来说:无论是在web上还是在手机app上,我们都可以以游客的身份访问,此时都会有登录/注册字眼,当我们登录之后,就会是我们的登录信息,那么,保证这种登录信息的展示以及在某段规定时间内保证登录信息的展示称为状态保持。
2.JWK概念
JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
3.什么是跨域?
域:一般我们通常所称的网站地址都基本由三部分组成(协议:http,ftp等、域名:www.jd.com、端口号、附带的有查询字符串:就是我们所请求的内容等信息),只要三者有一处不同,即为不同的域名,在不同的域名之间进行数据的传递,就是一种跨域的表现,而三者相同,则成为同源。
4.什么是分布式站点?
现如今很多的大中型网站都开始采取分布式服务器来管理自己的网站。即将不同的功能页面分别搭建在不同的服务器上,从而可以实现单点访问,以及单点登录功能,举个例子:京东的主页面,以及京东的购物车页面,二者就采用了分布式服务器来搭建,主页面以及购物车页面都具有自己的域名,可以直接进行访问,从而展示的页面也不同。
5.分布式服务器的搭建的好处?
(1)可以将分布在各处的资源综合利用。而这种利用对用户而言是透明的。
(2)可以将负载由单个节点转移到多个,从而提高效率。实现负载均衡
(3)分布式技术可以避免由于单个节点失效而使整个系统崩溃的危险
6.分布式站点如何实现状态保持?
如果未采用分布式服务器搭建来管理项目,一般都是采用cookie,session来实现状态保持,那么session和cookie都不能支持跨域,所以面对分布式站点,状态保持就可以依靠JWT来实现
7.为什么session、cookie不能在跨域中实现状态保持呢?
session是基于cookie实现的,而cookie又是基于同源策略来实现的,面对这种机制下,无法实现跨域访问,一旦跨域,就会被浏览器拒绝,则无法实现状态保持,无法提供相对应的用户信息。
在客户端的存储机制称为cookie,而在服务器端则称为session
8.什么是同源策略?
现在最热门的语言无疑是JavaScript 了,所有的语言都要配合它使用。
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问
9.传统的session认证
我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。
10.session的局限性
对于过去的几十年,互联网发展不是很迅猛的时候,网站的用户访问量并不高,那么独立的服务器管理着项目可以支撑的起并不是很巨大用户量的访问,也可以利用session来实现状态保持,但是到了现在,几乎所有的网站都在追寻着高并发的高效处理方式,session面对庞大的用户,则显得捉襟见肘,session受限于cookie机制,使得应用本身无法得到扩展,导致服务器无法承载更多的用户,于是session的问题就暴露出来。
如果在分布式服务器中使用session的话,就意味着session的信息只能被保存在同一台服务器上,在后面的每一次访问都会指定去访问保存了session信息的服务器才能够拿到保存的状态信息。这样做,从一方面使负载均衡服务器失去了它本身的意义,加大了个别服务器的负载,同时也是限制了应用的扩展能力。
11.session是如何实现状态保持的呢?
当session第一次被调用的时候,就会产生一个产生密钥被保存在cookie中,接下来的每次用户访问中,就会对cookie中的密钥做出比对,如果符合则实现状态保持。
12.负载均衡(SLB)
网络专用术语,负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。在此情况下,如果扔掉现有设备去做大量的硬件升级,这样将造成现有资源的浪费,而且如果再面临下一次业务量的提升时,这又将导致再一次硬件升级的高额成本投入,甚至性能再卓越的设备也不能满足当前业务量增长的需求。
13.基于token的鉴权机制
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。
14.token是如何实现的?
当用户带着自己的用户名和密码去访问浏览器时,浏览器会生成一个token,然后将token储存在cookie中(存储在浏览器中),同时,将token存储在缓存中(按照用户名来进行存储)。当用户在此访问时,首先根据用户名从缓存中获取保存的token,然后和浏览器中保存的token进行比对,如果一致,则返回响应的数据。
这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)
策略,一般我们在服务端这么做就可以了Access-Control-Allow-Origin: *
。