cookie、session、token 理解

参考:简书文章码农翻身篇章HTTP 无状态

背景

随着互联网的发展,大家访问浏览器不止是浏览简单的页面而已,用户不满足于静态的Html 文档了, 交互式的Web应用开始兴起, 尤其是论坛, 在线购物等网站,那么就需要为所有用户维护个人购物车,需要区分出每个用户,记住哪些用户登录过,哪些用户往自己的购物车中添加商品。由于HTTP是无状态的特性,应该如何记录验证用户登录状态。

HTTP 协议一共有五大特点:1、支持客户/服务器模式;2、简单快速;3、灵活;4、无连接;5、无状态
HTTP 无连接特点:
指每次连接只处理一次请求,服务端处理完客户端的请求并收到应答之后,就会断开本次连接。请求时建连接、请求完释放连接,以尽快将资源释放出来服务其他客户端,可以节省传输时间。
随着时间的推移,每次请求都建立连接显得很低效,Keep-Alive 功能使客户端到服务器端的连接持续有效。
HTTP 无状态特点:
指处理每次请求时没有对事务的记忆能力,服务器处理完每个请求后,不会做任何记录。意味着每个请求都是独立的,Keep-Alive 也没有改变这一点。优点就是释放服务器不会造成不必要占用,缺点就是当需要上一次请求的信息时,必须重新发送求情。

session id 的出现

想到的第一个方法是给每个用户发一个唯一标识,且叫它会话标识( session id)。会话标识需要在服务器端保存一份,用户发送请求的时候带上它,服务器就能区分出哪个用户了。
那如果服务器端由多个机器组成,是每个机器上都保存一份 session id?还是只保留一份,当请求到另外一个机器的时候,再复制一份,亦或者单独抽出一个机器专门保存 session id。无论如何这对服务器来说都是一种负担。


在这里插入图片描述

token 的出现

时间换空间
服务器端保存session id就是为了对比验证用户真实性,如果这个验证标识信息不由服务器端保存呢?
不保存这些session id , 怎么验证客户端 session id 的确是服务器生成的呢? 如果我不去验证,怎么知道是不是合法登录的用户, 如果伪造session id , 就可以为所欲为了。关键在于如何验证!
如果标识仅保存在客户端,每次由客户端带过去,服务器端根据某种规定进行算法验证是否是合法。当用户进行登录之后,服务器给用户发一个令牌 token,里面包含了用户信息数据,再对数据做一个签名,且只有服务器才知道密钥,将签名&数据一起作为 token,下次用户再访问时需要带上这个 token,服务器再计算一次签名,如果相同就是验证通过就是合法用户(因为这个密钥只有自己知道,当别人伪造 token 时,计算得到的签名不一致,就非法用户),但是如果这个 token 被偷走了,那就没办法了,会认为这个小偷是合法用户了。
服务器不保存session id , 只是生成token , 然后验证 token , 用CPU计算时间获取了session 存储空间 !

在这里插入图片描述

Cookie 理解

cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。建议大家这样理解,这也是为何上面将 session 和 token 一起讲的原因,这里会基于不同的验证方式来解释。
cookie 也是由服务器生成发送给浏览器,浏览器以 K-V的形式保存在某个目录下文件中,下次请求同一(同一域名)网站时会将 cookie 发送给服务器。

基于 cookie 的验证方式

例如上面提到的 session 的验证方式。基于cookie的验证是有状态的,就是说验证或者会话信息必须同时在客户端和服务端保存。这个信息服务端一般在数据库中记录,而前端会保存在cookie中

验证的一般流程如下:
1、用户输入登陆凭据;
2、服务器验证凭据是否正确,并创建会话,然后把会话数据存储在数据库中;
3、具有会话id的cookie被放置在用户浏览器中;
4、在后续请求中,服务器会根据数据库验证会话id,如果验证通过,则继续处理;
5、一旦用户登出,服务端和客户端同时销毁该会话。

基于token的身份验证方式

基于token的验证是无状态的。服务器不记录哪些用户已登陆或者已经发布了哪些JWT。对服务器的每个请求都需要带上验证请求的token。该标记既可以加在header中,可以在POST请求的主体中发送,也可以作为查询参数发送。

工作流程如下:
1、用户输入登陆凭据;
2、服务器验证凭据是否正确,然后返回一个经过签名的token;
3、客户端负责存储token,可以存在local storage,或者cookie中;
4、对服务器的请求带上这个token;
5、服务器对JWT进行解码,如果token有效,则处理该请求;
6、一旦用户登出,客户端销毁token。

注意:session id 也可以不以 cookie 形式出现,而是单独存储在 header 中;
token 也存在以 cookie 的形式保存;上面两种验证方式不是说按照哪个数据保存格式区分的,而是验证思想区分的,服务器是否保存验证标识(有无状态),担心上面两种验证方式名称有歧义而做此解释

完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值