HTTP 是一种无状态协议。如以下场景,在爬虫时非常常见。
- 访问权限页面,无法访问,请先登录。
- 登录。
- 访问权限页面,无法访问,请先登录。
而在 HTTP 中,Cookie 使保持状态成为可能。
- 访问权限页面,无法访问,请先登录。
- 登录
- 访问权限页面,携带 Cookie 可访问。
Cookie,为曲奇饼干的意思,因此 Cookie 的标识,常为一个曲奇饼干🍪。
Set-Cookie/Cookie 头部
Cookie 既可以在浏览器进行创建,也可以在服务器进行配置。在服务器中,通过 Set-Cookie 响应头进行配置。
Set-Cookie: a=3
Set-Cookie: b=4
而在浏览器中的后续访问中,如果该请求是同域名的,将会自动携带 Cookie。
Cookie: a=3; b=4
通过 curl 以及 echo.apifox.com 示例如下:
// 请求该地址,将自动配置 a=3 的 cookie,并 302 重定向到 /cookies 页面
// 可从第二个请求看到,并没有自动携带 Cookie,因为 Cookie 需要浏览器进行管理
$ curl --head -L https://echo.apifox.com/cookies/set/a/3
HTTP/2 302
date: Mon, 31 Oct 2022 06:54:57 GMT
content-type: text/html; charset=utf-8
content-length: 223
server: gunicorn/19.9.0
location: /cookies
set-cookie: a=3; Path=/
access-control-allow-origin: *
access-control-allow-credentials: true
HTTP/2 200
date: Mon, 31 Oct 2022 06:54:58 GMT
content-type: application/json
content-length: 20
server: gunicorn/19.9.0
access-control-allow-origin: *
access-control-allow-credentials: true
因为 HTTP 无状态的协议,在 curl 中,同样无法复用 Cookie,而在浏览器中方能自动携带 Cookie。
在浏览器中打开地址 echo.apifox.com/cookies/set… 进行测试。
但是,在 curl 中,可手动指定 Cookie 字段进行发送:
$ curl 'https://echo.apifox.com/cookies' -H 'cookie: a=3; b=4'
{
"cookies": {
"a": "3",
"b": "4"
}
}
浏览器控制台
在浏览器控制台,网络面板,每一条请求的详细信息中,可查看其发送和接收的 Cookie。
在浏览器控制台,Application 面板,Storage/Cookies 选项卡中,可对 Cookie 进行增加删除以及编辑。
实例
我在 Apifox 中演示了关于 Cookie 的应用。见文档。
作业
- 服务器端如何配置携带浏览器的 Cookie
- 浏览器发送 Cookie 时,应如何发送
- 通过 curl/httpbin 模拟发送 Cookie