cookie session token详解

  1. cookie session token详解
  2. 简介
  3. 产生的背景
  4. cookie
  5. session
  6. token

cookie session token详解

简介

cookiesessiontoken是前端开发中很重要的概念,很多朋友并不真正了解这三者有什么区别,或者这三者到底是个什么的东西,面试的时候也只能模模糊糊的说一点,不能很清晰的讲明白,这里我们就这三个东西讨论下,彻底搞懂。

产生的背景

众所周知,http协议本身是一个无连接的协议,web早期只是用来浏览文档,不需要交互,每次http请求都是一个全新的请求,服务端并不关心到底是谁在访问,但是随着交互式web应用的发展,我们必须要识别客户端到底是谁,否则根本无法进行交互,比如商城应用,后端服务必须要知道是谁在买东西,每个客户端要区分开,这时候就需要客户端要和服务端能够进行数据的相互传递,有时还需要在不同的域名下实现数据共享,cookie就是用来解决这一问题的。

cookie

cookie是一个真实存在的东西,保存在客户端浏览器中,当一个请求发起后,后端如果想要设置cookie,则在响应头中添加一个Set-Cookie字段,浏览器识别到此响应头,就把里面的数据存放到浏览器本地,当下次再次请求的时候,将该cookie放到请求头中,发送给后端,实现前后端的交互。

cookie是有大小和数量限制的,根据浏览器的不同这个有所差异;

Set-Cookie响应头类似于Set-Cookie: username=daryl; path=/; expires=Thu, 26 Aug 2021 16:37:43 GMT; domain=localhost; samesite=none; secure; httponly

这个值是后端设置的,可选的属性有以下几种

  • maxAge

    用来告诉浏览器此cookie多久过期(单位是毫秒),而不是一个固定的时间点。正常情况下,max-age的优先级高于expires。

  • expires

    失效时间,表示cookie何时应该被删除的时间戳(也就是,何时应该停止向服务器发送这个cookie)。如果不设置这个时间戳,浏览器会在页面关闭时即将删除所有cookie;不过也可以自己设置删除时间。这个值是GMT时间格式,如果客户端和服务器端时间不一致,使用expires就会存在偏差。

  • path

    表示这个cookie影响到的路径,浏览器跟会根据这项配置,向指定域中匹配的路径发送cookie。

  • domain

    cookie对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie信息。这个值可以包含子域(如:yq.aliyun.com),也可以不包含它(如:.aliyun.com,则对于aliyun.com的所有子域都有效).

  • secure

    安全标志,指定后,只有在使用SSL链接时候才能发送到服务器,如果是http链接则不会传递该信息。就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以不要把重要信息放cookie就对了服务器端设置

  • secureProxy?: boolean | undefined;

    “secureProxy” option is deprecated; use “secure” option, provide “secure” to constructor if needed

  • httpOnly?: boolean | undefined;

    a boolean indicating whether the cookie is only to be sent over HTTP(S),
    and not made available to client JavaScript (true by default).

  • sameSite?: ‘strict’ | ‘lax’ | ‘none’ | boolean | undefined;

    a boolean or string indicating whether the cookie is a “same site” cookie (false by default).
    This can be set to ‘strict’, ‘lax’, or true (which maps to ‘strict’).

  • signed

    是否对cookie进行签名(默认为false),如果设置为true,还将发送附加的另一个同名的后缀是.sig的cookie ,值类似于Set-Cookie: username.sig=yuJIW4DxsPvY4BoKAP2YMpH5p5k; path=/; expires=Thu, 26 Aug 2021 16:37:43 GMT; domain=localhost; samesite=none; secure; httponly,此签名密钥用于在下次收到cookie时检测篡改。

  • overwrite

    是否覆盖以前的设置同名cookies(默认为false)

session

session实际上是一个概念,即会话;session的实现有很多方式,最常见的是基于cookie的方式,后端生成一个session,有一个唯一的session id,标识唯一性,然后把这个session id通过cookie发送给客户端,客户端保存起来,下次请求的时候再携带包含session id值的cookie发送给后端,后端拿到后再去通过session id值查找对应的session;所以session实际上是保存在后端的,而发送给客户端的只是一个session id

session这种方式的弊端在于服务器必须要保存session,无论是保存在文件里还是数据库里,都是一个很大的开销,并且一旦用户量过于庞大,session也会非常庞大,做负载均衡的话如果请求负载到了不同的机器,会造成session失效。

token

token这种方案现在已经被广泛应用了,相比于cookie + session的实现方式,token不需要保存在服务器上,而是将数据签名,然后发送给客户端(可以通过cookie也可以通过其他方式),下次请求的时候再校验token的合法性,如果合法,则响应成功,如果不合法,则响应失败,这种方式就是用计算资源来节省空间资源,好处是我们不需要关心token的存储,而只需要扩展机器增加算力即可。

详细的token解决方案,可以阅读深入理解token


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com