cookie是什么

浏览器存储在本地电脑上的一小段文本文件,cookie的存在主要是为了解决http协议无状态的问题,例如通过cookie来判断用户的登录状态,是否是某一个用户等。

cookie的结构 

    cookie以键值对的形式存储数据。

由expires(过期时间)、domain(cookie在哪些域下可以被发送)、path(cookie能在哪些路径下可以被发送) 、name(存放键值对)、secure(安全标志,cookie只能在htttps中有效)、httponly(不能通过脚本 Document.cookie访问cookie)。

浏览器和服务器之间如何传递cookie

    服务器通过在响应头部添加set-cookie字段向用户代理传递cookie信息。

浏览器通过在请求头部添加cookie字段向服务器传递之前保存的cookie信息 。

cookie的作用域 

domain和path确定了cookie的作用域。

domain确定了cookie在哪些域下可以被发送,path确定了哪些路经下可以被发送。

最需要值得注意的是当不给cookie设置domain时,默认cookie的作用范围为当前主机的域,不包含域的子域,当给cookie设置了domain,cookie的作用范围包含域的子域。比如:当前的路径的域为bai.com,cookie不设置domain,domain默认为bai.com,cookie只能在为bai.com的域的路径在被发送,aaa.bai.com域下不能发送当前这个cookie。当设置domain为bai.com时,cookie的作用范围是.bai.com,也就是包含了bai.com的子域,在bai.com和aaa.bai.com域下都可以发送cookie。

重点案例:

当创建cookie和修改cookie时要特别注意,比如我最近遇到的一个问题,退出登录无法清空token的问题,最后却发现在setCookie时没有给cookie设置域,在unSetCookie想清空cookie中的值时却给cookie设置了域。

      在创建或修改的时候,cookie的结构中除了过期时间,其他任一标示符不一样都会新创建一个cookie。

      在这个例子中,比如当前域是baidu.com,默认的domain为baidu.com,但是当设置了domain时,可以在浏览器中看到cookie中的domain为.baidu.com。两个domain不一样,两个cookie也不一样。后面设置的cookie要想覆盖前面的cookie的内容,必须保证name、path、domain、secure、httponly都是一致的。

export function setCookie(name, value, expires, path, domain, secure) {
let cookieText = encodeURIComponent(name) + '=' + encodeURIComponent(value); if (expires instanceof Date) {
cookieText += '; expires=' + expires.toGMTString();
} if (path) {
cookieText += '; path=' + path;
} if (domain) {
cookieText += '; domain=' + domain;
} if (secure) {
cookieText += '; secure';
}
document.cookie = cookieText;
} export function unsetCookie(name, path, domain, secure) {
path = path || window.location.pathname
domain = domain || window.location.hostname
setCookie(name, '', new Date(0), path, domain, secure);
}

  

cookie的创建和删除

   创建时:

   名称和值是必须有的字段,且必须被URL编码(encodeURIComponent编码)

删除时:

    1、不设置过期时间,默认会一个会话时间,关闭浏览器,就被删除

   2、设置expires过期时间或设置max-age最大时间

   3、浏览器的cookie数量达到限制,超出的cookie会被删除

cookie的限制条件

  不同浏览器对cookie的限制不同,cookie数量20到50不等,大小一般不能超出4kb。

cookie的用途

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

参考资料:

MDN:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies

http之cookie详解: https://www.kancloud.cn/kancloud/http-cookies-explained/48332

HTTP之Cookie的更多相关文章

  1. 超大 Cookie 拒绝服务攻击

    有没有想过,如果网站的 Cookie 特别多特别大,会发生什么情况? 不多说,马上来试验一下: for (i = 0; i < 20; i++) document.cookie = i + '= ...

  2. IE10、IE11 User-Agent 导致的 ASP.Net 网站无法写入Cookie 问题

    你是否遇到过当使用一个涉及到Cookie操作的网站或者管理系统时,IE 6.7.8.9下都跑的好好的,唯独到了IE10.11这些高版本浏览器就不行了?好吧,这个问题码农连续2天内遇到了2次.那么,我们 ...

  3. 解决cookie跨域访问

    一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入c ...

  4. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  5. 一个诡异的COOKIE问题

    今天下午,发现本地的测试环境突然跑不动了,thinkphp直接跑到异常页面,按照正常的排错思路,直接看thinkphp的log 有一条 [ error ] [2]setcookie() expects ...

  6. [转载]Cookie/Session的机制与安全

    Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道.本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题. 因 ...

  7. jquery.cookie的使用

    今天想到了要为自己的影像日记增加赞的功能,并且需要用到cookie. 记得原生的js操作cookie也不是很麻烦的,但似乎jquery更简单,不过相比原生js,需要额外引入2个文件,似乎又不是很好,但 ...

  8. 跨域问题,前端主动向后台发送cookie

    跨域是什么? 从一个域名的网页访问另一个域名的资源,就会出现跨域.只要协议.端口.域名有一个不同就会出现跨域 例如: 1.协议不同  http://www.baidu.com:80 和 https:/ ...

  9. 【流量劫持】沉默中的狂怒 —— Cookie 大喷发

    精简版:http://www.cnblogs.com/index-html/p/mitm-cookie-crack.html 前言 上一篇文章 讲解了如何借助前端技术,打造一个比 SSLStrip 更 ...

  10. 好好了解一下Cookie

    Cookie的诞生 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新 ...

随机推荐

  1. vue拓展题

    本文档基于vue-cli技术栈总结了 vue-cli工程 vue.js核心知识 vue-router路由 vuex状态管理器 axios等http请求 移动端适配 Tab切换等常用功能 vue与原生a ...

  2. xdoj 1241--余神的rp机(区间dp)

    xdoj  1241---余神的rp机 核

  3. SQL-表-003

    注:红色代表关键字,绿色代表解释说明,蓝色代表重点: 什么是数据表? 数据表是数据库中最重要的组成部分,可以将数据表分解成字段(列)和记录(行): 数据表的增加:约束同时创建 create table ...

  4. UBUNTU 安装教程

    玩过linux,只是博主觉得现在的很多服务器都是linux系统的,而自己属于那种前端也搞,后台也搞,对框架搭建也感兴趣,但是很多生产上的框架和工具都是安装在服务器上的,而且有不少大公司都要求熟悉在li ...

  5. linux之数据备份

    第一种方法:tar备份 [root@bogon ~]# cat bp/linux.txt no centos [root@bogon ~]# tar cvf bp.tar bp //打包bp目录 bp ...

  6. C++中的类模板

    一.学习笔记 1.类模板的格式(1)声明 template<typename T> /* 使用T表示某种类型,比如: */ class AAA { private: T obj; publ ...

  7. Top PG Clustering HA Solutions for PostgreSQL

    转自:https://severalnines.com/blog/top-pg-clustering-ha-solutions-postgresql If your system relies on  ...

  8. Optimizing Docker Images for Rust Projects

    转自:http://whitfin.io/speeding-up-rust-docker-builds/ This post will be the first of several addressi ...

  9. oracle-pl/sql之二

    java 触发器 包 你可以编写用户定义的函数(用pl/sql,java,c)来提供在sql中或sql内置函数中不可用的功能 有时,我们会发现有些功能通过PL/SQL完成会很麻烦,而通过C/C++语言 ...

  10. Spring事务传播属性和隔离

     1 事务的传播属性(Propagation)  1) REQUIRED ,这个是默认的属性 Support a current transaction, create a new one if no ...