Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

Cookie

作者头像
代码之风
发布于 2018-10-31 03:36:45
发布于 2018-10-31 03:36:45
1.9K00
代码可运行
举报
文章被收录于专栏:马涛涛的专栏马涛涛的专栏
运行总次数:0
代码可运行

Cookie

本文章整理自:阮一峰Cookie 参考「每日一题」简述 Cookie 是什么

什么是Cookie

Cookie 是服务器保存在浏览器的一小段文本信息。浏览器每次向服务器发出请求,就会自动附上这段信息。

Cookie的作用

  1. Cookie 主要用来分辨两个请求是否来自同一个浏览器
  2. 用来保存一些状态信息,例如:
    • 对话(session)管理:保存登录、购物车等需要记录的信息。
    • 个性化:保存用户的偏好,比如网页的字体大小、背景色等等。
    • 追踪:记录和分析用户行为

不推荐使用Cookie作为客户端存储,原因:

  1. 它的容量很小(4KB)
  2. 缺乏数据操作接口
  3. 而且会影响性能

客户端储存应该使用 Web storage APIIndexedDB

Cookie的组成

Cookie 包含以下几方面的信息:

  1. Cookie 的名字
  2. Cookie 的(真正的数据写在这里面)(1、2两点就是键值对 )
  3. 到期时间
  4. 所属域名(默认是当前域名)
  5. 生效的路径(默认是当前网址)

(3/4/5是cookie的属性)

Cookie的作用过程

举例来说:

  1. 用户访问网址www.example.com,服务器在浏览器写入一个 Cookie。这个 Cookie 就会包含www.example.com这个域名(第4点),以及根路径/(第5点)。(这意味着,这个 Cookie 对该域名的根路径和它的所有子路径都有效。如果路径设为/forums,那么这个 Cookie 只有在访问www.example.com/forums及其子路径时才有效。)
  2. 以后,浏览器一旦访问这个路径,浏览器就会附上这段 Cookie 发送给服务器

Cookies作用范围

浏览器的同源政策规定,两个网址只要域名相同端口相同,就可以共享 Cookie(参见《同源政策》一章)。注意,这里不要求协议相同。也就是说,http://example.com设置的 Cookie,可以被https://example.com读取

HTTP 协议中的Cookie

HTTP 回应:Cookie 的生成(服务器端生成cookies)

服务器如果希望在浏览器保存 Cookie,就要在 HTTP 回应的头信息里面,放置一个Set-Cookie字段.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Set-Cookie:foo=bar

上面代码会在浏览器保存一个名为foo的 Cookie,它的值为bar。 (设置的格式为:<键(名)>=<值>)

HTTP 回应可以包含多个Set-Cookie字段,即在浏览器生成多个 Cookie。下面是一个例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

[page content]

除了 Cookie 的值,Set-Cookie字段还可以附加 Cookie 的属性。

一个Set-Cookie字段里面,可以同时包括多个属性,没有次序的要求。

下面是设置一个Cookie的例子:除了名与它的值,还包含Domain属性Secure属性和HttpPnly属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly

除了键=值来设置cookie的名字和值之外,还可以设置属性。

  1. ExpiresMax-Age用来设置cookie持续时间
  2. DomainPath设置发送http请求时那些域名和路径需要附带这个Cookie
  3. Secure属性指定浏览器只有在加密协议 HTTPS 下才能发送
  4. HttpOnly属性指定该 Cookie 无法通过 JavaScript 脚本拿到

具体用法看这里Cookie 的属性---阮一峰

HTTP 请求:Cookie 的发送(浏览器发送Cookie)

浏览器向服务器发送 HTTP 请求时,每个请求都会带上相应的 Cookie。也就是说,把服务器早前保存在浏览器的这段信息,再发回服务器。这时要使用 HTTP 头信息的Cookie字段。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cookie: foo=bar

上面代码会向服务器发送名为foo的 Cookie,值为bar。

Cookie字段可以包含多个 Cookie,使用分号(;)分隔。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cookie: name=value; name2=value2; name3=value3

下面是一个Http请求的例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

服务器收到浏览器发来的 Cookie 时,有两点是无法知道的(因为这些Cookie的属性只保存在浏览器上)。

  1. Cookie 的各种属性,比如何时过期。
  2. 哪个域名设置的 Cookie,到底是一级域名设的,还是某一个二级域名设的。

document.cookie读写当前网页的Cookie

读Cookie

读取的时候,它会返回当前网页的所有 Cookie,前提是该 Cookie 不能有HTTPOnly属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.cookie // "foo=bar;baz=bar"

写Coookie

document.cookie属性是可写的,可以通过它为当前网站添加 Cookie。 等号两边不能有空格

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.cookie = 'fontSize=14';

但是,document.cookie一次只能写入一个 Cookie,而且写入并不是覆盖,而是添加。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.cookie = 'test1=hello';
document.cookie = 'test2=world';
document.cookie
// test1=hello;test2=world

写入 Cookie 的时候,可以一起写入 Cookie 的属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.cookie = "foo=bar; expires=Fri, 31 Dec 2020 23:59:59 GMT";

各个属性的写入注意点如下。

path属性必须为绝对路径,默认为当前路径。 domain属性值必须是当前发送 Cookie 的域名的一部分。比如,当前域名是example.com,就不能将其设为foo.com。该属性默认为当前的一级域名(不含二级域名)。 max-age属性的值为秒数。 expires属性的值为 UTC 格式,可以使用Date.prototype.toUTCString()进行日期格式转换。 document.cookie写入 Cookie 的例子如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.cookie = 'fontSize=14; '
  + 'expires=' + someDate.toGMTString() + '; '
  + 'path=/subdirectory; '
  + 'domain=*.example.com';

Cookie 的属性一旦设置完成,就没有办法读取这些属性的值

Cookie 的删除

删除一个现存 Cookie 的唯一方法,是设置它的expires属性为一个过去的日期

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.cookie = 'fontSize=;expires=Thu, 01-Jan-1970 00:00:01 GMT';

上面代码中,名为fontSize的 Cookie 的值为空,过期时间设为1970年1月1月零点,就等同于删除了这个 Cookie。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
HTTP缓存机制与Cookie
缓存是一种保存资源副本并在下次请求时直接使用该副本的技术。当Web缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载。
Dreamy.TZK
2020/08/11
1.3K0
HTTP缓存机制与Cookie
【网络知识补习】❄️| 由浅入深了解HTTP(四) HTTP之cookies
RFC 6265定义了 cookie 的工作方式。在处理 HTTP 请求时,服务器可以在 HTTP 响应头中通过HTTP Headers Set-Cookie 为客户端设置 cookie。然后,对于同一服务器发起的每一个请求,客户端都会在 HTTP 请求头中以字段 Cookie 的形式将 cookie 的值发送过去。也可以将 cookie 设置为在特定日期过期,或限制为特定的域和路径。
呆呆敲代码的小Y
2021/08/20
2.2K0
Http知道这些,开发Android才算合格!
说起HTTP大家再熟悉不过了,无论是大学的课本上还是平时的工作中,几乎每天都要和HTTP打交道。但是,就是这么熟悉的老朋友,你真的是非常了解吗?你能轻而易举就回答出我下面的几个问题吗?
吴延宝
2019/04/25
5460
Http知道这些,开发Android才算合格!
网络编程之通过cookie和session让http协议变得有状态
因为http协议是无状态的,也就是说每次连接之后就不会记住上一次连接,如果是要登录才能查看的信息,就对用户体验很不好了。这篇文章我们介绍在客户端和服务端如何使得http协议有状态。
lyb-geek
2018/07/26
4290
网络编程之通过cookie和session让http协议变得有状态
【Web技术】238-全面了解Cookie
浏览器和服务器之间的通信少不了HTTP协议,但是因为HTTP协议是无状态的,所以服务器并不知道上一次浏览器做了什么样的操作,这样严重阻碍了交互式Web应用程序的实现。
pingan8787
2019/07/25
6630
HTTP应知应会知识点复习手册(下)
还可参考:https://blog.csdn.net/lpjishu/article/details/50917092
蛮三刀酱
2019/03/26
6030
HTTP应知应会知识点复习手册(下)
面试问你HTTP知识点?这篇搞懂秒杀90%知识点!
由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
乔戈里
2019/07/10
1K0
面试问你HTTP知识点?这篇搞懂秒杀90%知识点!
六万字 HTTP 必备知识学习,程序员不懂网络怎么行,一篇HTTP入门 不收藏都可惜
作为一名程序员,可能多数人都偏向于后端敲代码,但是关于Web的知识可千万不能忘呀!
呆呆敲代码的小Y
2022/05/10
9620
六万字 HTTP 必备知识学习,程序员不懂网络怎么行,一篇HTTP入门 不收藏都可惜
关于 Cookie,了解这些就足够了
Cookie 是用户浏览器保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
皮小蛋
2020/03/02
1.9K0
cookie面面观
在前端面试中,有一个必问的问题:请你谈谈cookie和localStorage有什么区别啊?
前端林子
2018/09/08
3K0
cookie面面观
全面解读HTTP Cookie
今天webryan给team做了一个关于HTTP cookie的分享,从各个方面给大家介绍一下大家耳熟能详的Cookie。主要是翻了维基百科的很多内容,因为维基百科的逻辑实在是很清晰:),ppt就不分享了,把原始的草稿贴出来给大家。欢迎批评指正。
j_bleach
2019/07/02
1K0
【HTTP】浅谈Cookie与Session那些事
这时候,我们就需要通过cookie来对用户的身份进行标识了,用户每次对服务器发起请求时,都带上自己独有的cookie,服务器通过读取cookie信息,识别用户。
一名白帽的成长史
2019/10/08
1.7K0
【HTTP】浅谈Cookie与Session那些事
一文带你深入理解 HTTP
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,“超文本”即不仅仅是文本,还可以传输HTML 文件, 图片文件等。
杰哥的IT之旅
2020/06/18
3.3K0
一文带你深入理解 HTTP
实用,完整的HTTP cookie指南
cookie 是后端可以存储在用户浏览器中的小块数据。 Cookie 最常见用例包括用户跟踪,个性化以及身份验证。
前端小智@大迁世界
2020/08/26
6.7K0
实用,完整的HTTP cookie指南
通过XSS跨子域拿到受HttpOnly保护的Cookie
因为浏览器同源策略的关系,只有同协议、域名、端口的页面才能进行交互,否则会被浏览器拒绝。现有两个页面,分别为111.example.com和example.com,两个页面是不同的域名,不能进行交互,但是可以在111.example.com使用以下代码设置同域,这样即可实现一个跨子域的交互。
潇湘信安
2021/07/01
2K0
【安全】 Cookie
后面会把前端进阶的课程内容都总结一遍。有些都是很常见的知识,但是为了梳理自己的知识树,所以尽量模糊的地方都会记录
神仙朱
2020/02/17
1.5K0
面试官:说下Cookie和Session的关系和区别
在技术面试中,经常被问到“Cookie和Session的区别”,大家都知道一些,Session比Cookie安全,Session是存储在服务器端的,Cookie是存储在客户端的,然而如果让你更详细地说明,恐怕就不怎么清楚了。
公众号 IT老哥
2021/01/14
16.6K0
面试官:说下Cookie和Session的关系和区别
【在Linux世界中追寻伟大的One Piece】HTTP cookie
HTTP Cookie(也称为Web Cookie、浏览器Cookie或简称Cookie)是服务器发送到用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发送请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户偏好等。
枫叶丹
2024/12/06
2410
【在Linux世界中追寻伟大的One Piece】HTTP cookie
JS 如何创建、读取和删除cookie
Cookie 为 Web 应用程序保存用户相关信息提供了一种有用的方法。例如,当用户访问咱们的站点时,可以利用 Cookie 保存用户首选项或其他信息,这样,当用户下次再访问咱们的站点时,应用程序就可以检索以前保存的信息。
前端小智@大迁世界
2019/09/03
14.6K0
JS 如何创建、读取和删除cookie
小饼干Cookie的大魅力
早期互联网只是用于简单的页面浏览,并没有交互,服务器也无法知道不同的请求是否来自同一个浏览器,不知道某用户上一次做了什么。每次请求都是相互完全独立的,这也是 HTTP 协议无状态特征的表现。这种缺陷显然无法满足交互式 Web 发展的需求,Cookie 作为一种解决这一问题的方案,被当时最强大的网景浏览器公司提出。
天存信息
2021/06/21
8870
小饼干Cookie的大魅力
相关推荐
HTTP缓存机制与Cookie
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验