docs(bom/cookie): edit cookie

This commit is contained in:
ruanyf
2021-09-19 19:42:50 +08:00
parent 53ae0a3d6b
commit b924c7d95c
2 changed files with 22 additions and 10 deletions

View File

@@ -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;">
```

View File

@@ -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。