前言:本文中的客户端约等于浏览器。服务器是服务器。Cookie、session、token都是由服务器生成并保存在客户端的。三者最大的区别在于服务器对cookies、session和token的处理。饼干1。在客户端输入账号密码,点击登录,向服务器发送请求a,服务器验证账号密码,获取用户信息。2、此时服务端生成cookie,并使用请求a的响应中的Set-Cookie字段将cookie信息返回给发送请求的客户端。客户端看到Set-Cookie后在本地记录cookie。3、客户端再次发送请求b时,会携带一个cookie,让服务器知道请求发起者的身份(或权限)。session1.在客户端输入账号密码,点击登录,向服务器发送请求a,服务器验证账号密码,获取用户信息。2、此时服务端生成对应关系的key和value。用户信息存储在value中(以下简称userMessage),userMessage需要存储在服务器端(一般存储在内存数据库中,方便快速查询)。key是一长串无序的字符串,其中key(以下简称sessionString)就是session。3、sessionString作为cookie的一部分发送给客户端,服务器端在cookie内容中添加一个特殊的字段(字段名可以是session、sessionId、sys_session等),该字段用于传输并存储sessionString(例如:特殊字段名a_sys_session对应sessionString)。在请求a的响应中,使用Set-Cookie字段将cookie信息返回给发送请求的客户端。客户端看到Set-Cookie后,将cookie记录在本地,a_sys_session和sessionString也记录在本地。4、客户端再次发送请求b时,会携带cookie,cookie中有一个a_sys_session字段。服务端拿到cookie后,从cookie中提取a_sys_session字段对应的sessionString。5、通过sessionString查询userMessage,获取用户信息(可能查询不到,比如过期了,或者sessionString被改变了)。获得用户信息后,服务器就知道了这个请求发起者的身份(或权限)。令牌1。在客户端输入账号密码,点击登录,向服务器发送请求a,服务器验证账号密码,获取用户信息。2、服务器取出用户信息(以下简称userMessage2),格式化成特定格式(如string、object)。server本身需要一个secretkey(以下简称secretKey),保存在server端,通过加密算法(createFunction)生成userMessage2和secretKey,生成新的字符串(以下简称secretString2)。将userMessage2和secretString2以易于拆分的方式处理成一个新的字符串(concatString2),其中concatString2为token。无需在服务器端保存令牌。3、concatString2需要返回给客户端,此时有两种选择。3.1一个作为cookie的一部分发送给客户端。cookie的内容由sever添加一个特殊的字段(字段名可以是token、sys_token等),这个字段用来传输和存储concatString2(例如:特殊字段名a_sys_token对应concatString2).在请求a的响应中,使用Set-Cookie字段将cookie信息返回给发送请求的客户端。客户端看到Set-Cookie后在本地记录cookie,本地也记录了a_sys_token和concatString2。客户端再次发送请求b时,会通过cookie携带token信息。3.2二是作为特定的返回字段,交由客户自行保管。在这种情况下,客户端收到请求a的响应后,需要通过程序将token存储在sessionStorage或localStorage中。此外,每次发送请求时,都需要携带token传递给服务器。这种情况下,携带token信息的一般方法是将token放在请求头的Authorization字段中。4、客户端再次发送请求b时,携带token信息给服务端,服务端解析得到concatString2,然后通过concatString2拆分出userMessage2和secretString2。5.添加解析得到的userMessage2和服务端保存的secretKey+createFunction重新生成newSecretString,检查newSecretString和secretString2是否一致。如果验证通过,则确认userMessage2为正确的用户信息。三者的安全性比较:Cookies的安全性最差,因为cookies是在本地存储用户信息,有可能被修改。虽然我们可以通过设置httpOnly来禁止通过js代码修改cookies,但是如果我们从浏览器复制cookie,然后修改cookie,用http工具(比如postman)发送请求,就有可能获取到额外的信息。session在server端保存用户信息,token有验证过程。两者的安全性远强于cookies。session和token的安全性是一个档次的,非要比的话感觉session强一点。但是如果要更改token的信息,就必须同时知道创建token的secretKey和createFunction,这必须要有内部人员来完成。session和token的优缺点分析:由于服务端可能会连接大量的client,需要存储大量的session,会导致数据库的IO压力,用户数必须是经过考虑的。另外,如果服务器是一个集群,为了同步登录状态,需要将session同步到每台机器上,无形中增加了服务器的维护成本。token的好处是服务器不需要存储token,所以不会对服务器造成额外的存储压力,即使是服务器集群也不需要增加维护成本。token的实现比较灵活,前端有很大的发展空间,也不一定非要存到cookie中。代币发行后,只要在有效期内,就一直有效。服务器想要收回这个token的权限,可不是件容易的事。(token方法我没练过,也不知道有什么办法可以收回token权限,盲点)完了。同步更新到你的语雀https://www.yuque.com/diracke...