👨‍💻
Hong's 前端笔记
  • 🌈About
  • JavaScript
    • 作用域
    • 闭包
    • this
      • bind()
    • 原型
      • Object.create()
      • 模拟“类”
      • ES6 Class
      • Function
    • 对象
    • 类型 & 值
      • 原生函数
      • 数组
      • 字符串
    • 异步
    • JavaScript 相关概念
      • Event Loop 事件循环
      • Prototype 原型
      • Context 执行上下文
      • this
      • Promise
    • JavaScript 常见问题
      • 手写实现
      • 看代码输出
  • React
    • 核心概念
    • 深入理解
      • State
      • 如何管理 State
      • React 渲染过程
      • 处理 DOM 事件
      • Pure 组件
      • Context
      • Key 属性
      • React.lazy()
      • Render Props
    • Hooks
      • useState
      • useRef
      • useEffect
        • Some details
      • 相关概念
      • 自定义 Hook
      • useEffect vs useLayoutEffect
    • React 相关问题
      • Class vs Function
  • React Libraries
    • Redux
      • Quick Start
      • 如何持久化 Redux 数据
      • 异步操作
      • 性能优化
      • Dive into immutability
    • Route v6
      • Quick Start
  • Reactivity
    • Immer
  • Vue
    • 深入理解
      • Composition vs Options
      • Reactivity
  • Network
    • Cookies
    • HTTP
    • HTTPS
    • CORS 跨域资源共享
    • 认证手段
    • 安全相关
    • 网络相关知识
  • Browser
    • DOM 操作
    • Events 事件
    • XHR & Fetch
    • 性能优化
    • HTML 相关概念
    • 浏览器相关概念
  • CSS
    • 盒模型
    • Layout 布局
    • Styles 样式
    • CSS 相关概念
    • CSS 相关技巧
      • 移动端适配
      • Flex
      • 动画
  • TypeScript
    • Quick Peek
    • Types in TypeScript
    • Narrowing
    • Functions in TypeScript
  • Workflow
    • Webpack
      • Webpack 概念
      • 资源管理
      • 管理输出
      • 开发环境配置
      • 生产环境配置
      • 优化代码运行性能
  • Others
    • 小程序与原生 Web 的区别
  • SSO
    • About
    • API Doc
    • 接入指南
Powered by GitBook
On this page
  • 机制
  • Cookie 属性
  • 创建 Cookie
  • Cookie 生命周期
  • Cookie 安全性
  • Cookie 作用域
Edit on GitHub
  1. Network

Cookies

Last updated 3 years ago

机制

  1. 客户端向服务器发送请求

  2. 服务器返回数据,并设置 Cookie

  3. 之后客户端请求中都会带着 Cookie

🔹 随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。由于服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API已经允许开发者直接将数据存储到本地

Cookie 属性

属性
描述

Name

key

Value

Value

Domain

允许 Cookie 发送给的域名(默认情况下不包含子域名,但特别指定的话反而可以包含)

Path

允许 Cookie 发送的路径 (子路径也会匹配)

Exprires / Max-age

过期时间 (也可以是 session)

Size

大小

HttpOnly

如果设置成 true,js 无法获取 cookie,预防 xss 攻击

Secure

只能被 HTTPS 协议的请求发送给服务端,可以避免中间人攻击

Samesite

Cookie 在跨域时不会被发送

创建 Cookie

后端在 Response Headers 里设置 Set-Cookie,即可设置 Cookie

后端 API:

app.get('/', (req, res) => {
  res.cookie('foo', bar)
  res.send('OK')
})

Cookie 生命周期

Session / 持久性 (MaxAge)

🔹生命周期时间以客户端的时间为准

Cookie 安全性

  • Secure 仅允许 Cookie 通过 HTTPS 携带并发送请求,防止中间人攻击

  • HTTPOnly document.cookie 无法访问到,防止 XSS 攻击,(此类 cookie 多用作服务端,客户端不需要访问)

    通过 JS 创建的 cookie,不能设置 HTTPOnly 属性

  • SameSite:防止 CSRF 攻击

    • NONE :允许跨域发送

    • Strict:相同站点时才发送

    • Lax:(多数浏览器默认值)与 Strict 类似,大多数情况下不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。如下表:

    请求类型
    示例
    正常情况
    Lax

    链接

    <a href="..."></a>

    发送 Cookie

    发送 Cookie

    预加载

    <link rel="prerender" href="..."/>

    发送 Cookie

    发送 Cookie

    GET 表单

    <form method="GET" action="...">

    发送 Cookie

    发送 Cookie

    POST 表单

    <form method="POST" action="...">

    发送 Cookie

    不发送

    iframe

    <iframe src="..."></iframe>

    发送 Cookie

    不发送

    AJAX

    $.get("...")

    发送 Cookie

    不发送

    Image

    <img src="...">

    发送 Cookie

    不发送

Cookie 作用域

通过 domian 和 path 来控制 cookie 可以发送的作用域

例如下面设置了 path 作用域

/foo 请求的 path 设置为了 /foo,这个 cookie 不能被发送给 /bar

app.get('/foo', (req, res) => {
  res.cookie('foo', 'foo', {
    path: '/foo'
  })
  res.send('OK')
})

app.get('/bar', (req, res) => {
  res.send('OK')
})