老生常谈,讲一讲cookie的诞生。由于HTTP协议是无状态无连接的,每次请求服务器端都无法识别发起请求方的身份,所以诞生了cookie机制,用以帮服务器端识别客户端身份。
Cookie是一小段文本信息,伴随着用户请求在 Web 服务器和浏览器之间传递。它存储于访问者的计算机中,每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。
cookie既可以在客户端设置也可以在服务器端设置。
服务器端使用Set-cookie,可以设置cookie的全部属性,如:
name,value,
domain(设置cookie的有效域,在该域才能获取),
path(它是在域名的基础下,指定可以访问的路径),
expires/max-age(cookie何时删除,max-age逐渐取代expires),
secure(浏览器使用HTTPS协议才会发送cookie到服务器),
http-only:JS无法读取和修改
客户端设置无法设置cookie的secure,http-only。
cookie会跟随任意HTTP请求一起发送到服务器端。
这个是浏览器的行为,但是也带来一个困扰,对于图片这样的资源请求,如果也带上cookie,带宽消耗就有点大了
cookie无法跨域名共享
二级域名都不能共享
每个域名下的cookie数量有限制,每个域名不超过20个,每个大小不超过4KB
毕竟是存在客户端,如果每个没有数量限制就面临存爆硬盘的风险了
cookie的名和值都需要进行URL编码后传输,相应的前端获取cookie时也需要解码,decodeURIComponent
安全性:由于cookie在HTTP中是明文传递的,其中包含的数据都可以被他人访问,可能会被篡改、盗用。
关于cookie的增删改查:
cookie是浏览器提供的一种机制,它将 document
对象的 cookie
属性提供给 JavaScript。可以使用JavaScript来创建和取回 cookie 的值,因此我们可以通过document.cookie访问它。
document.cookie=encodeURIComponent("username").trim()+"="+encodeURIComponent("username").trim();
document.cookie=encodeURIComponent("mtauthorityauthority").trim()+"="+encodeURIComponent("authority").trim();
使用cookie
let cookie = document.cookie;
let tempa = cookie.split(";");
let username="";
let authority="";
tempa.map((value)=>{
if(value.split("=")[0].trim()===(encodeURIComponent("mtdname")).trim()){
username=decodeURIComponent(value.split("=")[1].trim()).trim()
}
if(value.split("=")[0].trim()===encodeURIComponent("mtdauthority").trim()){
authority=decodeURIComponent(value.split("=")[1].trim()).trim()
}
return null
});
删除cookie
let exp = new Date();
document.cookie=encodeURIComponent("username").trim()+"="+encodeURIComponent(jsonData.data.username).trim()+";expires="+exp.toGMTString();
document.cookie=encodeURIComponent("authority").trim()+"="+encodeURIComponent(jsonData.data.authority).trim()+";expires="+exp.toGMTString();
session
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录
在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
每个用户访问服务器都会建立一个session,那服务器是怎么标识用户的唯一身份呢?事实上,用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId。
关于cookie和session的选择
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
网友评论