Cookie的属性
Name
一个域名下绑定的cookie,name不能相同,相同的name的值会被覆盖掉
Value
cookie的值必须被URL编码(encodeURI API, decodeURI API)
Domain
Domain 标识指定了哪些主机可以接受Cookie。如果不指定,默认为当前文档的主机(不包含子域名)。如果指定了Domain,则一般包含子域名。
例如,如果设置 Domain=mozilla.org,则Cookie也包含在子域名中(如developer.mozilla.org)。
关于域名可以查看这篇文章工程师最容易搞错的域名知识
Path
Path 标识指定了主机下的哪些路径可以接受Cookie(该URL路径必须存在于请求URL中)。以字符 %x2F ("/") 作为路径分隔符,子路径也会被匹配。
例如,设置 Path=/docs,则以下地址都会匹配:
/docs
/docs/Web/
/docs/Web/HTTP
Expires/Max-Age
Expires过期时间,逐渐被Max-Age所取代
Max-Age,是以秒为单位的,Max-Age为正数时,cookie会在Max-Age秒之后,被删除,当Max-Age为负数时,表示的是临时储存,不会生出cookie文件,只会存在浏览器内存中,且只会在打开的浏览器窗口或者子窗口有效,一旦浏览器关闭,cookie就会消失,当Max-Age为0时,又会发生什么呢,删除cookie,因为cookie机制本身没有设置删除cookie,失效的cookie会被浏览器自动从内存中删除,所以,它实现的就是让cookie失效。
Size
cookie的大小
HttpOnly
通过JavaScript的 Document.cookie API无法访问带有 HttpOnly 标记的Cookie
Secure
标记为 Secure 的Cookie只应通过被HTTPS协议加密过的请求发送给服务端
SameSite
SameSite Cookie允许服务器要求某个cookie在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击
SameSite可以有下面三种值:
None
浏览器会在同站请求、跨站请求下继续发送cookies,不区分大小写。 在没有这个属性前浏览器默认的,所以会有CSRF的风险
Lax
在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者frames的调用,但只有当用户从外部站点导航到URL时才会发送。如link链接。
Strict
浏览器将只在访问相同站点时发送cookie。
Cookie与跨域
- 使用document.cookie能拿到的是当前域名下的cookie
- 通过配置ajax请求头'withCredentials'为true,以及后台配置('Access-Control-Allow-Origin','与请求网页一致的域名')和('Access-Control-Allow-Credentials',true),注意:Access-Control-Allow-Origin不能配置为‘*’,这样的方式可以使得跨域请求携带cookie
- 同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。
服务端设置Cookie
Set-Cookie: <cookie名>=<cookie值>