关于登录的前前后后(Jwt和Token)

用户认证说起

1、HTTP是什么,简单来说就是一个通信协议,最大的特点就是每一次通信,都是一个独立的连接,通信完成,连接就会断开。

HTTP发送数据的基本格式要求:

输入用户名,密码之后,点击登录,浏览器会跟服务器建立一个TCP连接,浏览器将数据发送给服务器。服务器根据请求内容,将最终的HTML返回给浏览器,浏览器接收到页面的内容,此时,你看到了页面。

页面加载完成,通信结束,链接断开。

为什么浏览器跟服务器要断开连接呢?因为如果长时间保持这个连接,会占用大量服务器资源,那么服务器能同时服务的客户端数量就会变少了。但是连接一旦断开,就会带来新的问题,接下来如果我点击个

人中心再次向服务器查询我的个人信息。浏览器要跟服务器建立新的链接,服务器该怎么识别我的合法身份,它如何知道我是谁呢?以及我是否登录过呢?

2、至此,我们引出session概念,时间到回到第一步

当用户名和密码提交给服务器后,服务器/服务端验证通过,这时,服务器会为我这次的访问建立(生成)一个session,它的含义叫做会话,也就是说服务器需要为用户的这次会话,做一个临时性的记录,将用户的基本信息,存储在服务端(!!!)

登录状态都保存在这个所谓的session中,以便用户下次访问服务器可以识别他的身份,服务器给这个session对象分配/生成一个唯一的ID号,当服务器向浏览器端返回数据时,会将这个ID一并返回给客户端。(即session还要有对应cookie中的session ID)至此

我们要引出cookie技术,服务器将唯一的session返回给客户端,相当于把唯一的身份标记给到了客户端,这是验证身份的重要凭证,浏览器会保存号,浏览器下一次访问服务器时,携带这个数据,这样服务

器就能准确的识别你是谁,以及你有没有登录了,这种技术叫做会话跟踪技术,历览器保存的每一条记录就叫一个cookie,每一个cookie记录本质上就是一个键值对(不过数据内容基本都进行了加密)。

这样将数据保存到客户端,减轻了服务端的压力。解决了HTTP的无状态,方便了用户。

但是cookie还是有安全隐患,(除此之外,使用session还有一些不便,比如session不适合移动端,移动端不依赖于cookie;还有在集群的环境中,通过某个服务进行了session的存储,但下一次请求进来的时候可能经过负载均衡,就将其放到了另外一个服务上,但这个服务并没有上一次的session,就无法再次进行身份识别了,这个session也就失效了。

于是又引入了token机制,所谓token其实是另外一种形式的cookie,只不过需要自己来维护,因为它并不属于浏览器的规范,当第一次登录成功后,服务器返回的数据中,会携带一个token字符串返回给前端,前端会将这个token保存起来,当下次请求服务器时,需要前端手动携带这个token,这样就彻底有效的避免了跨域访问的安全隐患。(可以避免CSRF攻击

而且通过token防伪技术(数字签名)可以防止被人假冒token(一个token会包含三部分用户id,IP地址,登录时间,服务器会使用一个密钥,将这段内容加密,得到一个签名,最终形成了一个完整的token

字符串)。直接取代了cookie和session。与cookie不同的是,token的保存和携带都需要前端手动完成。

当请求完登录接口,后端会返回token,前端保存起来,并且封装你的网络请求,并在所有的请求头里,统一都把这个token带上,然后就可以跳转到登录页了。服务器一般会给token设置有效期,当token失效后,接口就会返回一个特定的状态码(一般是401)。

3、JWT(Json Web Token)

由三部分组成,Header:描述Jwt的元数据,定义了生成签名的算法以及Token的类型;Payload(负载)用来存放实际需要传递的数据;Signature(签名)服务器通过payload,header和一个密钥(Secret)

使用Header里面指定的签名算法(默认是HMAC SHA256 )生成。

是一个开放的标准,用于在各方之间以Json对象安全的传输信息,这些信息通过数字签名进行验证和授权,可使用RSA的公钥私钥对JWT进行签名

请求流程:用户使用浏览器(客户端)发送账号和密码;服务器使用私钥创建一个jwt ;服务器返回该jwt给浏览器(用户即获取到了jwt,在jwt的有效期内都不用再重复这三步骤,直接进行下面操作即可),浏览器将该jwt串在请求头中向服务器发送请求,服务器校验该jwt,根据授权规则返回资源给浏览器。