面试官:Cookies 的属性有哪些?

本文涉及的产品
.cn 域名,1个 12个月
简介: 大家好,我是前端西瓜哥。今天来学习一下 Cookie 的属性有哪些?以及有什么作用?

大家好,我是前端西瓜哥。今天来学习一下 Cookie 的属性有哪些?以及有什么作用?

Cookies 是浏览器本地保存数据的一种方案,且会在每次请求中带上该字段。

cookie 最常见的用法是作为用户登录凭证,赋予原本没有状态的 HTTP 协议以一种状态,让识别一个请求是哪一个用户发出成为可能。

HTTP 响应报文通过 Set-Cookie 头字段给浏览器给当前网站设置 cookie:

HTTP/1.1 200 OK
Set-Cookie: lang=en-US; Path=/
Set-Cookie: token=abcd; Max-Age=6000; Path=/; Expires=Thu, 28 Apr 2022 16:31:36 GMT; HttpOnly

当然也可以在浏览器用 JS 脚本通过 document.cookieCookieStore 来设置 cookie。

浏览器拿到 cookie 后,会将它们保存下来,在下一次请求时将这些 cookie 全放到 Cookie 请求头中,并用分号分隔:

GET / HTTP/1.1
Cookie: lang=en-US; token=abcd

需要特别注意的是,Cookie 的作用域是和 domain(域名或 ip)绑定的,端口无关

你问我怎么知道的?因为我本地开发时用 localhost 加上各种端口,结果任意一个端口的请求都会将其他所有端口的 cookie 给我带上,真的是离谱。

那么和协议(http: 以及 https:)有关吗?答案是:以前是和协议无关的,但近几年标准发生了改变,不同浏览器支持程度不同,可以看看下面这篇文章:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite#browser_compatibility

下面我们看看 cookie 的一些属性。

cookieName=cookieValue

Set-Cookie: token=abcd

设置 cookie 的名字和值,必填项。

HttpOnly

Set-Cookie: token=abcd; HttpOnly

设置后,只能通过 HTTP 响应报文的 Set-Cookie 来新增或更新 cookie ,客户端无法通过脚本的方式来读写 cookie。

对于敏感信息比如用户凭证,请一定要加上 HttpOnly。如果攻击者成功地实施了 XSS 攻击,会因为无法读取 cookie 而拿不到敏感信息。

Expires

Set-Cookie: token=abcd; Expires=Fri, 29 Apr 2022 05:29:01 GMT

cookie 的过期时间点,使用了 GMT 时间格式的字符串。

值必须符合下面格式:

<day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT

Max-Age

Set-Cookie: token=abcd; Max-Age=6000

cookie 的有效时间长度,单位为秒。通过设置小于等于 0 的数字,可以让一个 cookie 失效。

如果 Max-Age 和 Expires 同时存在,以 Max-Age 为准。

如果 Expires 和 Max-Age 都没设置,cookie 的有效期就会设置为 session, 一种临时会话状态,会在浏览器关闭时销毁。不过也不总是这样,这个得看浏览器实现,总之不会保存太久就是了。

Path

Set-Cookie: lang=en-US; Path=/user

设置 cookie 的路径作用域。

怎么理解?

我们以上面示例为例,浏览器会将名为 lang 的 cookie 保存到当前域名下。但之后请求时,会判断路径是否匹配 /user,来决定是否带上 cookie。

  • / :不会带上名为 lang 的 cookie
  • /user:会带上
  • /user/1:会带上
  • /user2:不会带上

另外,需要注意的是,可能会有 Path 不同的复数个同名 cookie。

image.png

如果请求路径都匹配上了,不同 Path 下的多个同名 cookie 都会被发送:

GET /user HTTP/1.1
Cookie: lang=user-dir; lang=root

理论上,如果 Set-Cookie 没有指定 Path,就会被设置为当前请求的路径。不过实际用 Chrome 测试时,我发现都被设置为 / 了,看来浏览器也只是选择性遵守 HTTP 协议?

不过实际开发时我们都是直接使用 Path=/,简单粗暴覆盖所有路径,没有必要分路径,让事情变得复杂。上面的知识点,大家简单了解就好。

Domain

Set-Cookie: lang=en-US; Domain=.a.com

设置 cookie 的 domain 作用域。

在不提供该属性的情况下,会使用请求时的 domian,比如 http://www.a.com/api/v1/books 不设置 Domain 时,拿到的 cookie 的 Domain 属性会被设置为 www.a.com

通常我们会省略掉 Domain 属性。

但在希望多个子域名共享 cookie 的场景下,比如 sub1.a.comsub2.a.com(或者再加上父域名 a.com),就需要显式将其设置为 .a.com。开头的小圆点可写可不写,都一样。

如果 Domain 不能覆盖当前域名,该 cookie 会被认定为无效,然后被丢弃掉。

Secure

Set-Cookie: token=en-US; Secure

该属性没有值,属性本身存在就代表设置为安全模式

即请求必须为安全连接(HTTPS),cookie 才会被保存下来。HTTP 协议下,cookie 无效。

SameSite

Set-Cookie: token=abcd; SameSite=Strict

cookie 在跨域时是否应该被发送。

  • Strict:跨域请求严禁携带本站 cookie。
  • Lax:默认值。可通过顶级导航的方式并使用 GET 请求发时可以携带(目前我没有通过 demo 实现该效果,或者我们可以将其无限接近于 Strict)。在 Chrome 80 版本之后,Cookie 的 SameSite 由原来的 None 改为了 Lax。
  • None:会携带 cookie。但前提是 Secure 设置为 true,即只能在 HTTPS 协议下使用(之前的标准没有这个要求)。

结尾

以上就是 Cookie 可以设置的所有属性,学废了吗?反正我是麻了。

我是前端西瓜哥,欢迎关注我,学习前端不迷路。

相关文章
|
安全 测试技术
软件测试面试题:cookies机制和session机制的区别
软件测试面试题:cookies机制和session机制的区别
94 0
|
存储 JavaScript 前端开发
面试必问的Cookies,你知道多少 【1】
面试必问的Cookies,你知道多少 【1】
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
17 4
|
1天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
59 2
|
1月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
27 0
|
3月前
|
存储 安全 Java
这些年背过的面试题——Java基础及面试题篇
本文是技术人面试系列Java基础及面试题篇,面试中关于Java基础及面试题都需要了解哪些内容?一文带你详细了解,欢迎收藏!
|
3月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
3月前
|
Java
【Java基础面试三十七】、说一说Java的异常机制
这篇文章介绍了Java异常机制的三个主要方面:异常处理(使用try、catch、finally语句)、抛出异常(使用throw和throws关键字)、以及异常跟踪栈(异常传播和程序终止时的栈信息输出)。