Abo

cookie是什么?

Cookies现在经常被大家提到,那么到底什么是Cookies,它有什么作用呢?

图解HTTP是一本好书(lll¬ω¬)~

wallhaven-839vgo

东山大发好~

知识简介

什么是Cookie ?

1
Cookies是数据包,可以让网页具有记忆功能,在某台电脑上记忆一定的信息。Cookies的工作原理是,第一次由服务器端写入到客户端的系统中。以后每次访问这个网页,都是先由客户端将Cookies发送到服务器端,再由服务器端进行判断,然后再产生HTML代码返回给客户端。通过这个原理服务器就可以根据不同用户产生不同cookies文件,这样当该用户再次访问同一个站点时就可以根据不同的cookies文件返回不同的页面信息了。
  1. Cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据。

  2. 浏览器需要保存这段数据,不得轻易删除。

  3. 此后每次浏览器访问该服务器,都必须带上这段数据。

Cookie 就是这么简单,这就是 Web 开发里 Cookie 的含义

1
2
3
4
通俗点讲:Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。

当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等
Cookies文件是在无声无息中伴随浏览器进入我们本地硬盘的,当我们浏览某个站点时,该站点很可能将记录我们隐私的cookies文件上传到本地硬盘。那么我们如何防范阻止cookies文件泄露我们的隐私呢?实际上我们可以通过浏览器设置不容许计算机接收cookies文件即可。

问题1:「Cookie是什么?」

答:Cookie是服务器给客户端发的一个「通信证」。

无论谁访问服务器时都必须携带自己的「通行证」,这样服务器就可以通过「通行证」确定用户身份了。

注:Cookie有不可跨域名性。即浏览器不会将http://baidu.com的cookie发送给http://google.com

问题2:「Cookie有属性吗?都是什么?」

答:Cookie有属性,它们是:

1. String「name」 :该Cookie的「名称」。Cookie一旦创建,名称便不可更改。

2. Object「value」:该Cookie的「值」

3. Int「maxAge」:该Cookie的「失效时间」,单位秒

注:如果为正数,则该Cookie在maxAge秒后失效。如果为负数,则该Cookie为临时Cookie,关闭浏览器即失效。如果为0,表示删除该Cookie。默认为-1,即关闭浏览器即失效

4. Boolean「secure」:「是否仅使用安全协议传输」,默认为false

5. String「path」:该Cookie的「使用路径」

注:如果设置为“/shit/”,则只有“http:http://xxx.xxx.xxx/shit”的程序可以访问该Cookie。如果设置为“/”,则本域名下的程序都可以访问Cookie,注意最后一个字符必须为“/”。

6. String「domain」:「可以访问该Cookie的域名」。

注:如果设置为”.http://google.com“,则所有以”http://google.com“结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。

7. String「comment」:该Cookie的「用处说明」,用来再浏览器显示Cookie信息的时候显示该说明。

8. Int「version」:该Cookie的「版本号」。0表示遵循Netspace的Cookie规范,1表示遵循W3C的RFC2109规范。

问题3:「怎么修改Cookie?怎么删除Cookie?」

答:

  • 修改:创建同名Cookie,覆盖原来的Cookie
  • 删除:创建同名Cookie,并将maxAge属性设置为0

问题4:「Cookie有什么用?」

答:挺多的,列举几个。

  • 自动登陆:第一次登陆成功后,给你的电脑发送一个存有你用户名的Cookie。于是,在Cookie失效之前,你每一次登陆服务器,服务器都会直接读取你的Cookie中的用户名,然后返回给你一个登陆成功的页面。挺危险的是吧,所以通常会有一些加密手段以及借助Session的帮助。
  • 京东未登录时的购物车:意思差不多,诸位应该明白。

问题5:「Session是什么?」

答:Session是「你去理发店办卡后,店家记录你剩余次数的那个大本子」。它保存在服务器端,不负责记录你还能剪几次,但是它会把客户端的某种信息保存在服务器上。当客户端下一次来访问时,根据信息确定客户身份即可。

问题6:「Session保存在哪?」

答:Session保存在服务器端的内存中。

问题7:「Session的有效期?」

答:由「最后访问时刻」和「超时时段」构成。当「当前时刻」 - 「超时时段」>「最后访问时刻」时,Session就失效了。

在Tomcat中的「超时时段」为20分钟。

Cookie 一般有两个作用。

第一个作用是识别用户身份。

比如用户 A 用浏览器访问了 http://a.com,那么 http://a.com 的服务器就会立刻给 A 返回一段数据「uid=1」(这就是 Cookie)。当 A 再次访问 http://a.com 的其他页面时,就会附带上「uid=1」这段数据。

同理,用户 B 用浏览器访问 http://a.com 时,http://a.com 发现 B 没有附带 uid 数据,就给 B 分配了一个新的 uid,为2,然后返回给 B 一段数据「uid=2」。B 之后访问 http://a.com 的时候,就会一直带上「uid=2」这段数据。

借此,http://a.com 的服务器就能区分 A 和 B 两个用户了。

第二个作用是记录历史。

假设 http://a.com 是一个购物网站,当 A 在上面将商品 A1 、A2 加入购物车时,JS 可以改写 Cookie,改为「uid=1; cart=A1,A2」,表示购物车里有 A1 和 A2 两样商品了。

这样一来,当用户关闭网页,过三天再打开网页的时候,依然可以看到 A1、A2 躺在购物车里,因为浏览器并不会无缘无故地删除这个 Cookie。

借此,就达到里记录用户操作历史的目的了。

(上面的例子只是为了让大家了解 Cookie 的作用而构想出来的,实际的网站使用 Cookie 时会更谨慎一些。)

深入认识Cookie跟Session

使用Cookie来管理状态

HTTP是无状态协议,所以它不能以状态来区分和管理请求和响应。也就是说,无法根据之前的状态进行本次的请求处理。不可否认,无状态协议当然也有它的优点。由于不必保存状态,自然可减少服务器的CPU 及内存资源的消耗。从另一侧面来说,也正是因为HTTP 协议本身是非常简单的,所以才会被应用在各种场景里。

img

我们登录淘宝的时候首先要登录,我们看到了一个商品点进去,进行了页面跳转/刷新,按照HTTP的无状态协议岂不是又要登录一次?
所以为了解决这个问题,Cookie诞生了,在保留无状态协议这个特征的同时又要解决类似记录状态的矛盾问题。Cookie 技术通过在请求和响应报文中写入Cookie 信息来控制客户端的状态。
Cookie 会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie 值后发送出去。
服务器端发现客户端发送过来的Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

(以下图来自图解HTTP,值得入手实体版)

  • 没有Cookie信息状态下的请求

    img

  • 第2次以后(存有Cookie信息状态)的请求

    img

    HTTP 请求报文和响应报文的内容如下(数字和图中对应)。

    ①请求报文(没有Cookie 信息的状态)

    1
    2
    3
    GET /reader/ HTTP/1.1
    Host: hackr.jp
    *首部字段内没有Cookie的相关信息

    ②响应报文(服务器端生成Cookie 信息)

    1
    2
    3
    4
    5
    HTTP/1.1 200 OK
    Date: Thu, 12 Jul 2012 07:12:20 GMT
    Server: Apache
    <Set-Cookie: sid=1342077140226724; path=/; expires=Wed,10-Oct-12 07:12:20 GMT>
    Content-Type: text/plain; charset=UTF-8

    ③请求报文(自动发送保存着的Cookie 信息)

    1
    2
    3
    GET /image/ HTTP/1.1
    Host: hackr.jp
    Cookie: sid=1342077140226724

    关于Cookie的首部字段