cookie session token详解
简介
cookie
、session
和 token
是前端开发中很重要的概念,很多朋友并不真正了解这三者有什么区别,或者这三者到底是个什么的东西,面试的时候也只能模模糊糊的说一点,不能很清晰的讲明白,这里我们就这三个东西讨论下,彻底搞懂。
产生的背景
众所周知,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