Cookie

295 阅读3分钟

Cookie 是什么

  1. Cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据。
  2. 浏览器需要保存这段数据,不得轻易删除。
  3. 此后每次浏览器访问该服务器,都必须带上这段数据。
  4. Cookie 的容量很小(4KB)。

Cookie 就是这么简单,这就是 Web 开发里 Cookie 的含义。举例来说,用户访问网址www.example.com,服务器在浏览器写入一个 Cookie。这个 Cookie 就会包含www.example.com这个域名,以及根路径/。这意味着,这个 Cookie 对该域名的根路径和它的所有子路径都有效。如果路径设为/forums,那么这个 Cookie 只有在访问www.example.com/forums及其子路径时才有效。以后,浏览器一旦访问这个路径,浏览器就会附上这段 Cookie 发送给服务器。

登录注册中的 Cookie

  • 用户注册账号的时候,在提交的时候浏览器会发 POST 请求,把用户名和密码写入数据库;
  • 登陆的时候,浏览器发送 POST ` 请求,服务器把用户的用户名密码和数据库里的匹配,如果匹配成功,则发送一个响应头给浏览器,比如
HTTP/1.1 200 OK
Set-Cookie: sign_in_imail=1062233546@qq.com
Connection: keep-alive
Content-Length: 0

[page content]

浏览器得到 Cookie 之后,每次请求都要带上Cookie,比如

GET / HTTP/1.1
Host: localhost:8080
Accept: text/html
Cookie: sign_in_imail=1062233546@qq.com

[page content]

这就是 Cookie,里面记录着你的登陆信息,浏览器会在一段时间内保存 Cookie

  • 当再访问相同域名的网页,浏览器会带着这个 Cookie 发送 GET 请求,服务器读取 Cookie 与数据库匹配,就知道登录用户的信息。
  • Cookie 的特点
    • 服务器通过 Set-Cookie 响应头设置 Cookie
    • 浏览器得到 Cookie 之后,每次请求都要带上 Cookie
    • 服务器读取 Cookie 就知道登录用户的信息(email)

Set-Cookie 语法

1. 设置 cookie 的名称和值
Set-Cookie: <cookie-name>=<cookie-value> 

2. 设置 cookie 的过期时间
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date> 

3. 设置 cookie最长保存时间
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>

4. 对于哪个域是有效的,所有向该域发送的请求中都会包含这个cookie信息
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>

5. 指定一个 URL 路径,这个路径必须出现在要请求的资源的路径中才可以发送 cookie 首部
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
 
6. 设置 cookie 只有在请求使用 SSL 和 HTTPS 协议的时候才会被发送到服务器。
Set-Cookie: <cookie-name>=<cookie-value>; Secure

7. 不能使用 JavaScript 访问 cookie 
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly

Cookie 相关问题

  1. Chrome 登录了得到 Cookie,用 Safari 访问,Safari 会带上 Cookie 吗 不会
  2. Cookie 有效期吗? 默认有效期 20 分钟左右,为什么是左右呢,如果你给浏览器一个 Cookie ,默认这个 Cookie 是自动失效的。那什么什么过期呢,浏览器自己决定,不同浏览器策略不同,后端可以强制设置有效期。
  3. Cookie 遵守同源策略吗? 也有,不过跟 AJAX 的同源策略稍微有些不同。 当请求 qq.com 下的资源时,浏览器会默认带上 qq.com 对应的 Cookie,不会带上 baidu.com 对应的 Cookie; 当请求 v.qq.com 下的资源时,浏览器不仅会带上 v.qq.comCookie,还会带上 qq.comCookie