Token、Cookie、Session
程序员文章站
2024-02-01 18:13:28
转自:一只躲在角落里的小刺猬 文章链接:http://jianshu.com/p/8ef0c5a551d3 在Web应用中,HTTP请求是无状态的。即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session。 Cookie Co ......
转自:一只躲在角落里的小刺猬
文章链接:http://jianshu.com/p/8ef0c5a551d3
在web应用中,http请求是无状态的。即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,session。
cookie
cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现session的一种方式。cookie存储的数据量有限,且都是保存在客户端浏览器中。不同的浏览器有不同的存储大小,但一般不超过4kb。因此使用cookie实际上只能存储一小段的文本信息。
例如:登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。
session
session是另一种记录客户状态的机制,它是在服务端保存的一个数据结构(主要存储的的sessionid和session内容,同时也包含了很多自定义的内容如:用户基础信息、权限信息、用户机构信息、固定变量等),这个数据可以保存在集群、数据库、文件中,用于跟踪用户的状态。
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是session。客户端浏览器再次访问时只需要从该session中查找该客户的状态就可以了。
用户第一次登录后,浏览器会将用户信息发送给服务器,服务器会为该用户创建一个sessionid,并在响应内容(cookie)中将该sessionid一并返回给浏览器,浏览器将这些数据保存在本地。当用户再次发送请求时,浏览器会自动的把上次请求存储的cookie数据自动的携带给服务器。
服务器接收到请求信息后,会通过浏览器请求的数据中的sessionid判断当前是哪个用户,然后根据sessionid在session库中获取用户的session数据返回给浏览器。
例如:购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session。
如果说cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么session机制就是通过检查服务器上的“客户明细表”来确认客户身份。session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
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我是你对面摊卖烤冷面的)』『那个……我没见过你』
上一篇: 一个IOS自动化打包的脚本
下一篇: dotnetcore中使用dapper