cookie
在我们第一次登录某个网站的时候,需要输入账号密码,登录成功之后,服务器会给客户端一个身份凭证,这些身份凭证就是cookie。在再次访问这个网站的时候,浏览器会将这个cookie附带到请求当中,就不需要再次输入账号密码来进行验证了。cookie在访问不同的网站的时候,它会根据记录的信息自动出示不同的身份凭证。
cookie的组成:
key :键–可以理解为这个cookie的名字
value:值–相当于一个身份编号
domain:域–表示cookie属于哪个网站
path:路径–表示cookie属于这个网站的哪个路径的,可能同一个网站下面不同路径需要不同的身份验证。
secure:表示是否使用安全传输,如果为true,那么请求的协议必须使用https,如果为false,那么请求的协议可以使用http,也可以使用https。
exprie:表示cookie的过期时间。
当一个cookie满足以下条件的时候,那么在浏览器向服务器发送请求的时候,就会发送这个cookie:
(1)cookie没有过期
(2)请求的域,路径和cookie里的domain,path匹配。在判断域是否匹配的时候,不看端口。
(3)secure是true,那么请求的协议必须是https,如果是http协议的话,那么也不可以使用这个cookie。
设置cookie
有两种方式。比较常见的是服务器响应,还有一种是客户端自行设置。
(1)服务器响应:服务器会在给客户端响应的消息中包含cookie,浏览器会自动把cookie存起来。
服务器可以通过设置响应头,来告诉浏览器应该如何设置cookie:
set-cookie: cookie1
set-cookie: cookie2
set-cookie: cookie3
...
因此,服务器在一次响应中可以设置多个cookie,cookie的格式:
键=值; path=?; domain=?; expire=?; max-age=?; secure; httponly
键值是必须有的,剩下的都是可选的。其中:max-age是cookie的相对有效期,和expire设置一个即可。httponle表示该cookie仅能用于传输,不允许在客户端通过js获取。
(2)客户端自行设置,这种方式比较少见,比如用户关闭了某个广告,并选择了「以后不要再弹出」,此时就可以把这种小信息直接通过浏览器的JS代码保存到cookie中。后续请求服务器时,服务器会看到客户端不想要再次弹出广告的cookie,于是就不会再发送广告过来了。
既然cookie是存放在浏览器端的,所以浏览器向JS公开了接口,让其可以设置cookie
document.cookie = "键=值; path=?; domain=?; expire=?; max-age=?; secure";
在客户端设置cookie,和服务器设置cookie的格式一样,只是有下面的不同:
- 没有httponly。因为httponly本来就是为了限制在客户端访问的,既然你是在客户端配置,自然失去了限制的意义。
- path的默认值。在服务器端设置cookie时,如果没有写path,使用的是请求的path。而在客户端设置cookie时,也许根本没有请求发生。因此,path在客户端设置时的默认值是当前网页的path
- domain的默认值。和path同理,客户端设置时的默认值是当前网页的domain
- 其他:一样
- 删除cookie:和服务器也一样,修改cookie的过期时间即可(设置max-age=-1)