1、介绍
http本身是无状态的,但实际业务中往往需要http请求表明请求者的身份和状态等信息,cookie是该问题的一种解决方案。(另外的包括session、token、浏览器localstorage)
- cookie本质是一个对象,具有name、value等属性。
- 一般由服务端创建,然后基于响应头部的set-cookie字段发送给浏览器。
- 浏览器接收cookie后,保存
- 当浏览器再次待发送目标域的请求时,会基于请求头部的cookie字段携带保存的cookie
- 服务端接收请求,读取头部字段的cookie,以获取状态信息
2、cookie属性
默认值,是如果一个cookie只设置部分属性,那么浏览器会自动将其余属性设置为默认值。
(1)name
cookie的名称
(2)value
cookie的值
(3)domain
作用的域名范围,在对应域名及子域名的请求时,携带cookie
(4)path
作用的路径范围,在对应路径及子路径的请求时,携带cookie
(5)expires
- 如果未设置,则该cookie属于会话cookie,在浏览器关闭时销毁
- 如果设置了一个还未到达的时间点,则该cookie为存储cookie,直到到达限制时间销毁。关闭浏览器再开启,无影响
- 如果设置了一个过期的时间,相当于告诉浏览器直接删除该cookie
(6)HttpOnly
具有该标志的cookie只能由请求携带,而不能被js读取
(7)Secure
具有该标志的cookie只能由https请求携带,而http无法携带
(8)samesite
- strict:严格,完全禁止跨域携带cookie
- Lax: 大多数情况下禁止跨域携带cookie,除非导航到目标网址的GET请求(链接、预加载、GET表单)
SameSite属性的默认SameSite=Lax 【该操作适用于2019年2月4号谷歌发布Chrome 80稳定版之后的版本】
请求类型 示例 正常情况 Lax
链接 <a href="..."></a> 发送 Cookie 发送 Cookie
预加载 <link rel="prerender" href="..."/> 发送 Cookie 发送 Cookie
GET 表单 <form method="GET" action="..."> 发送 Cookie 发送 Cookie
POST 表单 <form method="POST" action="..."> 发送 Cookie 不发送
iframe <iframe src="..."></iframe> 发送 Cookie 不发送
AJAX $.get("...") 发送 Cookie 不发送
Image <img src="..."> 发送 Cookie 不发送
- None: 没有限制
必须同时设置Secure
属性(Cookie 只能通过 HTTPS 协议发送),否则无效。 【该操作适用于2019年2月4号谷歌发布Chrome 80稳定版之后的版本】
3、Set-Cookie字段
向浏览器设置服务端创建的cookie,一个cookie对应一个Set-Cookie字段,一个响应中可以同时有多个Set-Cookie字段。
set-cookie: test_cookie=CheckForPermission; expires=Thu, 20-Oct-2022 06:51:46 GMT; path=/; domain=.doubleclick.net; Secure; HttpOnly; SameSite=none
set-cookie: test_cookie=CheckForPermission; expires=Thu, 20-Oct-2022 06:51:46 GMT; path=/; domain=.doubleclick.net; Secure; SameSite=none
4、浏览器存储
所有浏览器都支持查看保存的cookie,F12》应用程序》选择cookie,并且可以直接进行操作。
5、Cookie字段
向服务端表示符合的cookie。
只有满足各属性完全符合才会携带,在请求中只有一个Cookie字段,多个cookie之间用;分割,cookie只携带name和value属性,用=连接。
Cookie: wordpress=rofdd; wp-settings-time-1=16662dd; wp-settings-1=abc
6、浏览器与cookie安全策略
7、cookie长度限制
COOKIE长度限制总结 - 简书 (jianshu.com)
- http报文最大长度限制
- 浏览器能够同时存储的cookie条数限制
- 单个cookie所能够包含的字节限制
8、其它
- html设置cookie
- js读取和设置cookie
- java读取和设置cookie
- php读取和设置cookie