【HTTP服务端】Cookie?Session?Token?

文章目录

  • cookie与session
  • token
    • 什么是JWT?
    • JWT的组成结构
      • 1. Header(头部)
      • 2. Payload(负载)
      • 3. Signature(签名)
    • JWT工作原理
    • JWT的特点
    • 安全注意事项

cookie与session

cookie有哪些属性

  1. 键值对(必需)
  • name=value:Cookie 的核心内容,如 session_id=12345
  1. 作用域控制
  • Domain:指定 Cookie 可被发送到的域名(如 Domain=example.com),子域名默认继承。
  • Path:指定 Cookie 可被发送到的路径(如 Path=/api),子路径默认继承。
  1. 有效期
  • Expires:指定 Cookie 的具体过期时间(如 Expires=Wed, 21 Oct 2025 07:28:00 GMT)。
  • Max-Age:指定 Cookie 的有效秒数(如 Max-Age=3600 表示 1 小时后过期)。
  1. 安全属性
  • Secure:仅在 HTTPS 连接下发送 Cookie。
  • HttpOnly:禁止 JavaScript 访问 Cookie(防 XSS 攻击)。
  • SameSite:控制跨站请求时 Cookie 的发送策略:
    • Strict:仅允许同源请求携带 Cookie。
    • Lax:允许部分安全的跨站请求(如链接跳转)。
    • None:允许所有跨站请求(需配合 Secure 属性)。
  1. 其他
  • Priority(Chrome 特有):指定 Cookie 的优先级(Low/Medium/High)。
  • Partitioned(实验性):隔离不同站点的 Cookie 存储(防跨站追踪)。

示例

Set-Cookie: session_id=12345; Domain=example.com; Path=/; Expires=Wed, 21 Oct 2025 07:28:00 GMT; Secure; HttpOnly; SameSite=Lax

cookie原理

http客户端向服务端发请求,服务端通过http响应返回给客户端如usrname=xxx pswd=xxx,客户端在后续请求中携带该字段,从而让服务端识别。

从安全性等角度演变为session

http客户端向服务端发请求,服务端针对该客户端生成一个唯一标识,通过http响应返回给客户端,客户端在后续请求中携带该字段,从而让服务端识别。【该唯一标识sessionid通常是一个“数据”的标识,该“数据”存储了该用户的信息,该sessionid通常存在redis集群,不同服务器在负载均衡时去redis查】

该唯一标识的内容设成什么?

服务端可以根据用户名和密码和一些环境信息基于某种算法生成

该值保存在哪

保存在客户端,分为内存级【会话关闭cookie消失】和磁盘级【cookie过期后消失】

如何实现会话管理?服务端需要存储哪些信息?

  1. 服务端对于客户端发来cookie的value,将value和用户的唯一标识如user_id建立映射,从而可以获取该用户相关信息如用户登录状态,用户权限信息,用户登陆ip,用户使用设备,用户临时上下文(浏览部分,购物车临时数据)
  2. 其他信息:会话创建,过期,活跃时间;

token

为防止客户端发送的session id被伪造,需对其合法性进行验证。可采用令牌(token)机制,在用户登录后发放包含其user id的token,用户后续请求时通过Http header携带该token。为避免伪造,用HMAC-SHA256算法结合仅服务端知晓的密钥对数据签名,将签名与数据一同作为token,因密钥保密,他人无法伪造。服务端不保存token,接收后用相同算法和密钥重新计算签名并与token中的签名比对,相同则确认用户合法登录并获取user id,不同则判定数据被篡改。需注意,token数据经Base64编码(非加密),明文可见,不可包含密码等敏感信息,且token被盗与session id被盗风险类似。这种不保存session id仅生成和验证token的无状态机制,能减轻服务器存储负担,便于机器集群水平扩展。【token解决了服务端需要存储大量的sessionid造成的空间成本,通过token中的user_id直接去数据库查询用户相关信息】

什么是JWT?

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传输声明(claims)作为JSON对象。它通常用于身份验证和信息交换。

JWT的组成结构

一个JWT由三部分组成,用点号(.)分隔:

Header.Payload.Signature

1. Header(头部)

包含令牌类型(typ)和签名算法(alg),例如:

{"alg": "HS256","typ": "JWT"
}

2. Payload(负载)

包含声明(claims),声明是关于实体(通常是用户)和其他数据的语句。有三种类型的声明:

  • 注册声明(预定义):如iss(签发者)、exp(过期时间)、sub(主题)等
  • 公共声明:可以自定义,但应避免与已注册声明冲突
  • 私有声明:用于在同意使用它们的各方之间共享信息

示例:

{"sub": "1234567890","name": "John Doe","admin": true,"iat": 1516239022
}

3. Signature(签名)

使用编码后的header、payload、一个密钥和header中指定的算法生成。例如使用HMAC SHA256算法:

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

JWT工作原理

  1. 认证流程

    • 用户登录,服务器验证凭证
    • 服务器创建JWT并返回给客户端
    • 客户端存储JWT(通常在localStorage或cookie中)
    • 客户端在后续请求的Authorization头中携带JWT
    • 服务器验证JWT并处理请求
  2. 验证过程

    • 服务器收到JWT后,会重新计算签名
    • 比较计算的签名与JWT中的签名是否一致
    • 验证过期时间等声明

JWT的特点

  • 无状态:服务器不需要存储会话信息
  • 可验证:签名确保令牌未被篡改
  • 包含信息:payload可以包含用户基本信息
  • 跨域友好:适合单点登录和分布式系统

安全注意事项

  • 不要将敏感信息放入JWT(除非加密)
  • 使用HTTPS传输
  • 设置合理的过期时间
  • 考虑使用刷新令牌机制
  • 防范CSRF攻击(如果存储在cookie中)

JWT是现代Web应用和API中广泛使用的身份验证机制,特别适合RESTful API和无状态服务架构。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装Git

Git安装避坑指南技术 操作系统选择与准备 Windows用户需注意系统版本兼容性,建议使用Windows 10及以上版本 Mac用户需检查是否安装Xcode Command Line Tools Linux用户需区分apt/yum等包管理器命令差异 安装包下载注意事项 从官方渠道(git-scm.com&a…

UDP服务器的优缺点都包含哪些?

UDP协议不需要像TCP协议那样进行复杂的连接建立与拆除过程,在进行传输数据信息的过程中,应用层将数据交给UDP层,UDP层直接加上首部就发往网络层,极大地减少了处理时间和资源消耗。例如在一些简单的网络监控程序中,只是…

sqli-labs靶场通关笔记:第7-8关 布尔盲注

第七关1.审题这里判断出是))闭合,但是页面只有正确和错误的回显状态,报错的回显也是固定的,没有显示报错具体信息。这关使用的方法是布尔盲注。为什么叫布尔盲注?因为它返回的结果只有true和false 两个值,攻击者需要通…

理解支持向量机(SVM):理论、数学和实现的综合指南

支持向量机(SVMs)是强大的监督学习算法,用于分类和回归任务,尽管它们主要用于分类。由Vladimir Vapnik及其同事在1990年代引入,SVMs基于统计学习理论,特别适用于需要将数据点稳健分离到不同类别的任务。本博…

使用Navicat对PostgreSQL数据表添加列,自动记录当前行的添加日期

点开表设计,向如下这样一个字段: 字段名称可以自定义,博主这里叫做:add_date_time类型选择:timestamp长度写成:6默认值输入:CURRENT_TIMESTAMP 添加行:默认值:

VR协作海外云:跨国企业沉浸式办公解决方案

随着全球化进程加速,VR协作海外云正成为跨国企业数字化转型的核心解决方案。本文将深入解析这项技术如何突破地理限制,实现沉浸式远程协作,并探讨其在跨文化团队管理、实时3D数据交互等场景中的独特优势。 VR协作海外云:跨国企业沉…

[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)

ps:这是你为了点灯最繁琐的一次 1.软件下载 vscode下载地址:Documentation for Visual Studio Codeesp_idf下载地址:https://dl.espressif.cn/dl/esp-idf/?idf4.4 (从上往下第三) 2.软件安装 可以均默认安装,但建议不要放在C盘&…

tailwindcss详解

Tailwind CSS 详解:实用主义的现代 CSS 框架 Tailwind CSS 是一个功能优先(utility-first)的 CSS 框架,它通过提供低级别的实用类来快速构建自定义设计,而无需离开 HTML 文件。以下是全面解析: 一、核心概念…

[spring6: TypeFilter MetadataReader MetadataReaderFactory]-源码解析

源码 MetadataReaderFactory MetadataReaderFactory 是用于创建 MetadataReader 实例的工厂接口,支持通过类名或资源读取类的元数据并可实现缓存优化。类型类/接口名功能描述是否需要加载类访问方式抽象接口AnnotatedTypeMetadata访问某类型(类或方法&am…

基于redis的分布式session共享管理之销毁事件不生效问题

一、前言首先介绍下分布式session共享管理在Springboot项目中,经常提到分布式的概念,当实际部署应用后,多台服务器各自存储用户登录会话无法共享,导致操作A按钮还是正常,操作B按钮就提示登录过期需要重新登录。这是因为…

技术面试问题总结二

一、lvs的四种工作模式: LVS 有四种主要工作模式:NAT 模式、DR 模式、TUN 模式和Full-NAT 模式 1、NAT模式: 工作原理 LVS 作为客户端和真实服务器(RS)之间的中间节点,接收客户端请求后,修改请求的目标…

软考(软件设计师)软件工程-软件过程模型,敏捷开发

软件过程模型 瀑布模型 #mermaid-svg-daxck2eQmqfYelkV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-daxck2eQmqfYelkV .error-icon{fill:#552222;}#mermaid-svg-daxck2eQmqfYelkV .error-text{fill:#552222;stro…

MySQL 中图标字符存储问题探究:成因、解决方案及单字段编码调整的利弊分析——仙盟创梦IDE

在 MySQL 数据库应用中,常出现无法正确保存图标字符,读出时显示为 “????” 的问题。本文深入剖析了该问题产生的原因,主要涉及字符编码设置不匹配等因素。同时,提出了全面的解决方案,包括全局和单字段的字符编码调…

快速上手UniApp(适用于有Vue3基础的)

作为一位有Vue3基础的开发者,学习UniApp将会是一个相对平滑的过程。UniApp是一个使用Vue.js开发跨平台应用的前端框架,可以编译到iOS、Android、H5以及各种小程序平台。 一、UniApp简介 UniApp是基于Vue.js的跨平台开发框架,具有以下特点&a…

background和background-color的区别

前言:由于全局切换变量时,发现空页面按钮变量颜色未生效,审查元素发现变量未定义。实际上是背景色由纯色变成了渐变色,而background-color不支持渐变色导致变量不生效特性backgroundbackground-color功能设置‌所有‌背景属性&…

Vue Vue-route (5)

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue-route History模式和路由懒加载 目录 History模式 设置history模式 后端配置 Apache 路由懒加载 配置 总结 History模式 设置history模式 Vue-route默认hash模式——使用URL的hash来模拟一个完整的URL&#xff0c…

家用智能摄像机PRV文件删除的恢复方法

家用智能摄像头一般采用的是mp4或者mov视频方案,这一类方案文件通用性强、使用简单,以MP4为例无论是APP在线播放还是TF卡接电脑查看都很轻松。即便如此,有些厂商还是走上了“自定义”的道路,自定义的文件结构导致无法正常播放&…

聊下easyexcel导出

直接上干货&#xff0c;首先pom文件引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>接下来是java代码 public void export(List<Liquidity…

[Python] Flask 多线程绘图时报错“main thread is not in main loop”的解决方案

在构建基于 Flask 的后端服务过程中,使用 matplotlib 绘图时,很多开发者会遇到一个经典的运行时错误: RuntimeError: main thread is not in main loop这通常出现在服务开启多线程时调用 matplotlib,本文将从原理、解决方式到部署建议进行全面解析。 一、问题来源:matpl…

dbEaver连接hbase,各种问题的终极解决

网上有不少文章&#xff0c;但基本都不行&#xff0c;主要还是hbase版本和phoenix版本的问题&#xff0c;经我测试&#xff0c;如下方法保证能连接成功。 1、下载phoenix: https://phoenix.apache.org/download.html 要选择和你的hbase版本对应的版本。 2、解压phoenix-hbase-2…