4
4
5
5
Cookie 是服务器保存在浏览器的一小段文本信息,一般大小不能超过4KB。浏览器每次向服务器发出请求,就会自动附上这段信息。
6
6
7
- Cookie 主要保存状态信息,以下是一些主要用途 。
7
+ HTTP 协议不带有状态,有些请求需要区分状态,就通过 Cookie 附带字符串,让服务器返回不一样的回应。举例来说,用户登录以后,服务器往往会在网站上留下一个 Cookie,记录用户编号(比如 ` id=1234 ` ),以后每次浏览器向服务器请求数据,就会带上这个字符串,服务器从而知道是谁在请求,应该回应什么内容 。
8
8
9
- - 对话(session)管理:保存登录、购物车等需要记录的信息。
9
+ Cookie 的目的就是区分用户,以及放置状态信息,它的使用场景主要如下。
10
+
11
+ - 对话(session)管理:保存登录状态、购物车等需要记录的信息。
10
12
- 个性化信息:保存用户的偏好,比如网页的字体大小、背景色等等。
11
13
- 追踪用户:记录和分析用户行为。
12
14
13
- Cookie 不是一种理想的客户端储存机制 。它的容量很小(4KB),缺乏数据操作接口,而且会影响性能。客户端储存应该使用 Web storage API 和 IndexedDB。只有那些每次请求都需要让服务器知道的信息,才应该放在 Cookie 里面。
15
+ Cookie 不是一种理想的客户端存储机制 。它的容量很小(4KB),缺乏数据操作接口,而且会影响性能。客户端存储建议使用 Web storage API 和 IndexedDB。只有那些每次请求都需要让服务器知道的信息,才应该放在 Cookie 里面。
14
16
15
17
每个 Cookie 都有以下几方面的元数据。
16
18
@@ -20,7 +22,9 @@ Cookie 不是一种理想的客户端储存机制。它的容量很小(4KB)
20
22
- 所属域名(默认为当前域名)
21
23
- 生效的路径(默认为当前网址)
22
24
23
- 举例来说,用户访问网址` www.example.com ` ,服务器在浏览器写入一个 Cookie。这个 Cookie 的所属域名为` www.example.com ` ,生效路径为根路径` / ` 。如果 Cookie 的生效路径设为` /forums ` ,那么这个 Cookie 只有在访问` www.example.com/forums ` 及其子路径时才有效。以后,浏览器访问某个路径之前,就会找出对该域名和路径有效,并且还没有到期的 Cookie,一起发送给服务器。
25
+ 举例来说,用户访问网址` www.example.com ` ,服务器在浏览器写入一个 Cookie。这个 Cookie 的所属域名为` www.example.com ` ,生效路径为根路径` / ` 。
26
+
27
+ 如果 Cookie 的生效路径设为` /forums ` ,那么这个 Cookie 只有在访问` www.example.com/forums ` 及其子路径时才有效。以后,浏览器访问某个路径之前,就会找出对该域名和路径有效,并且还没有到期的 Cookie,一起发送给服务器。
24
28
25
29
用户可以设置浏览器不接受 Cookie,也可以设置不向服务器发送 Cookie。` window.navigator.cookieEnabled ` 属性返回一个布尔值,表示浏览器是否打开 Cookie 功能。
26
30
@@ -34,9 +38,17 @@ window.navigator.cookieEnabled // true
34
38
document .cookie // "id=foo;key=bar"
35
39
```
36
40
37
- 不同浏览器对 Cookie 数量和大小的限制,是不一样的。一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过4KB。超过限制以后,Cookie 将被忽略,不会被设置。
41
+ 不同浏览器对 Cookie 数量和大小的限制,是不一样的。一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过 4KB。超过限制以后,Cookie 将被忽略,不会被设置。
42
+
43
+ Cookie 是按照域名区分的,` foo.com ` 只能读取自己放置的 Cookie,无法读取其他网站(比如` bar.com ` )放置的 Cookie。一般情况下,一级域名也不能读取二级域名留下的 Cookie,比如` mydomain.com ` 不能读取` subdomain.mydomain.com ` 设置的 Cookie。但是有一个例外,设置 Cookie 的时候(不管是一级域名设置的,还是二级域名设置的),明确将` domain ` 属性设为一级域名,则这个域名下面的各级域名可以共享这个 Cookie。
44
+
45
+ ``` http
46
+ Set-Cookie: name=value; domain=mydomain.com
47
+ ```
48
+
49
+ 上面示例中,设置 Cookie 时,` domain ` 属性设为` mydomain.com ` ,那么各级的子域名和一级域名都可以读取这个 Cookie。
38
50
39
- 浏览器的同源政策规定,两个网址只要域名相同,就可以共享 Cookie(参见《同源政策》一章)。注意,这里不要求协议相同。 也就是说,` http://example.com ` 设置的 Cookie,可以被` https://example.com ` 读取。
51
+ 注意,区分 Cookie 时不考虑协议和端口。 也就是说,` http://example.com ` 设置的 Cookie,可以被` https://example.com ` 或 ` http://example.com:8080 ` 读取。
40
52
41
53
## Cookie 与 HTTP 协议
42
54
@@ -197,7 +209,7 @@ Set-Cookie:id=a3fWa;
197
209
</form >
198
210
```
199
211
200
- 用户一旦被诱骗发送这个表单,银行网站就会收到带有正确 Cookie 的请求。为了防止这种攻击,表单一般都带有一个随机 token,告诉服务器这是真实请求 。
212
+ 用户一旦被诱骗发送这个表单,银行网站就会收到带有正确 Cookie 的请求。为了防止这种攻击,官网的表单一般都带有一个随机 token,官网服务器通过验证这个随机 token,确认是否为真实请求 。
201
213
202
214
``` html
203
215
<form action =" your-bank.com/transfer" method =" POST" >
@@ -206,7 +218,7 @@ Set-Cookie:id=a3fWa;
206
218
</form >
207
219
```
208
220
209
- 这种第三方网站引导发出的 Cookie,就称为第三方 Cookie。它除了用于 CSRF 攻击,还可以用于用户追踪。比如,Facebook 在第三方网站插入一张看不见的图片。
221
+ 这种第三方网站引导而附带发送的 Cookie,就称为第三方 Cookie。它除了用于 CSRF 攻击,还可以用于用户追踪。比如,Facebook 在第三方网站插入一张看不见的图片。
210
222
211
223
``` html
212
224
<img src =" facebook.com" style =" visibility :hidden ;" >
0 commit comments