Cookie的属性和跨域问题

Cookie的属性和跨域问题,第1张

一个域名下面可能存在着很多个cookie对象,cookie具有多个属性:

非顶级域名,如二级域名或者三级域名,设置的cookie的domain只能为顶级域名或者二级域名或者三级域名本身,不能设置其他二级域名的cookie,否则cookie无法生成。

顶级域名只能设置domain为顶级域名,不能设置为二级域名或者三级域名,否则cookie无法生成。

二级域名能读取设置了domain为顶级域名或者自身的cookie,不能读取其他二级域名domain的cookie。所以要想cookie在多个二级域名中共享,需要设置domain为顶级域名,这样就可以在所有二级域名里面或者到这个cookie的值了。

顶级域名只能获取到domain设置为顶级域名的cookie,其他domain设置为二级域名的无法获取。

我们知道Cookie的属性有很多,其中有一个属性是路径。有些人认为Cookie的路径指的是Cookie在客户端的保存路径,其实并不是。 Cookie的路径是在服务器创建Cookie时设置的,它的作用是决定浏览器访问服务器的某个资源时,需要将浏览器端保存的那些Cookie归还给服务器

正常的cookie只能在一个应用中共享,即一个cookie只能由创建它的应用获得。

设置cookie.setPath("/")假设本机tomcat/webapp下面有两个应用:cas和webapp_b:

设置cookie.setDomain(".jszx.com")假设 A机所在的域:home.langchao.com,A有应用cas B机所在的域:jszx.com,B有应用webapp_b :

看个实际生活的例子:

学校门口有家饭店味道不错,小明去吃了一次,确实味道不错,这周小明又去这家饭店吃饭,结账时,小明说:”我上周来过,这是第二次了,能不能打个折?“。老板说:”你来过?我不记得啊(无状态)“。小明表示很生气,明明来过老板竟然不记得。老板想了个法子,给小明发了张卡片(cookie),上面写着小明的信息,下次小明拿着卡片来老板就认识了。

回到正题,cookie用在http请求中,而http是无状态协议,它的每个请求都是完全独立的,服务端无法判别用户状态,cookie用来告诉服务端用户的状态信息。客户端用户第一次发送请求给服务端时,服务端在返回的响应中发给用户一个cookie,里面记录了用户的信息,下次用户再发送http请求给服务端时,会携带上cookie,服务端检查cookie获取用户的状态信息。

cookie的内容主要是服务端写入的,由客户端存储在本地,cookie其实是以字符串的形式存储的。打开谷歌开发者工具的Application中的Cookie,可以看到cookie具有以下字段

cookie以键值对的形式存储用户数据

不同域名是无法 *** 作彼此cookie的,而且必须满足path一样或者是其子路径才能相互访问彼此的cookie。

domain用来设置可以使用cookie的域名,如果想让一级域名下的两个二级域名都能使用cookie,例如imag.baidu.com和www.baidu.com,可以设置domain为baidu.com,但不能设置为.com,这样两个二级域名都能使用。path属性设置允许使用cookie的路径,例如设置为根路径"/",表示允许根路径以及根路径下的所有子路径都可以使用cookie

所以domain和path共同决定了cookie能否被浏览器自动添加到请求头部中发送出去。如果没有设置这两个选项,则会使用默认值。domain的默认值为设置该cookie的网页所在的域名,path默认值为设置该cookie的网页所在的目录。

此外,如果是跨域请求,例如XMLHttpRequest请求,默认是不会自动携带cookie的。

cookie的过期时间,Expires是具体日期,Max-Age是一段时间

cookie的大小,一般是4k,此外cookie的个数也有限制,不同浏览器cookie的个数限制不同

该cookie数据是否只用来在http请求中传递,默认为false,如果设置该字段为true,客户端无法用js访问或者 *** 作该cookie,这条cookie信息不会出现在document.cookie的字符串中。

默认为false,设置该字段为true则该cookie不会携带在http协议的请求中,只能携带在安全的https协议请求中

当网页要发http请求时,浏览器会先检查是否有相应的cookie,有则自动添加在request header中的cookie字段中。这些是浏览器自动帮我们做的,而且每一次http请求浏览器都会自动帮我们做。这个特点很重要,因为这关系到“什么样的数据适合存储在cookie中”。

因为每次浏览器发送http请求都会自动携带cookie,会增加网络开销,所以最好只存放每次请求都需要发送给服务端的数据,比如身份认证信息。

客户端使用js设置 cookie,客户端可以设置cookie 的下列选项:expires、domain、path、secure(有条件:只有在https协议的网页中,客户端设置secure类型的 cookie 才能成功),但无法设置HttpOnly选项。document.cookie可以获取cookie字符串,也可以设置cookie。

document.cookie="age=12expires=Thu, 26 Feb 2116 11:50:25 GMTdomain=sankuai.compath=/"

值得注意的是,浏览器提交Cookie时只会提交name和value属性,maxAge属性只被浏览器用来判断Cookie是否过期。

当要设置多个cookie时,必须重复设置document.cookie = "key=name"。

要想修改一个cookie,只需要重新赋值就行,旧的值会被新的值覆盖。但要注意一点,在设置新cookie时,path/domain这几个选项一定要旧cookie 保持一样。否则不会修改旧值,而是添加了一个新的 cookie。删除一个cookie 也挺简单,也是重新赋值,只要将这个新cookie的expires 选项设置为一个过去的时间点就行了。但要注意,path/domain/这几个选项一定要旧cookie 保持一致。

服务端的response header中有一项叫set-cookie,是服务端专门用来设置cookie的。

理论上php不可以跨域设置cookie;

php设置cookie流程:返回的信息携带信息,然后靠浏览器来执行写入到cookie,一般浏览器安全机制已经限制跨域写入;

如果你想伪造cookie,可以使用浏览器管理cookie的插件


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11054385.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存