一文带你了解cookie

142 阅读5分钟

cookie

问题

假设服务器有一个接口,通过请求这个接口,可以添加一个管理员,不是任何人都有这个权利。

那么,服务器如何知道请求接口的人是有权利的?答案:只有登录过的管理员才有这个权利

客户端和服务端使用的是http协议,http协议是无状态的,什么是无状态,服务器不知道这一次的请求人,跟之前登录请求成功的人是不是同一个。

uTools_1691396629589.png

uTools_1691396734594.png

cookie相当于证件

用户不可能只在一个网站登录,于是客户端会收到各个网站的出入证,因此,就要求客户端有一个类似卡包的东西,能具备以下功能:

  1. 能够存放多个出入证,这些出入证来自不同的网站,也可能是一个网站有多个出入证,分别用于不同的地方
  2. 能够自动出示出入证,客户端在访问不同的网站时,能够自动把对应的出入证附带请求发出去
  3. 正确的出示证件,客户端不能把肯德基的出入证发给麦当劳
  4. 管理出入证的有效期,客户端自动的把过期的出入证移除

满足以上要求的就是,cookie

cookie是一个卡包,并有一套机制自动管理证件。

卡包内的每一张卡片,就是一个cookie

cookie的组成

  • key:键,是一个字段
  • value:值,是一个具体的信息,比如12763781263akjhgdh
  • domain:域,表示这个cookie是哪个网站的,比如 .baidu.com表示,这个cookie是这个网站的
  • path:路径,表示cookie是属于该网站的哪个基础路径,/news,表示这个cookie属于这个/news这个路径
  • secure:是否使用安全传输
  • expire:过期时间,表示cookie在什么时候过期

当浏览器向服务器发送一个请求的时候,会瞄一眼卡包,查看这个的cookie,看看哪些卡片能带过去

如果一个cookie满足以下条件,则这个cookie会被附带到请求中

  • cookie没有过期

  • cookie中的域和这个请求的域,是匹配的

    • 比如cookie的域是,.baidu.com,可以匹配的域是 baidu.com,www.baidu.com,new.baidu.com
    • 比如cookie的域是,www.baidu.com,则只可以匹配,www.baidu.com
    • cookie不在乎端口,只要域匹配则可以
  • cookie中的path和这次请求的path是匹配的

    • 比如cookie的path是/news,则可以匹配的请求路径是 /news,/news/detail/,/new/a/b/v
    • 如果是 / 则可以匹配全部
  • 验证cookie的安全传输

    • 如果cookie的secure是true,则请求的协议必须是https,否则不会发送cookie
    • 如果cookie的secure是false,则请求的协议可以是http,也可以是https

如果一个cookie满足以上条件,则这个cookie会被附带到请求中

具体的加入方式是,浏览器会将符合条件的cookie自动设置到请求头中,例如 Cookie: a=1;b=2

如何设置cookie

服务器设置cookie

当你请求成功后,服务区可以通过设置响应头,告诉浏览器如何设置cookie

响应头按照下面的格式设置:

set-cookie:cookie1
set-cookie:cookie2
set-cookie:cookie3
...

通过这种模式就可以设置cookie,每个cookie的格式如下

键=值;path=?; domain=?; expires=?; max-age=?; secure; httponly;

每个cookie除了键值对必须设置,其他都是可以选的,顺序不限

如果max-age和expire都没有设置,表示到期时间是,浏览器回话结束时,关闭了浏览器cookie就会失效

如果设置了 httponly,表示cookie只能用于传输,不允许客户端通过JS获取cookie,这对XSS跨站脚本攻击的时候会很有用。

删除cookie,就是去修改cookie,把cookie的max-age改成-1

set-cookie: token=; domain=.baidu.com; path=/; max-age=-1;

如果删除cookie,都要注意cookie的域和路径,因为可能存在,域和路径不同,但key相同的cookie

客户端设置cookie

浏览器向JS公开了接口,让JS可以设置cookie

document.cookie = "键=值;path=?; domain=?; expires=?; max-age=?; secure; "

和服务器设置cookie有以下区别:

  • 没有httponly,因为httponly本来是为了限制客户端访问的,既然是在客户端访问就失去了配置的意义
  • path的默认值,path在客户端设置时的默认值是当前页面的path
  • domain 的默认值,和path同理,客户端设置时的默认值是当前页面的domain
  • 删除cookie也是,修改cookie的过期时间

读取cookie,document.cookie就可以读取cookie

总结

如果把cookie用于登录场景,就是如下的流程:

登录请求

  1. 浏览器发送请求到服务器,附带账号密码
  2. 服务器验证账号密码正确,如果不正确,响应错误;如果正确,在响应头中设置cookie,附带登录的认证信息
  3. 客户端收到cookie,浏览器自动记录下来

后序请求

  1. 浏览器发送请求到服务器,希望添加一个管理员,并将cookie自动附带到请求中
  2. 服务器先获取到cookie,验证cookie中的信息是否正确,如果不正确,不予操作,如果正确,完成正常的业务流程