Cookie 是存储在浏览器目录中的文本文件,当浏览器运行时,存储在 RAM 中发挥作用 (此种 Cookies 称作 Session Cookies),一旦用户从该网站或服务器退出,Cookie 可存储在用户本地的硬盘上 (此种 Cookies 称作 Persistent Cookies)。
Cookie 技术诞生以来,它就成了广大网络用户和 Web 开发人员争论的一个焦点。有一些网络用户,甚至包括一些资深的 Web 专家也对它的产生和推广感到不满,这并不是因为 Cookie 技术的功能太弱或其他技术性能上的原因,而是因为 Cookie 的使用对网络用户的隐私构成了危害。因为 Cookie 是由 Web 服务器保存在用户浏览器上的小文本文件,它包含有关用户的信息。
实际上,Cookie中保存的用户名、密码等个人敏感信息通常经过加密,很难将其反向破解。但这并不意味着绝对安全,黑客可通过木马病毒盗取用户浏览器Cookie,直接通过偷取的Cookie骗取网站信任。可以看出,木马病毒入侵用户电脑是导致用户个人信息泄露的一大元凶。
对于一个任何Http Request来说,提交给Server端的时候,它能够安全访问的Cookie的域名必须在这个HTTP Reuqest的域名路径中。 举例来说,发出一个http://ccc.bbb.aaa.com/的 请求时,随着这个http request一块发送到server端的cookies会自动包括所有 以ccc.bbb.aaa.com, .bbb.aaa.com, .aaa.com为域名的Cookies,这是由Cookie本身的规范所限制的,浏览器如果不是按照这个规范实现,那么就会存在严重安全漏洞,因为那样的话意味着任何一 个服务器都可以读到同一个用户访问别的网站时留下的Cookie。
Cookie主要属性
1.path
2.domain
3.max-age
4.expires:是expires的补充,现阶段有兼容性问题:IE低版本不支持,所以一般不单独使用
5.secure
6.httponly : JS不能读写HttpOnly Cookie
属性之间使用英文分号和空格("; ")连接
浏览器存放cookie包含的字段:
name、value
expiry-time:由Cookie中的expires和max-age产生
domain、path
creation-time、last-access-time
persistent-flag:持久化标记,默认为false,表示是session cookie
secure-only-flag
http-only-flag
host-only-flag:Cookie中不包含Domain属性或者Domain为空或者不合法时为true。
HttpOnly属性——防止程序获取cookie后进行攻击
如果Cookie中设置了HttpOnly属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,能有效的防止XSS攻击。
Secure——防止信息传输过程中的泄露
true —— 只能在HTTPS连接中传输,HTTP连接不会传输,所以不会被窃取到Cookie的具体内容
false —— HTTP、HTTPS连接都可以传输
Session Cookie
Session Cookie是没有expiry date的,会话结束也会一并删除。
SameSite:
值为Strict,完全禁止第三方Cookie,跨站时无法使用Cookie。
值为Lax,允许在跨站时使用Get请求携带Cookie,下面有一个表格介绍Lax的Cookie使用情况。
值为None,允许跨站跨域使用Cookie,前提是将Secure属性设置为true。
Priority :Cookie的优先级。值为Low/Medium/High,当Cookie数量超出时,低优先级的Cookie会被优先清除。
domain
cookie无法设置除当前域名或者其父域名之外的其他domain。 这个是浏览器出于对cookie的保护造成的,也就是cookie无法跨域设置。
1.cookie的作用域是domain本身以及domain下的所有子域名
2‘domain参数可以设置父域名以及自身,但不能设置其它域名,包括子域名,否则cookie不起作用。 这个是浏览器出于对cookie的保护造成的,也就是 cookie无法跨域设置。
3.若domain不带点,只有当前域名的服务器可以获取到cookie,子域名拿不到cookie;若domain带点,当前域名&子域名都可以拿到cookie
对应Chrome,如果显示声明,不管domain带不带点,都是带点存储;只有非显示声明domain的cookie,浏览器存储才是不带点
有几个知识点需要注意:
- 标记cookie的key区分大小写,不同大小写对应不同的cookie
- 不同的path,可以存放不同的cookie
- path具有继承性,子目录可以访问父目录的cookie
- 在设置cookie时,不能设置跨域cookie,通过js也不能读取跨域cookie(js不会报错,只是不生效)
- Secure – 安全
指定cookie的值通过网络如何在用户和WEB服务器之间传递。这个属性的值或者是“secure”,或者为空。
缺省情况下,该属性为空,也就是使用不安全的HTTP连接传递数据。如果一个 cookie 标记为secure,那么,它与WEB服务器之间就通过HTTPS或者其它安全协议传递数据。
不过,设置了secure属性不代表其他人不能看到你机器本地保存的cookie。换句话说,把cookie设置为secure,只保证cookie与WEB服务器之间的数据传输过程加密,而保存在本地的 cookie文件并不加密。如果想让本地cookie也加密,得自己加密数据。
Cookie跨域共享
前端配置 withCredentials=true,后段设置Access-Control-Allow-Origin不能为 " * ",必须是具体源地址