还傻傻分不清Cookie 、Session、Token?

前面的话

Cookie 、Session、Token听过无数遍了,你是否真的知道其原理?为什么出现?

如果不了解,那你一定要往下看!!!

cookie
cookie的来源

HTTP1.x协议是一个无状态协议,所谓的无状态简单来说:即使使用同一个客户端连续发送两次请求给服务器,服务器也识别不出来这是同一个客户端发送的请求。这样导致的问题:比如当你的添加商品到购物车,你刷新页面,就没有了。 这样体验肯定不好。

为了解决客户端与服务器会话状态的问题,也就是说为了让服务器知道前后的两个请求是不是来自同一个浏览器(辨别浏览器身份),cookie就派上用场了。

cookie是什么?

cookie是指: 服务器发送给用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一个服务器再次发送请求时被携带,一起发送到服务器。不可跨域,大小一般不超过4kB。

cookie的存放

cookie不仅仅可以存放在浏览器,还可以存放到本地文件。存放在本地的好处:即使你关闭了浏览器,cookie依然生效。

什么样的数据适合放在cookie中?

每一次http请求时, 浏览器会检测是否有相应的cookie存在,如果有则会自动添加到请求头的cookie字段,发给服务器。如果我们的数据不是每次都需要发送给浏览器,,这样就增加了网络开销,所以一般情况下,我们将每次都需要发给服务器的数据存在cookie中。

比如将身份验证信息存放到cookie中就比较合适,这也是cookie来源的初衷。

cookie的设置
  • 服务端设置: 客户端第一次发送HTTP请求到服务器;当服务器收到HTTP请求时,在响应头里的set-cookie字段里面设置;客户端收到响应后,保存这个cookie;再次访问服务器时,将cookie信息放在请求头的cookie字段中发给服务器。
cookie的属性
  • name / value : 设置cookie的名字以及对应的值,必须是字符串类型

  • Expires:设置cookie的过期时间。过了这个时间之后,cookie就失效了。如果不设置Expires,表示会话性cookie,当为会话性cookie时,值保存在浏览器内存中,用户关闭浏览器就失效了。 与会话性cookie相对的是持久性cookie,持久性cookie会保存在用户的硬盘中,直至过期或者清除。这里的设定的如期时间只与客户端有关。

  • Max-Age: 用于设置cookie失效之前需要经过的秒数。可为正数、负数、0。若为正数,表示cookie是持久性的,写入用户硬盘,过期失效;若是负数,表示cookie为会话性的,关闭窗口就失效;若是0,表示立即删除这个cookie。Max-age的优先级高于Expires

  • Domain: 指定cookie所属域名。

  • Path: 指定URL路径,这个路径必须出现在要请求的资源的路径中才可以发送cookie。比如设置Path=/user ,那么/user/12下的资源会带上cookie,而/test则不会携带cookie。domain是域名,path是路径,两者加起来构成URL,一起限制cookie能被哪个URL访问。

  • Secure:标记了Secure属性的cookie只能被通过HTTPS协议发送的请求所携带。

  • HTTPOnly:设置该字段可以防止客户端通过脚本document.cookie来设置或者访问cookie,可以防止XSS攻击

  • SameSite:二月份发布的Chrome 80版本默认屏蔽了第三方的cookie,导致很多应用都产生了问题。就是因为Chrome 80版本将这个属性的默认值由None改为了Lax

    SameSite属性可以让cookie在跨站请求时不会被发送,防止CSRF攻击。其值有三种:
    1、Strict仅允许一方请求携带cookie,即当前网页的url与请求目标URL完全一致
    2、Lax允许部分第三方请求携带cookie
    3、None无论是否跨站都会发送cookie(注意是跨站,而不是跨域)

    看一下从None变为Lax发发生了什么:在这里插入图片描述
    这样很多情况的请求都不携带cookie了。导致部分页面的内嵌支付宝确认失效,部分登录页面失败等。

    解决方法:将SameSite属性设回原来的None。

    这里参考:浏览器之cookie与Samesite属性

cookie的优点与缺点

优点:

  • 会话状态管理:比如用户登录的状态、购物车、游戏分数等需要记录的信息
  • 个性化设置: 比如用户自定义设置、主题等
  • 浏览器行为跟踪: 比如跟踪分析用户行为等

缺点:

  • 大小只有4kb
  • 会增加请求头部的大小
  • 存在客户端,每次请求是HTTP请求,明文传输,不是安全。
Session
Session来源

现在网站功能都很强大,比如购物车功能,信息量大,无法通过简单的cookie机制来传递,并且cookie字段存在HTTP header中,就算能够承载这些信息,也会消耗很多带宽。

session就可以配合cookie来解决这一问题。

Session是什么?

session是另一种记录服务器和客户端会话状态的机制。它是基于cookie实现的,session存储在服务器端sessionID会被存储到客户端的cookie中

可以说一个session可以理解为一种数据结构,多数情况是键值对,存在服务器上。

  • 第一次请求,服务器创建对应的session,响应返回时将这个session的唯一标识sessionID发给cookie;
  • 浏览器收到sessionID后,将此信息存入到cookie中,同时记录此sessionID属于哪个域名;
  • 再次请求时,客户端的cookie带上这个sessionID,然后服务器通过这个ID找到对应的session。这个session里面存储着该用户的购物车等详细信息。

在这里插入图片描述

session过期时间

session存在服务器中,会消耗服务器的资源,所以session一般都有一个过期时间,服务器一般会定期检查并删除过期的session。如果后来用户再次访问服务器,肯能就会面临重新登录的措施。重复上面的操作。

ps小插曲

一些网站有免费试用的功能,试用一次后,就要登录付费。当你第一次使用时,并没有登录,但网站还是记住你了。那么肯定是服务器向你的浏览器打了一个cookie,后台建立session记住了的信息,你的浏览器每次请求时,都会带上这个cookie,所以服务器一查对应的session就知道是你了。所以想白嫖,可以删除这个cookie,不让浏览器携带这个cookie。哈哈哈,但是不鼓励这样做哦!!! 该掏钱还是乖乖掏钱。

cookie与session的区别
  • cookie存在客户端,session存在服务端,session比cookie要安全
  • cookie只支持字符串数据,session可以是任何类型的数据
  • 单个cookie保存的数据不超过4kb,session可存的数据远远大于cookie
Token
  • Token的目的:是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
  • token分为两种:access tokenrefresh token
什么是Token?
  • Token:令牌,访问资源接口时,所需要的资源凭证。

  • Token组成:Token是服务端生成的一串字符串,最简单的组成:userID (用户唯一的身份标识) 、time当前的时间戳、sign签名(token的前几位是使用哈希算法压缩成的一定长度的十六进制字符串)

  • 特点:

    • 服务端无状态,可扩展性好;
    • 支持移动端设备;
    • 安全;
    • 支持跨程序调用。
  • token的身份验证过程:

    • 客户端使用用户名跟密码请求登录
    • 服务端收到请求,去验证用户名与密码,验证成功后,服务器发一个token给客户端
    • 客户端收到token后,会保存,比如放在cookie或localstorage
    • 客户端每次想服务器请求资源时,会带上这个token
      在这里插入图片描述
      每一次请求都要携带token,基于token的用户认证是一种服务端无状态的认证方式,服务端不用存放token数据。用解析token的计算时间换取session的存储空间,从而减少服务器的压力,
refresh token

另外一种token,refresh token 用于刷新access token。
在这里插入图片描述

  • Access token的有效期比较短,当 Acesss Token 由于过期而失效时,使用 Refresh Token 就可以获取到新的 Token,如果 Refresh Token 也失效了,用户就只能重新登录了。
  • Refresh Token 及过期时间是存储在服务器的数据库中,只有在申请新的 Acesss Token 时才会验证,不会对业务接口响应时间造成影响,也不需要向 Session 一样一直保持在内存中以应对大量的请求。
Token的无状态

怎么理解这个问题,服务器生成的token不会保存,将token发给浏览器;当浏览器其再次请求时,带上这token,服务器用相同的算法与密钥 再次计算签名,看与浏览器发来的token的签名是否一致。
在这里插入图片描述

( 算法可以使用其他算法,只要一致就行,这里只是为了方便看清。)

图来源于:干掉状态:从session到token

Token解决的问题
  • Token完全由应用管理,可以避开同源策略
  • Token可以避免CSRF攻击
  • Token是无状态的,可以多个服务间共享
Token与Session区别
  • session 是记录服务器与客服端会话状态的机制;Token是令牌,访问资源接口时所要的凭证,在服务端是无状态的,不需要存储会话信息
  • session一般用于将信息保存在服务器,是一对一的,数据不会共享给第三方。如果你的数据需要与第三方共享,或者允许第三方调用API接口,用token
  • Token可以避免CSRF,可以避开同源策略。

参考文章:还分不清楚Cookie 、Session、Token、JWT

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值