Cookie笔记

197 阅读4分钟

从http协议的无状态性说起

HTTP协议是一种无状态、无连接的协议,不能在服务器上保持一次会话的连续状态信息。不能以状态来区分和管理请求和响应。即服务器单从网络连接上无从知道客户身份。

cookie和session体系

通过引入cookie和session体系机制来维护状态信息。即用户第一次访问服务器的时候,服务器响应报头通常会出现一个Set-Cookie响应头,在本地设置一个cookie,当用户再次访问服务器的时候,http会附带这个cookie过去,cookie中存有sessionId这样的信息来到服务器这边确认是否属于同一次会话。

Cookie的作用是记录用户的有关信息,它最根本的用途是帮助Web站点保存有关访问者的信息。如身份识别号码ID、密码、浏览过的网页、停留的时间、用户在Web站点购物的方式或用户访问该站点的次数等,当用户再次链接Web服务器时,浏览器读取Cookie信息并传递给Web站点。  

session和cookie的对比

Session: 是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;

Cookie: 是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上 cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。用户验证这种场合一般会用 session
  2. session保存在服务器,客户端不知道其中的信息;反之,cookie保存在客户端,服务器能够知道其中的信息
  3. session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
  4. session中保存的是对象,cookie中保存的是字符串
  5. session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到,而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的

Cookie的原理

  1. 服务器经过身份认证后通过 Set-Cookie 响应头设置 Cookie
  2. 浏览器得到 Cookie 之后,每次请求都要带上 Cookie
  3. 服务器读取 Cookie 就知道登录用户的信息(email)

cookie不可跨域

浏览器的同源策略

URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性。

Cookie的同源只关注域名,是忽略协议和端口的。所以一般情况下,https://localhost:80/和http://localhost:8080/的Cookie是共享的。 Cookie是不可跨域的;在没有经过任何处理的情况下,二级域名不同也是不行的。(wenku.baidu.com和baike.baidu.com)。

cookie的属性

name

这个显而易见,就是代表 cookie 的名字的意思,一个域名下绑定的 cookie ,name 不能相同,相同的 name 的值会被覆盖掉

value

这个就是每个 cookie 拥有的一个属性,它表示该属性的值

domain

这个是指的域名,这个代表的是,cookie 绑定的域名,如果没有设置,就会自动绑定到执行语句的当前域,还有值得注意的点,统一个域名下的二级域名也是不可以交换使用 cookie 的,比如,你设置 www.baidu.com 和 image.baidu.com ,依旧是不能公用的

path

path这个属性默认是/,当你设置成比如/blog的时候,其实它会给 “domain+path” 范围内绑定 cookie

Expires/Max-Age

设置 cookie 的有效期

secure

这个属性译为安全,http 不仅是无状态的,还是不安全的协议,容易被劫持。所以当这个属性设置为 true 时,此 cookie 只会在 https 和 ssl 等安全协议下传输。但需要强调一下这个属性并不能对客户端的cookie进行加密,不能保证绝对的安全性

HttpOnly

这个属性是面试的时候常考的,如果这个属性设置为 true,就不能通过 JavaScript 脚本来获取 cookie 的值,能有效的防止xss 攻击,看 MDN 的官方文档:

为避免跨域脚本 (XSS) 攻击,通过JavaScript的 Document.cookie API无法访问有HttpOnly 标记的Cookie,Cookie只需要发送给服务端。如果包含服务端session信息的Cookie不想被客户端Javascript使用,那么就需要使用HttpOnly 标记