mirror of
https://github.com/wangdoc/javascript-tutorial.git
synced 2025-12-24 11:14:21 +08:00
docs(bom/cookie): edit cookie
This commit is contained in:
@@ -4,13 +4,15 @@
|
||||
|
||||
Cookie 是服务器保存在浏览器的一小段文本信息,一般大小不能超过4KB。浏览器每次向服务器发出请求,就会自动附上这段信息。
|
||||
|
||||
Cookie 主要保存状态信息,以下是一些主要用途。
|
||||
HTTP 协议不带有状态,有些请求需要区分状态,就通过 Cookie 附带字符串,让服务器返回不一样的回应。举例来说,用户登录以后,服务器往往会在网站上留下一个 Cookie,记录用户编号(比如`id=1234`),以后每次浏览器向服务器请求数据,就会带上这个字符串,服务器从而知道是谁在请求,应该回应什么内容。
|
||||
|
||||
- 对话(session)管理:保存登录、购物车等需要记录的信息。
|
||||
Cookie 的目的就是区分用户,以及放置状态信息,它的使用场景主要如下。
|
||||
|
||||
- 对话(session)管理:保存登录状态、购物车等需要记录的信息。
|
||||
- 个性化信息:保存用户的偏好,比如网页的字体大小、背景色等等。
|
||||
- 追踪用户:记录和分析用户行为。
|
||||
|
||||
Cookie 不是一种理想的客户端储存机制。它的容量很小(4KB),缺乏数据操作接口,而且会影响性能。客户端储存应该使用 Web storage API 和 IndexedDB。只有那些每次请求都需要让服务器知道的信息,才应该放在 Cookie 里面。
|
||||
Cookie 不是一种理想的客户端存储机制。它的容量很小(4KB),缺乏数据操作接口,而且会影响性能。客户端存储建议使用 Web storage API 和 IndexedDB。只有那些每次请求都需要让服务器知道的信息,才应该放在 Cookie 里面。
|
||||
|
||||
每个 Cookie 都有以下几方面的元数据。
|
||||
|
||||
@@ -20,7 +22,9 @@ Cookie 不是一种理想的客户端储存机制。它的容量很小(4KB)
|
||||
- 所属域名(默认为当前域名)
|
||||
- 生效的路径(默认为当前网址)
|
||||
|
||||
举例来说,用户访问网址`www.example.com`,服务器在浏览器写入一个 Cookie。这个 Cookie 的所属域名为`www.example.com`,生效路径为根路径`/`。如果 Cookie 的生效路径设为`/forums`,那么这个 Cookie 只有在访问`www.example.com/forums`及其子路径时才有效。以后,浏览器访问某个路径之前,就会找出对该域名和路径有效,并且还没有到期的 Cookie,一起发送给服务器。
|
||||
举例来说,用户访问网址`www.example.com`,服务器在浏览器写入一个 Cookie。这个 Cookie 的所属域名为`www.example.com`,生效路径为根路径`/`。
|
||||
|
||||
如果 Cookie 的生效路径设为`/forums`,那么这个 Cookie 只有在访问`www.example.com/forums`及其子路径时才有效。以后,浏览器访问某个路径之前,就会找出对该域名和路径有效,并且还没有到期的 Cookie,一起发送给服务器。
|
||||
|
||||
用户可以设置浏览器不接受 Cookie,也可以设置不向服务器发送 Cookie。`window.navigator.cookieEnabled`属性返回一个布尔值,表示浏览器是否打开 Cookie 功能。
|
||||
|
||||
@@ -34,9 +38,17 @@ window.navigator.cookieEnabled // true
|
||||
document.cookie // "id=foo;key=bar"
|
||||
```
|
||||
|
||||
不同浏览器对 Cookie 数量和大小的限制,是不一样的。一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过4KB。超过限制以后,Cookie 将被忽略,不会被设置。
|
||||
不同浏览器对 Cookie 数量和大小的限制,是不一样的。一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过 4KB。超过限制以后,Cookie 将被忽略,不会被设置。
|
||||
|
||||
浏览器的同源政策规定,两个网址只要域名相同,就可以共享 Cookie(参见《同源政策》一章)。注意,这里不要求协议相同。也就是说,`http://example.com`设置的 Cookie,可以被`https://example.com`读取。
|
||||
Cookie 是按照域名区分的,`foo.com`只能读取自己放置的 Cookie,无法读取其他网站(比如`bar.com`)放置的 Cookie。一般情况下,一级域名也不能读取二级域名留下的 Cookie,比如`mydomain.com`不能读取`subdomain.mydomain.com`设置的 Cookie。但是有一个例外,设置 Cookie 的时候(不管是一级域名设置的,还是二级域名设置的),明确将`domain`属性设为一级域名,则这个域名下面的各级域名可以共享这个 Cookie。
|
||||
|
||||
```http
|
||||
Set-Cookie: name=value; domain=mydomain.com
|
||||
```
|
||||
|
||||
上面示例中,设置 Cookie 时,`domain`属性设为`mydomain.com`,那么各级的子域名和一级域名都可以读取这个 Cookie。
|
||||
|
||||
注意,区分 Cookie 时不考虑协议和端口。也就是说,`http://example.com`设置的 Cookie,可以被`https://example.com`或`http://example.com:8080`读取。
|
||||
|
||||
## Cookie 与 HTTP 协议
|
||||
|
||||
@@ -197,7 +209,7 @@ Set-Cookie:id=a3fWa;
|
||||
```
|
||||
|
||||
用户一旦被诱骗发送这个表单,银行网站就会收到带有正确 Cookie 的请求。为了防止这种攻击,官网的表单一般都带有一个随机 token,官网服务器通过验证这个随机 token,确认是否为真实请求。
|
||||
|
||||
|
||||
```html
|
||||
<form action="your-bank.com/transfer" method="POST">
|
||||
<input type="hidden" name="token" value="dad3weg34">
|
||||
@@ -206,7 +218,7 @@ Set-Cookie:id=a3fWa;
|
||||
```
|
||||
|
||||
这种第三方网站引导而附带发送的 Cookie,就称为第三方 Cookie。它除了用于 CSRF 攻击,还可以用于用户追踪。比如,Facebook 在第三方网站插入一张看不见的图片。
|
||||
|
||||
|
||||
```html
|
||||
<img src="facebook.com" style="visibility:hidden;">
|
||||
```
|
||||
|
||||
@@ -89,10 +89,10 @@ var allCookie = document.cookie;
|
||||
|
||||
注意,这种方法只适用于 Cookie 和 iframe 窗口,LocalStorage 和 IndexedDB 无法通过这种方法,规避同源政策,而要使用下文介绍 PostMessage API。
|
||||
|
||||
另外,服务器也可以在设置 Cookie 的时候,指定 Cookie 的所属域名为一级域名,比如`.example.com`。
|
||||
另外,服务器也可以在设置 Cookie 的时候,指定 Cookie 的所属域名为一级域名,比如`example.com`。
|
||||
|
||||
```http
|
||||
Set-Cookie: key=value; domain=.example.com; path=/
|
||||
Set-Cookie: key=value; domain=example.com; path=/
|
||||
```
|
||||
|
||||
这样的话,二级域名和三级域名不用做任何设置,都可以读取这个 Cookie。
|
||||
|
||||
Reference in New Issue
Block a user