HTTP cookie

一、简单介绍

1.    HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

2.   Cookie主要用于以下三个方面:

(1)会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)

记录用户的登录状态是cookie最常用的用途。通常web服务器会在用户登录成功后下发一个签名来标记session的有效性,这样免去了用户多次认证和登录网站。

记录用户的访问状态,例如导航啊,用户的注册流程啊。

(2)个性化设置(如用户自定义设置、主题等)

Cookie也经常用来记忆用户相关的信息,以方便用户在使用和自己相关的站点服务。

Cookie也被用来记忆用户自定义的一些功能。用户在设置自定义特征的时候,仅仅是保存在用户的浏览器中,在下一次访问的时候服务器会根据用户本地的cookie来表现用户的设置。

(3)浏览器行为跟踪(如跟踪分析用户行为等)

记录用户再浏览器上的操作。

二、cookie类别

1.  Session Cookie(会话期Cookie)

会话期Cookie是最简单的Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期Cookie不需要指定过期时间(Expires)或者有效期(Max-Age)。需要注意的是,有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期Cookie也会被保留下来,就好像浏览器从来没有关闭一样。

2.Persistent Cookie(持久型cookie)

持久型cookie是可以长期在用户回话中存在的。可以指定一个特定的过期时间Expires或者有效期Max-Age

例如:Set-Cookie:id=a3fwa;Expires=Wed,11 Nov 2018 21:13:00 GMT;

设定的日期和时间只与客户端相关,与服务器无关。

3.Secure cookie(安全cookie)

标记为Secure的cookie只能通过被https协议机密后的请求发送给服务端。但是敏感信息还是最好不要通过cookie传输,因为他本身有一定的不安全性,即使标记了也没有安全保障。从Chrome52和Firefox52以后,http站点不能使用secure标记的cookie。

4.HttpOnly Cookie

设置成httponly的cookie只能在http或者https上传递,也就是说通过JavaScript中的document.cookie无法访问带有httponly标记的cookie,这些cookie只能发送给服务端。如果包含服务端session信息的cookie不想被JavaScript调用,就应该设置上这个标记。

例如:Set-Cookie:id=a3fwa;Expires=Wed,11 Nov 2018 21:13:00 GMT;Secure;HttpOnly

5.3rd-party cookie(第三方cookie)

每个Cookie都会有与之关联的域(Domain),如果Cookie的域和页面的域相同,那么我们称这个Cookie为第一方Cookiefirst-party cookie),如果Cookie的域和页面的域不同,则称之为第三方Cookiethird-party cookie.)。一个页面包含图片或存放在其他域上的资源(如图片广告)时,第一方的Cookie也只会发送给设置它们的服务器。通过第三方组件发送的第三方Cookie主要用于广告和网络追踪。

6.Super Cookie (超级cookie)

超级cookie是设置公共域名前缀上的cookie。通常a.b.com的cookie可以设置在a.b.com和b.com,而不允许设置在.com上。

7.Zombie Cookie(僵尸Cookie或者删不掉的cookie)

Cookie的一个极端使用例子是僵尸Cookie(或称之为“删不掉的Cookie”),这类Cookie较难以删除,甚至删除之后会自动重建。它们一般是使用Web storage API、Flash本地共享对象或者其他技术手段来达到的。例如flash的share object,html5的local storages等,当用户删除cookie后,自动从其他本地存储里读取出cookie的备份,并重新种植。

三、Set-Cookie字段的属性

1.NAME=VALUE:指定cookie的名称和值,名称大小写不敏感,值必须经过URL编码。

2.domain=域名:ookie的有效域名,所有向该域发送的请求中都会包括这个cookie信息,这个值可以包含子域(如:www.baidu.com,那么这个cookie的有效域就是www.baidu.com),也可以不包含子域(如:.baidu.com,那么这个cookie对所有的baidu.com的子域都有效),如果没有指定这个值,它的默认值为设置cookie的那个域。正是因为这一限制,cookie是不能跨域的(www.qq.com不能访问到www.baidu.com下的cookie)

3.path=路径:用于指定向域中的哪个路径发送请求时,应该带上这个cookie,如果不指定,默认为当前目录及其子目录有效。例如,你可以指定cookie只有从www.baidu.com/one/中才能访问,那么www.baidu.com的页面就不能发送cookie。

4.expires=Date:cookie的有效时间(即:何时应该停止向服务端发送这个cookie),默认情况下浏览器会话结束就会删除所有的cookie,不过可以自己设置cookie的有效时间。如果将cookie的有效时间设置为一个过去的时间,那么这个cookie会立即被删除。

Expires的规定格式是:“Wdy,DD-Mon-YYYY HH:MM:SS GMT”。

5.Secure:仅在HTTPS安全通信时才会发送cookie,没有value字段。

6..HttpOnly:该cookie不能被脚本访问,只有在HTTP协议下使用,没有value字段。

四、种植cookie

Cookie是web server下发给浏览器的任意的一段文本,在后续的http 请求中,浏览器会将cookie带回给Web Server。同时在浏览器允许脚本执行的情况下,Cookie是可以被JavaScript等脚本设置的。

当服务器收到HTTP请求时,服务器可以在响应头里面添加一个Set-Cookie选项。浏览器收到响应后通常会保存下Cookie,之后对该服务器每一次请求中都通过Cookie请求头部将Cookie信息发送给服务器。另外,Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。

1.访问的方式:

当浏览器向服务器进行请求的时候,服务器会使用Set-Cookie响应头部向浏览器发送信息:

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

然后对该服务器再次发起请求,浏览器都会将之前保存的cookie通过Cookie请求头部再次发送给服务器:

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

2.脚本的方式:

浏览器中的脚本语言可以设置cookie,例如JavaScript可以用    document.cookie="name=value";

也可以利用document.cookie来访问没有httponly标记的cookie。

在浏览器地址栏输入:javascript:alert(document.cookie)可以看到所有cookie

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值