一、Cookie 是什么?

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。使用场景:

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

二、Cookie 生成过程
1、生成 cookie

服务器生成了 cookie 数据 并设置为 Set-Cookie 属性,包含在 HTTP 协议的 Header 中 ,来告诉浏览器保存这些数据(除非浏览器禁用了 Cookie)。

// 服务端发给浏览器的数据
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

2、存储 cookie 并回传

浏览器会在接下来的请求中,把存储的 cookie 数据,设置为 Cookie 属性,包含 HTTP 协议的 Header 中 ,连同请求一起发送给服务器(除非设置了不发送 cookie)。

// 浏览器发给服务器的数据
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

三、第一方 和 第三方 Cookie
  • Cookie 中的域名 与 当前站点域名相同,称为 第一方cookie( first-party cookie);

  • Cookie 中的域名 与 当前站点域名不同,称为 第三方cookie( third-party cookie);

当前站点会使用一些其他站点资源(譬如图片、广告等),在请求第三方服务器获取这些资源时,也会返回 Set-Cookie 属性,让浏览器保留第三方的 cookie,这些cookie 主要用于用户跟踪,流量分析等。


四、cookie 的重要属性
1、Secure 和 HttpOnly

功能:限制访问 Cookie 的方式。

  • Secure :表示 cookie 只能用 https 加密的方式发送给请求站点;
  • HttpOnly :JavaScript API 无法访问带有 HttpOnly 属性的cookie(Document.cookie 无法读取cookie)当 cookie 中的数据,只用于服务器时,可以设置此属性;可防止通过 JavaScript 访问 cookie 值;
  • 这两个属性可以有效防御 大部分 XSS 攻击。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

2、Domain 和 Path

功能:允许 Cookie 发送给哪些URL?

  • Domain :表示 cookie 可以发送给那个域名包括其子域名。如果不设置Domain,就取值为 origin 但不包含origin 的子域名。如果设置 Domain=mozilla.org,那么 cookie 也能发送给子域名 developer.mozilla.org
  • Path :表示 cookie 可以发送给那些路径。如果 设置 Path=/docs,那么 cookie 也能发送给子路径 /docs/Web/

3、SameSite

功能:可以限制 cookie 的跨域发送,此属性可有效防止大部分 CSRF 攻击,有三个值可以设置:

  • None :同站、跨站请求都发送 cookie,但需要 Secure 属性配合一起使用。

    Set-Cookie: flavor=choco; SameSite=None; Secure
    
  • Strict :当前页面与跳转页面是相同站点时,发送 cookie;

    Set-Cookie: key=value; SameSite=Strict
    
  • Lax :与 Strict 类似,但用户从外部站点导航至URL时(例如通过链接)除外。 在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到URL时才会发送。如 link 链接


4、__Host-__Secure-

可以创建 cookie 的地方很多,很难判断 cookie 的来源,但是可使用 cookie 前缀来断言 cookie 的来源。

  • __Host-

    带有这个前缀的 cookie,必须具备这三个特性:有 Secure 属性、没有 Domain 属性、Path 值为 /,此类 cookie 被称之为 domain-locked

  • __Secure-

    带有这个前缀的 cookie,表示必须具有 Secure 属性。

由于应用服务器仅在确定用户是否已通过身份验证或 CSRF 令牌正确时才检查特定的 cookie 名称,因此,这有效地充当了针对会话劫持的防御措施。


五、操作 Cookie 的方法
1、JavaScript API

JavaScript 代码中通过 Document.cookie 来创建 Cookie,也能用其访问不带 HttpOnly 标志的 Cookie。

document.cookie = "yummy_cookie=choco";
document.cookie = "tasty_cookie=strawberry";
console.log(document.cookie);
// logs "yummy_cookie=choco; tasty_cookie=strawberry"

2、cookie库

Node.js 项目用 http 创建的 Web服务,可以用 cookie库 操作 cookie,实例如下:

var cookie = require('cookie');
var escapeHtml = require('escape-html');
var http = require('http');
var url = require('url');function onRequest(req, res) {// Parse the query stringvar query = url.parse(req.url, true, true).query;if (query && query.name) {// Set a new cookie with the nameres.setHeader('Set-Cookie', cookie.serialize('name', String(query.name), {httpOnly: true,maxAge: 60 * 60 * 24 * 7 // 1 week}));// Redirect back after setting cookieres.statusCode = 302;res.setHeader('Location', req.headers.referer || '/');res.end();return;}// Parse the cookies on the requestvar cookies = cookie.parse(req.headers.cookie || '');// Get the visitor name set in the cookievar name = cookies.name;res.setHeader('Content-Type', 'text/html; charset=UTF-8');if (name) {res.write('<p>Welcome back, <b>' + escapeHtml(name) + '</b>!</p>');} else {res.write('<p>Hello, new visitor!</p>');}res.write('<form method="GET">');res.write('<input placeholder="enter your name" name="name"> <input type="submit" value="Set Name">');res.end('</form>');
}http.createServer(onRequest).listen(3000);
  • cookie - npm

  • cookie - github


3、cookie-parser 库

express 项目 中使用 cookie-parser 来操作 cookie,实例如下:

var express = require('express')
var cookieParser = require('cookie-parser')var app = express()
app.use(cookieParser())app.get('/', function (req, res) {// Cookies that have not been signedconsole.log('Cookies: ', req.cookies)// Cookies that have been signedconsole.log('Signed Cookies: ', req.signedCookies)
})app.listen(8080)// curl command that sends an HTTP request with two cookies
// curl http://127.0.0.1:8080 --cookie "Cho=Kim;Greet=Hello"
  • cookie-parser - npm
  • cookie-parser - github

六、大量数据存储问题

大量服务端数据存储于 Cookie ,降低了网络访问性能(特别是移动环境下),可通过 Web Storage APIIndexedDB 来解决。

  • Web Storage API - MDN

  • IndexedDB_API - MDN


七、参考文档
  • 一篇解释清楚Cookie是什么?

一篇解释清楚Cookie是什么?相关推荐

  1. qq空间登陆 cookie_看完这篇 Session、Cookie、Token,和面试官扯皮就没问题了||CSDN博文精选...

    作者:程序员cxuan Cookie 和 Session HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录:Session 和 ...

  2. qq空间登陆 cookie_把这篇 Session、Cookie、Token看完,和面试官随便谈人生

    先看大纲: Cookie 和 Session HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录:Session 和 Cookie ...

  3. 性能测试-工具篇:jmeter - Cookie管理和默认请求

    HTTP Cookie Manager(HTTP Cookie管理器) Name:名称.可自定义 Comments:注释,可自定义 Options: Clear cookies each iterat ...

  4. 关于四象限法则,看到的最好的一篇解释

    > 看完总结下: 第一象限的事情要最先完成,但是,常常是因为第二象限的事情没处理好,才变成了第一象限 第二象限的事情都可以称之为一个项目了,需要对项目/目标进行项目分解 第三象限的事情,尽量交给 ...

  5. [ web基础篇 ] session,cookie,token 那些事儿 ?

  6. XSS跨站脚本攻击防御和Cookie,及SSO单点登录原理

    XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性.其原理是攻击者向有XSS漏洞的网站中输入 ...

  7. Cookie 学习案例之三天免登录

    Cookie 问题:HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁.如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗? 解决:使用 Cookie 技术 解释 ...

  8. 显示部分x_Linux 黑话解释:什么是显示服务器,用来做什么? | Linux 中国

    导读:在 Linux 相关的文章.新闻和讨论中,你会经常遇到显示服务器.Xorg.Wayland 等名词.本文字数:1882,阅读时长大约:2分钟https://linux.cn/article-12 ...

  9. 分布式事务科普(终结篇)

    <分布式事务科普>是我在YiQing期间整理的一篇科普型文章,内容共计两万五千字左右,应该算是涵盖了这个领域的大多数知识点.篇幅较长,遂分为上下两篇发出.上篇为<分布式事务科普--初 ...

最新文章

  1. 另类无法在ESXi上添加存储器故障
  2. Exchange 2010 CAS安装之一
  3. python 程序1【登录接口】
  4. Steps to configure Oracle 11g Data Guard Physical Standby – Active Data Guard Part-I
  5. JavaFX场景切换代码示例
  6. 正则表达式(grep命令,egrep命令,sed命令,awk命令,sort工具,uniq工具)
  7. TypeError: can‘t send non-None value to a just-started generator-python报错问题
  8. mysql服务启动失败 Starting MySQL. ERROR! The server quit without updating PID file
  9. windows缺少dll文件检测dll文件
  10. [面试] C/C++ 语法 —— 内存与操作系统
  11. 算法导论9.1-1习题解答(二叉树)
  12. 自然语言处理领域重要论文资源全索引
  13. SQL server2008 安装教程
  14. FinePrint双面打印设置
  15. 主流数据库/国产数据库有哪些 如何适配国产数据库
  16. html常用布局标签的合理搭配
  17. RJ45-线序 586B 白橙 橙 白绿 蓝 白蓝 绿 白棕 棕
  18. Java 创建一个Customer类,类中的属性有姓名、年龄、性别,然后创建两个Customer对象,把这两个对象存储在ArrayList对象中,然后再从ArrayList对象中读取出来。
  19. exlc表格怎么换行_在Excel中如何换行?Excel表格换行快捷键是什么?
  20. 2016-2017-2 《Java程序设计》课程学生博客和代码托管链接

热门文章

  1. 不只是包子铺!巴比食品:重回高增长赛道,做中式面点第一品牌
  2. 梯度消失和梯度爆炸问题解析
  3. openssl 交叉编译 armv7内核
  4. 对称加密与非对称加密的区别
  5. 2023年Java面试题大全(最新版版)面试题附答案详解,看完BTA可进
  6. API开发平台,专注API无代码快速发布
  7. 基于GIS技术的城市交通管理应用
  8. 期刊以及会议的CCF类别查询方法
  9. ContentProvider介绍
  10. MAP一个KEY多个value处理方法