HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。HTTP协议是无状态的,即所有发送过的请求都不会被记录下来,为了实现记录一些稳定的状态信息,在这些过程中添加了Cookie。
Cookie主要用于以下三个方面:
a) 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
b) 个性化设置(如用户自定义设置、主题等)
c) 浏览器行为跟踪(如跟踪分析用户行为等)
当服务器收到HTTP请求时,服务器可以在响应头里面添加一个Set-Cookie选项。浏览器收到响应后通常会保存下Cookie,之后对该服务器每一次请求中都通过Cookie请求头部将Cookie信息发送给服务器。另外,Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。
服务器使用Set-Cookie响应头部向用户代理(一般是浏览器)发送Cookie信息。一个简单的Cookie可能像这样:
Set-Cookie: <cookie名>=<cookie值>
关于cookie通常有两种类型:一是会话cookie;二是持久性cookie。
会话cookie是比较简单的cookie,当浏览器关闭之后会话的cookie会被自动删除,即会话cookie只在会话期内有效,所以会话期的cookie不需要指定过期时间(Expires)或有效期(Max-Age)。但需要注意的是有的浏览器提供会话恢复功能,这样关闭浏览器会话cookie也会被保留下来。
持久cookie也会话cookie不同,持久cookie可以指定一个特定的过期时间,可以通过过期时间(Expires)或有效期(Max-Age)来指定。
Set-Cookie: id=a3fWa; Expires=Wed, 20 Oct 2019 08:27:00 GMT;
Cookie的工作原理如图所示。
使用抓包工具可以看到一个请求中cookie工作的过程,如图就是一个cookie的处理过程。
首先根据服务器响应头中的Set-Cookie计算出Cookie的值,然后发送请求时在请求头中会附带Cookie一块发送到服务器。上图中的Cookie值内容如下。
Cookie:vjuids=173461ebf.1681c520089.0.f2ff3662a3228; vjlast=1546663363.1548567229.11; _ntes_nnid=a6e42f42f62a6885cfb245a50e5e7e73,1546663362710; _ntes_nuid=a6e42f42f62a6885cfb245a50e5e7e73; vinfo_n_f_l_n3=14dc7d14c27e42b0.1.34.1546663363061.1548567289154.1549176394131; UM_distinctid=1681c52358563c-077c8afbdaebad8-143a7540-100200-1681c523586365; __gads=ID=5fe7d3386d1856c9:T=1546663524:S=ALNI_Mb4nIopouscq3fAV-foo5zHXtu3jw; hb_MA-BFF5-63705950A31C_source=cp.study.163.com; mail_psc_fingerprint=12b8e026089881a72506b688d269cfda; Province=0; City=0; usertrack=ezq0o1xF23YwSdniI3xpAg==; NNSSPID=ceff2dd2db5c4497b308fb0feab0a16d; ne_analysis_trace_id=1549176348973; s_n_f_l_n3=14dc7d14c27e42b01549110593684; _antanalysis_s_id=1549110647552; NTES_SESS=v24UIcTIQBgw9lOLD1E5Y72JTzoDmsqOH0DhZYhfB.Qe.6Js.4TFkUJCi8zBkK6IlursgxxIw8oyOTANs9oLWilDD2uoLUftfP_LY5wa5GtUP29SV6AADiDOnYvbOod01Kx0WGaN.jyE1hct5CMbZ72l8AjC7.gDcjDlHuu21Z_SNbugkuflI.wNjolEikGLYcU9zNTPtPIyU; S_INFO=1549193437|0|2&70##|arivnhuang#arivnhuang@vip.163.com; P_INFO=arivnhuang@163.com|1549193437|0|mail163|00&99|gud&1546868878&study#gud&440300#10#0#0|&0||arivnhuang@163.com; mail_upx=t4gd.mail.163.com|t1gd.mail.163.com|t2gd.mail.163.com|t3gd.mail.163.com|t2bj.mail.163.com|t3bj.mail.163.com|t4bj.mail.163.com|t1bj.mail.163.com; mail_upx_nf=; mail_idc=; Coremail=987b4db0582ea%bAzIoQAhJvPRAomttbhhZapEEkiIEEcz%g3a25.mail.163.com; MAIL_MISC=arivnhuang#arivnhuang@vip.163.com; cm_last_info=dT1hcml2bmh1YW5nJTQwMTYzLmNvbSZkPWh0dHBzJTNBJTJGJTJGbWFpbC4xNjMuY29tJTJGanM2JTJGbWFpbi5qc3AlM0ZzaWQlM0RiQXpJb1FBaEp2UFJBb210dGJoaFphcEVFa2lJRUVjeiZzPWJBeklvUUFoSnZQUkFvbXR0YmhoWmFwRUVraUlFRWN6Jmg9aHR0cHMlM0ElMkYlMkZtYWlsLjE2My5jb20lMkZqczYlMkZtYWluLmpzcCUzRnNpZCUzRGJBeklvUUFoSnZQUkFvbXR0YmhoWmFwRUVraUlFRWN6Jnc9aHR0cHMlM0ElMkYlMkZtYWlsLjE2My5jb20mbD0tMSZ0PS0xJmFzPXRydWU=; MAIL_SESS=v24UIcTIQBgw9lOLD1E5Y72JTzoDmsqOH0DhZYhfB.Qe.6Js.4TFkUJCi8zBkK6IlursgxxIw8oyOTANs9oLWilDD2uoLUftfP_LY5wa5GtUP29SV6AADiDOnYvbOod01Kx0WGaN.jyE1hct5CMbZ72l8AjC7.gDcjDlHuu21Z_SNbugkuflI.wNjolEikGLYcU9zNTPtPIyU; MAIL_SINFO=1549193437|0|2&70##|arivnhuang#arivnhuang@vip.163.com; MAIL_PINFO=arivnhuang@163.com|1549193437|0|mail163|00&99|gud&1546868878&study#gud&440300#10#0#0|&0||arivnhuang@163.com; secu_info=1; mail_entry_sess=094fcd32f180436f814d019bf2f5fb228a56e60b9093b1387c31f785e7a9cb24407b006d97a01c7482850c4038132b507b3872c7cc276f04c77f2421407a21afa8b2a5f060170251c32bc6d7cdd0a31e4a8ab6fb0d7d70ac4be60338ce1da496e9ff8aab7a553b40f3632f157d544b99891c2061ec1d608ba71dbd0cecc510d99875de12ffb02ab89b164dd80a786af845ee1e82f38efb95920f47501109a1d85834a67e14ea8e33c6279fa245b3aebbde150a3c8e55757fce40215b53dcedb9; mail_style=js6; mail_uid=arivnhuang@163.com; mail_host=mail.163.com
Cookie作为请求的一部分从浏览器发送到服务器端,所以我们希望Cookie的值越小越好,因为Cookie的值越小,传输的时间就会越少。
那么如何计算Cookie的值呢?计算Cookie的大小就是按所包含的字符所占的字节数来计算,对我们国内来说一般只有两类字符,一是英文字符;二是中文字符。对于英文字符一般都是占一个字节,对于中文编码的字符,UTF8一个中文占3个字节,GB2312一个中文占2个字节,其他ASCII编码都是一个字节。
当然在浏览器关于Cookie数据管理中也可以看到每个Cookie的大小,如图为FireFox浏览器中关于Cookie管理的信息。
对于Cookie的使用,浏览器会有一定的限制,一般情况下每个Cookie大小不能超过4KB即4096个字节,并且每个域名所允许的Cookie数也会有限制,下面是一些常见浏览器对Cookie的限制,见表。
一般情况下对Cookie优化的方法有以下几种:
-
删除不必要的Cookie,将一些不需要的Cookie可以禁用或直接删除。
-
减小Cookie的大小,尽量将Cookie的大小减小到最小化,这样可以减少HTTP请求报文的大小。
-
为Cookie设置一个合适的过期时间。
-
通过使用不同的domain来减少cookie的使用,Cookie有时候在访问一些资源时,如JS、CSS等,会出现很多一些多余的Cookie,这样可以使用domain来存储这些静态的资源,这样不需要每次发送多余的Cookie到服务器端