理解HTTP中的Cookie与Session:机制、安全性与报头响应

文章目录

  • 1. HTTP Cookie
    • 1.1. HTTP Cookie 工作流程
    • 1.2. Cookie 分类
    • 1.3. 安全性
    • 主要用途
  • 2. Set-Cookie 报头
    • 2.1. Set-Cookie 格式
    • 2.2. 生命周期
  • 3. HTTP Session
    • 3.1. 工作流程
    • 3.2. 安全性
    • 3.3. 超时 与 失效
    • 3.4. 用途


1. HTTP Cookie

HTTP Cookie(也称为 Web Cookie、浏览器 Cookie)是服务器发送到用户浏览器并保存在浏览器上的一块数据。主要功能如下:

  • 状态保持:告知服务器两个请求是否来自同一浏览器,例如保持用户的登录状态。
  • 用户偏好:记录用户的偏好设置,如语言选择、主题样式等。

在浏览器向同一服务器再次发起请求时,Cookie 会被携带并发送到服务器上,以实现个性化服务和状态管理。


1.1. HTTP Cookie 工作流程

  1. 首次访问

    • 在用户第一次访问网站时,服务器会在响应的 HTTP 头中设置 Set-Cookie 字段,用于发送 Cookie 到用户的浏览器。
  2. 存储 Cookie

    • 浏览器在接收到 Cookie 后,会将其保存在本地(通常是按照域名进行存储)。
  3. 后续请求

    • 在之后的请求中,浏览器会自动在 HTTP 请求头中携带 Cookie 字段,将之前保存的 Cookie 信息发送给服务器。

比如对于edge浏览器,我们可以通过任一浏览器的左上角按钮查看cookie信息:

在这里插入图片描述
在这里插入图片描述

可以看到在上面的cookie信息中,有一些属性如路径,期限等;


1.2. Cookie 分类

  1. 会话 Cookie(Session Cookie)

    • 在浏览器关闭时失效。
    • 主要用于临时存储用户会话数据。
  2. 持久 Cookie(Persistent Cookie)

    • 带有明确的过期日期或持续时间,可以跨多个浏览器会话存在。
    • 如果 Cookie 是一个持久性的 Cookie,那么它实际上是浏览器相关的,存储在特定目录下的一个文件。
  3. 存储格式

    • 持久 Cookie 通常以二进制或 SQLite 格式存储,直接查看这些文件可能会看到乱码或无法读取的内容。
    • 一般情况下,可以通过浏览器的相关选项直接查看 Cookie。

1.3. 安全性

根据上面的内容,我们知道Cookie是存储在客户端中的,存在被篡改或窃取的风险;

主要用途

  1. 用户认证和会话管理(重要):

    • 确保用户在不同请求之间的身份验证和会话状态。
  2. 跟踪用户行为

    • 记录用户在网站上的活动,以便进行分析和优化。
  3. 缓存用户偏好

    • 保存用户的个性化设置和偏好,以提供更好的用户体验。
  4. 查看 Cookie

    • 在一些浏览器中,可以直接通过设置 查看和管理存储的 Cookie。

2. Set-Cookie 报头

HTTP 存在一个报头选项:Set-Cookie,用于给浏览器设置 Cookie 值。

  • 添加方式

    • 在 HTTP 响应头中添加 Set-Cookie 字段。
  • 客户端处理

    • 客户端(如浏览器)接收到该字段后,会获取、设置并保存 Cookie。

2.1. Set-Cookie 格式

下面举一个具体的Set-Cookie的实例:

Set-Cookie: sessionId=abc123; Path=/; Domain=example.com; Expires=Wed, 21 Oct 2024 07:28:00 GMT; Secure; HttpOnly; SameSite=Strict

需要注意的是,set-Cookie 的时间格式必须遵守 RFC 1123 标准, 具体格式样例: Tue, 01 Jan 2030 12:34:56GMT 或者 UTC。

各部分解释:

属性描述
名称和值sessionId=abc123Cookie 的名称和值
Path/指定 Cookie 的有效路径,表示在整个网站中有效
Domainexample.com指定 Cookie 的有效域名,仅在该域名及子域名中有效
ExpiresWed, 21 Oct 2024 07:28:00 GMT指定 Cookie 的过期日期和时间
Max-Age86400指定 Cookie 的最大存活时间(以秒为单位)
Secure仅在安全的 HTTPS 连接中发送 Cookie
HttpOnly防止客户端脚本访问该 Cookie,增强安全性
SameSiteStrict限制跨站请求时 Cookie 的发送,仅在同源请求中发送

根据上面的实例,对于Set-Cookie的格式有以下要求:

  • 每个 Cookie 属性都以分号(;) 和空格( ) 分隔。
  • 名称和值之间使用等号(=) 分隔。
  • 如果 Cookie 的名称或值包含特殊字符(如空格、 分号、 逗号等) , 则需要进行 URL 编码。

2.2. 生命周期

  1. 如果设置了 expires 属性, 则 Cookie 将在指定的日期 / 时间后过期。
  2. 如果没有设置 expires 属性, 则 Cookie 默认为会话 Cookie, 即当浏览器关闭时过期。

另外,以安全性考虑,在使用cookie时可以采用下面的方法:

  1. 使用 HttpOnly:设置此标志可防止客户端脚本(如 JavaScript)访问 Cookie,降低跨站脚本攻击的风险。

  2. 设置 Secure:仅在 HTTPS 连接中发送 Cookie,确保数据在传输过程中加密。

  3. 使用 SameSite:设置为 StrictLax,限制跨站请求时 Cookie 的发送,减少跨站请求伪造攻击的风险。

  4. 设置短期有效期:通过 ExpiresMax-Age 将 Cookie 设置为短期有效,降低被窃取后利用的风险。

  5. 定期轮换 Cookie:定期更新 Cookie 的值和相关信息,增加安全性。


对于一般的信息,可以使用Cookie,但对于一些私密性较高的数据,比如用户密码, 浏览痕迹等,如果使用Cookie保存在客户端,很容易被窃取造成泄露,为了避免这一情况,我们引入了Session的概念


3. HTTP Session

HTTP Session 是服务器用来跟踪用户与服务器交互期间用户状态的机制。 由于 HTTP 协议是无状态的(每个请求都是独立的) , 因此服务器需要通过 Session 来记录用户的信息


3.1. 工作流程

  1. 当用户首次访问网站时, 服务器会为用户创建一个唯一的 Session ID, 并通过 Cookie 将其发送到客户端。
  2. 客户端在之后的请求中会携带这个 Session ID, 服务器通过 Session ID 来识别用户, 从而获取用户的会话信息。
  3. 服务器通常会将 Session 信息存储在内存、 数据库或缓存中

3.2. 安全性

  • Cookie 相似, 由于 Session ID 是在客户端和服务器之间传递的, 因此也存在被窃取的风险。但是一般虽然 Cookie 被盗取了, 但是用户只泄漏了一个 Session ID, 私密信息暂时没有被泄露的风险;

  • Session ID 便于服务端进行客户端有效性的管理, 比如异地登录。
    也可以通过 HTTPS 和设置合适的 Cookie 属性(如 HttpOnlySecure) 来增强安全性。


3.3. 超时 与 失效

Session 也可以设置超时时间, 当超过这个时间后, Session 会自动失效。
同时服务器也可以主动使 Session 失效;


3.4. 用途

  • 用户认证和会话管理
  • 存储用户的临时数据(如购物车内容)
  • 实现分布式系统的会话共享(通过将会话数据存储在共享数据库或缓存中)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916654.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【电脑】解决DiskGenius调整分区大小时报错“文件使用的簇被标记为空闲或与其它文件有交叉”

【电脑】解决DiskGenius调整分区大小时报错“文件使用的簇被标记为空闲或与其它文件有交叉” 零、报错 在使用DiskGenius对磁盘分区进行调整时,DiskGenius检查出磁盘报错,报错信息:文件使用的簇被标记为空闲或与其它文件有交叉,…

redis linux 安装

下载解压 https://download.redis.io/releases/ tar -zvxf ----redis-7.4.1编译 进入目录下 # redis 依赖c yum install gcc-cmake可能会有问题,所以记得换源# 安装到 /usr/local/redis make PREFIX/usr/local/redis installcd src ./redis-serverredis.confi…

TG2016SLN爱普生38.400000MHz温度补偿振荡器X1G005731070216

在电子电路系统中,频率如同心脏跳动的节奏,为整个系统的有序运行提供基本节拍。38.4MHz 这个频率在众多电子应用场景中有广泛的用途。在数字电路领域,它可以作为时钟信号,为微处理器、微控制器等核心芯片提供稳定的工作频率&#…

LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)

1. 背景介绍 在数据分析和图像处理领域,经常需要查找给定点的最近邻居点。在LabVIEW中,计算二维平面上多个点之间的欧氏距离,并返回距离最近的几个点是一种常见操作。find_nearest_neighbors 函数用于实现这个功能。 2. 欧氏距离计算 在二维…

【Rust 编程语言工具】rustup-init.exe 安装与使用指南

rustup-init.exe 是用于安装和管理 Rust 编程语言工具链的 Windows 可执行文件。Rust 是一种系统级编程语言,旨在提供安全、并发和高性能的功能。rustup-init.exe 是官方提供的安装器,用于将 Rust 安装到 Windows 操作系统中,并配置相关环境。…

道陟科技EMB产品开发进展与标准设计的建议|2024电动汽车智能底盘大会

11月12日,2024电动汽车智能底盘大会在重庆开幕。会议由中国汽车工程学会主办,电动汽车产业技术创新战略联盟、中国汽车工程学会智能底盘分会、智能绿色车辆与交通全国重点实验室承办。本届大会围绕电动汽车智能底盘相关技术发展与融合,满足高…

【RabbitMQ】09-取消超时订单

生产者完成创建订单和扣减库存之后,发送消息到延迟队列。 // 3.清理购物车商品cartClient.deleteCartItemByIds(itemIds);// cartService.removeByItemIds(itemIds);// 4.扣减库存try {itemClient.deductStock(detailDTOS);//itemService.deductStock(detailDTOS);…

新版Apache tomcat服务安装 Mac+Window双环境(笔记)

简介:Tomcat服务器器的下载和安装: 安装前提 1)电脑需要有java环境,jdk8以上,否则启动不不成功 2)已经安装Sublime⽂文件编辑软件 3)window电脑需要显示⽂文件拓拓展名 官网(https:…

【数据结构与算法】查找

文章目录 一.查找二.线性结构的查找2.1顺序查找2.2折半查找2.3分块查找 三.树型结构的查找3.1二叉排序树1.定义2.二叉排序树的常见操作3.性能分析 3.2平衡二叉树1.定义2.平衡二叉树的常见操作3.性能分析 3.3B树1.定义2.B树的相关操作 3.4B树1.定义2.B树与B树的比较 四.散列表4.…

人工智能:塑造未来的工作与生活

目录 人工智能技术的应用前景与影响 人工智能的历史与现状 人工智能的应用领域 人工智能的前景与挑战 个人视角:人工智能的应用前景与未来 人工智能在生活中的潜力 面对人工智能带来的挑战 我的观点与建议 结语 人工智能技术的应用前景与影响 随着人工智能…

electron安装遇到的问题

在安装electron时, 我开始使用的是 git clone 命令安装的,之后进入文件夹再 npm install 就可以了,但是中间会出现问题, 安装的时候卡在 node install.js 命令行那里 git clone https://github.com/electron/electron-quick-star…

ADC输出码和输入电压转换关系

ADC输出码和输入电压转换关系 转换公式:ADC输出码(Vin / Vref) *2n 。其中Vin 是输入ADC芯片的电压,Vref是参考电压,n是ADC芯片的位数。 举个例子MS5182是一个16bit的ADC(21665536),参考电压Vref4.096V&a…

Leecode刷题C语言之最少翻转次数使二进制矩阵回文①

执行结果:通过 执行用时和内存消耗如下: 题目:最少翻转次数使二进制矩阵回文① 给你一个 m x n 的二进制矩阵 grid 。如果矩阵中一行或者一列从前往后与从后往前读是一样的,那么我们称这一行或者这一列是 回文 的。你可以将 grid 中任意格子…

【JavaScript】JavaScript开篇基础(6)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

音视频入门基础:MPEG2-TS专题(5)——FFmpeg源码中,判断某文件是否为TS文件的实现

一、引言 通过FFmpeg命令: ./ffmpeg -i XXX.ts 可以判断出某个文件是否为TS文件: 所以FFmpeg是怎样判断出某个文件是否为TS文件呢?它内部其实是通过mpegts_probe函数来判断的。从《FFmpeg源码:av_probe_input_format3函数和AVI…

微服务day07

MQ高级 发送者可靠性,MQ的可靠性,消费者可靠性。 发送者可靠性 发送者重连 连接重试的配置文件: spring:rabbitmq:connection-timeout: 1s # 设置MQ的连接超时时间template:retry:enabled: true # 开启超时重试机制initial-interval: 10…

艾体宝干货丨微突发流量检测与分析:IOTA让网络监控更精准

网络流量中的微突发问题常常难以察觉,但它们可能对网络性能产生显著影响。这篇文章深入探讨了如何利用IOTA来捕捉和分析微突发,帮助您快速有效地解决网络中的突发流量问题。 什么是微突发(Microburst)流量? 微突发是…

SQL 审核在 CloudQuery 的四大场景应用

数据库作为数据的核心载体,其安全性和稳定性对业务的影响至关重要。而在我们日常业务中,SQL 编写不当是引起数据库故障的一个重要原因,轻则影响数据库性能,重则可能直接导致「雪崩」。因此,SQL 审核作为 SQL 代码投入生…

uniapp: 微信小程序包体积超过2M的优化方法

一、问题描述 在使用uniapp进行微信小程序开发时,经常会遇到包体积超过2M而无法上传: 二、解决方案 目前关于微信小程序分包大小有以下限制: 整个小程序所有分包大小不超过 30M(服务商代开发的小程序不超过 20M) 单个…

Node.Js+Knex+MySQL增删改查的简单示例(Typescript)

数据库: CREATE DATABASE MyDB; CREATE TABLE t_users (user_id int(11) NOT NULL,user_name varchar(10) NOT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8; 项目结构: package.json如下,拷贝并替换你们本地的package.json后运行 npm install 命令安装所需要的依赖。…