Web 开发必须掌握的三个技术:Token、Cookie、Session

在Web应用中,HTTP请求是无状态的。即:用户第一次发起请求,与服务器创建链接并登陆成功后,为了不每次打开一个页面都须要登陆一下,就出现了cookie,Session。算法

Cookie

Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。Cookie存储的数据量有限,且都是保存在客户端浏览器中。不一样的浏览器有不一样的存储大小,但通常不超过4KB。所以使用Cookie实际上只能存储一小段的文本信息。数据库

例如:登陆网站,今输入用户名密码登陆了,次日再打开不少状况下就直接打开了。这个时候用到的一个机制就是Cookie。segmentfault

Session

Session是另外一种记录客户状态的机制,它是在服务端保存的一个数据结构(主要存储的的SessionID和Session内容,同时也包含了不少自定义的内容如:用户基础信息、权限信息、用户机构信息、固定变量等),这个数据能够保存在集群、数据库、文件中,用于跟踪用户的状态。浏览器

客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只须要从该Session中查找该客户的状态就能够了。服务器

用户第一次登陆后,浏览器会将用户信息发送给服务器,服务器会为该用户建立一个SessionId,并在响应内容(Cookie)中将该SessionId一并返回给浏览器,浏览器将这些数据保存在本地。当用户再次发送请求时,浏览器会自动的把上次请求存储的Cookie数据自动的携带给服务器。cookie

服务器接收到请求信息后,会经过浏览器请求的数据中的SessionId判断当前是哪一个用户,而后根据SessionId在Session库中获取用户的Session数据返回给浏览器。数据结构

例如:购物车,添加了商品以后客户端处能够知道添加了哪些商品,而服务器端如何判别呢,因此也须要存储一些信息就用到了Session。网站

若是说Cookie机制是经过检查客户身上的“通行证”来肯定客户身份的话,那么Session机制就是经过检查服务器上的“客户明细表”来确认客户身份。Session至关于程序在服务器上创建的一份客户档案,客户来访的时候只须要查询客户档案表就能够了。ui

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。若是超过了超时时间没访问过服务器,Session就自动失效了。编码

Token

HTTP请求都是以无状态的形式对接。即HTTP服务器不知道本次请求和上一次请求是否有关联。因此就有了Session的引入,即服务端和客户端都保存一段文本,客户端每次发起请求都带着,这样服务器就知道客户端是否发起过请求。

这样,就致使客户端频繁向服务端发出请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否。而Session的存储是须要空间的,频繁的查询数据库给服务器形成很大的压力。

在这种状况下,Token应用而生。

Token是服务端生成的一串字符串,以做客户端进行请求的一个令牌。当客户端第一次访问服务端,服务端会根据传过来的惟一标识userId,运用一些算法,并加上密钥,生成一个Token,而后经过BASE64编码一下以后将这个Token返回给客户端,客户端将Token保存起来(能够经过数据库或文件形式保存本地)。下次请求时,客户端只须要带上Token,服务器收到请求后,会用相同的算法和密钥去验证Token。

最简单的Token组成:uid(用户惟一的身份标识)、time(当前时间的时间戳)、sign(签名,由Token的前几位+盐以哈希算法压缩成必定长的十六进制字符串,能够防止恶意第三方拼接Token请求服务器)。

使用基于 Token 的身份验证方法,在服务端不须要存储用户的登陆记录。大概的流程是这样的:

  • 客户端使用用户名跟密码请求登陆
  • 服务端收到请求,去验证用户名与密码
  • 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  • 客户端收到 Token 之后能够把它存储起来,好比放在 Cookie 里或者数据库里
  • 客户端每次向服务端请求资源的时候须要带着服务端签发的 Token
  • 服务端收到请求,而后去验证客户端请求里面带着的 Token,若是验证成功,就向客户端返回请求的数据

APP登陆的时候发送加密的用户名和密码到服务器,服务器验证用户名和密码,若是成功,以某种方式好比随机生成32位的字符串做为Token,存储到服务器中,并返回Token到APP,之后APP请求时,凡是须要验证的地方都要带上该Token,而后服务器端验证Token,成功返回所须要的结果,失败返回错误信息,让他从新登陆。

对于同一个APP同一个手机当前只有一个Token;手机APP会存储一个当前有效的Token。其中服务器上Token设置一个有效期,每次APP请求的时候都验证Token和有效期。

下面这个例子,能够很好的理解:

『给我来份煎饼(token我是你对面摊卖烤冷面的,scope赊帐)』『好』
『鸡蛋(token我是你对面摊卖烤冷面的,scope赊帐)』『好』
『再加个鸡蛋(token我是你对面摊卖烤冷面的,scope赊帐)』『好』

最终获得一份普通煎饼,外加两个鸡蛋……

若是服务器重启或者由于其余理由,服务器端已保存token丢失。那么用户需 要从新登陆和认证。

『给我来份煎饼(token我是你对面摊卖烤冷面的)』『那个……我没见过你』

点击关注,第一时间了解华为云新鲜技术~