客户端存储技术——Cookie

413 阅读4分钟

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

客户端存储技术——Cookie

HTTP是无状态的,即它不会记住用户的操作,这会让我们在记住用户状态(如登录信息、个人偏好等)等场景被限制,因此,cookie出现了,弥补HTTP在状态管理上的不足。

一、Cookie的作用

应用场景:对表单信息做维护,用户刷新页面不丢失;存储本次浏览记录,看过的页面不怕找不到;

Cookie本质上就是浏览器里面存储的一个很小的文本文件,内部以键值对的方式来存储;向同一个域名下发送请求,都会携带相同的Cookie,服务器拿到Cookie进行解析,便能拿到客户端的状态;

服务器在响应HTTP请求时,通过发送Set-CookieHTTP头部包含会话信息。例如下面这个包含Cookie的HTTP响应:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value
Other-header: other-header-value

这个HTTP响应会设置一个name=value的cookie,名和值在发送的时候都会经过URL编码。浏览器会存储这些会话信息,并在之后的每个请求中都会通过HTTP头部cookie再将它们发回服务器,比如:

GET /index.jsl HTTP/1.1
Cookie: name=value
other-header: other-header-value

这些发送回服务器的额外信息可用于唯一标识发送请求的客户端。简单讲,就是服务器在响应的时候通过Set-Cookie把会话信息在浏览器中保存下来了;

URL编码:一种浏览器用来打包表单输入的格式。比如在请求地址中http:localhost:3000?id=1&name=麦咭,那么这个URL?后面的参数都是要经过编码才能传输;对中文会使用utf-8字符集来进行编码;

二、cookie的构成及实现

域、路径、过期时间和secure标志用于告诉浏览器生命情况下应该在请求中包含cookie,这些参数并不会随着请求发送给服务器,实际发送的只有cookie的名/值对。

cookie.jpg

在设置值时,可以通过document.cookie属性设置新的cookie字符串。这个字符串在解析后会添加到原有cookie中。设置document.cookie不会覆盖之前存在的任何cookie,除非设置了已有的cookie。设置cookie的格式如下,与Set-Cookie头部的格式一样:

document.cookie = "key=value; expires=expiration_time; path=domain_path; domain=domain_name; secure";

各个参数通过分号隔开;例如:

document.cookie = "name=mannqo";

这行代码会创建一个name=mannqo的会话cookie。这个cookie在每次客户端向服务器发送请求时都会被带上,在浏览器关闭时就会被删除。虽然这样可以直接设置,因为不需要再名称或值中编码任何字符,但是最好还是使用encodeURIComponent()对key和value进行编码;比如:

document.cookie = encodeURIComponent("name") + "=" + encodeURIComponent("mannqo");

要为创建的cookie指定额外的信息,只要像Set-Cookie头部一样直接再后面追加相同格式的字符串即可;

三、子cookie

子cookie在这里只做一个简单的介绍;

  • 子cookie是在单个cookie存储的小块数据,本质上是使用cookie的值在单个cookie中存储多个名/值对;最常用的值cookie模式:name=name1=value1&name2=value2&name3=value3
  • 子cookie的格式类似于查询字符串,这些值可以存储为单个cookie,而不用单独存储为自己的名/值对。结果就是要网站或Web应用程序能够在单域cookie数限制下存储更多的结构化数据。

四、使用cookie的注意事项

有一种叫HTTP-only的cookie,可以在浏览器或服务器设置,但是只能在服务器上读取,这是因为JavaScript无法取得这种cookie的值。

  • cookie是与特定域绑定的。设置cookie后,它会与请求一起发送到它创建的域。这个限制能保证cookie中存储的信息只对被认可的接收者开放,不被其他域访问。
  • cookie只能存储少量信息,如果cookie总数超过了单个域的上限,浏览器就会删除之前设置的cookie,为避免不确定的结果,最好不要超出限制;
  • cookie请求每次都会携带上完整的cookie,随着请求次数的增多会造成性能浪费;
  • 安全缺陷。以纯文本的形式在浏览器和服务器中传递,容易被非法截获和篡改;

注意:不要在cookie种存储重要或敏感的信息。cookie数据不是保存在安全的环境中,因此任何人都可能获得,应该避免把一些私人信息保存在cookie中。