【JAVA】】深入浅出了解cookie、session、jwt

文章目录

  • 前言
  • 一、首先了解http的cookie是什么?
    • Cookie 属性及其含义
      • 1. Name=Value
      • 2. Expires
      • 3. Max-Age
      • 4. Domain
      • 5. Path
      • 6. Secure
      • 7. HttpOnly
      • 8. SameSite
      • 示例
    • Cookie 分类
      • 1. Session Cookies
      • 2. Persistent Cookies
      • 3. First-Party Cookies
      • 4. Third-Party Cookies
  • 二、 Session
    • Session 工作机制
      • 原理:
      • 创建 Session:
      • 存储 Session 数据:
      • 使用 Session:
      • 销毁 Session:
    • session常用方法
  • Session 和 Cookie 的关系
    • 1. Cookie(客户端存储)
      • 定义:
      • 特点:
      • 用途:
      • 示例:
      • 局限性:
    • 2. Session(服务端存储)
      • 定义:
      • 特点:
      • 关键点:
    • 在这里插入图片描述
  • 三、认识JWT
    • 1.什么是JWT呢?
    • 2.JWT 的核心结构
      • Header(头部)
      • Payload(负载)
      • Signature(签名)
    • 3.JWT 的工作流程
      • 用户登录
      • 客户端存储 JWT
      • 后续请求
      • Token 过期或失效
    • 4.JWT 与 Session 的核心区别
    • 5.JWT 的优缺点
      • 优点
      • 缺点
      • 注意(JWT 安全实践):
    • 5.JWT 与 Session 的选择场景
  • 总结
      • 引用参考:


前言

本文章主要介绍cookie、session、jwt,帮你快速了解它们的原理和区别,适合新手初步快速了解这部分的基础概念和知识。


一、首先了解http的cookie是什么?

Cookie 是一种在客户端(通常是浏览器)与服务器之间交换数据的方式,主要用于维持用户的状态信息。根据其用途和特性,Cookie 可以分为不同的类别,并且每个 Cookie 都可以设置多个属性来控制其行为。
可以用于跟踪用户与网站的互动、存储用户相关信息以及保持用户状态等,这样当请求携带 cookie 时,信息会被读取以帮助网站记住用户的访问信息和偏好设置,使得网站能够为用户提供个性化的浏览体验,并可以用于追踪用户在网站上的行为。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。
在这里插入图片描述
cookie由于是客户端保存,所以一般不会保存敏感信息。

Cookie 属性及其含义

以下是设置 Cookie 时可以使用的常见属性:

1. Name=Value

描述:指定 Cookie 的名称和值。
示例:

Set-Cookie: sessionId=abc123

2. Expires

描述:指定 Cookie 过期的具体日期和时间(GMT 格式)。如果没有设置,则为 Session Cookie。
示例:

Set-Cookie: sessionId=abc123; Expires=Wed, 21 Oct 2025 07:28:00 GMT

3. Max-Age

描述:指定 Cookie 多少秒后过期。如果同时设置了 Expires 和 Max-Age,Max-Age 优先级更高。
示例:

Set-Cookie: sessionId=abc123; Max-Age=3600

4. Domain

描述:指定哪些域名可以访问该 Cookie。默认情况下,只能由设置它的域名访问。设置 Domain 属性后,不仅当前域名下的页面可以访问这个 Cookie,指定的域以及其子域也能访问。例如,如果一个Cookie 的 Domain 属性被设置为 example.com ,那么 www.example.com 和subdomain.example.com 等都可以访问这个 Cookie。这有助于跨子域共享 Cookie信息,但也需要谨慎使用以避免安全问题。
示例:

Set-Cookie: sessionId=abc123; Domain=.example.com

5. Path

描述:指定 Cookie 可用的路径。只有位于该路径下的页面才能访问此 Cookie。如果设置了 Path=/blog ,那么只有网址下的 /blog 目录及其子目录中的页面能够访问这个 Cookie。这有助于限制 Cookie 的访问范围,确保只有特定部分的网站可以使用该 Cookie,从而提高网站的安全性和数据的准确性。
示例:

Set-Cookie: sessionId=abc123; Path=/admin

6. Secure

描述:指示浏览器仅通过 HTTPS 协议发送此 Cookie。Secure 属性设置后,Cookie 只会在 HTTPS 请求中被发送。这有助于防止 Cookie 在数据传输过程中被窃听,增强了用户数据的安全性。
示例:

Set-Cookie: sessionId=abc123; Secure

7. HttpOnly

描述:防止 JavaScript 访问此 Cookie(通过 document.cookie),有助于防范 XSS 攻击。
示例:

Set-Cookie: sessionId=abc123; HttpOnly

8. SameSite

描述:控制是否允许跨站请求携带此 Cookie。有三个可能的值:
Strict:完全禁止跨站请求携带此 Cookie,只允许来自相同站点的请求发送 Cookie。
Lax:仅允许某些“安全”的跨站请求(如 GET 请求)携带此 Cookie,例如从其他网站导航到链接的情况。
None:允许跨站请求携带此 Cookie,但必须与 Secure 标志一起使用。

不设置SameSite属性和将SameSite设置为None在效果上不完全相同,未明确设置 SameSite 属性时,浏览器可能会使用默认行为,这在不同的浏览器和版本中可能有所不同。而明确将 SameSite 设置为 None 则指示浏览器在所有跨站请求中发送 Cookie,但这必须与 Secure 属性一起使用,以确保Cookie仅通过 HTTPS传输。因此,明确设置提供了更明确的控制和跨浏览器的一致性。

示例:

Set-Cookie: sessionId=abc123; SameSite=Lax

示例

假设你有一个网站需要设置一个 Cookie 来记住用户的语言偏好,并确保这个 Cookie 只能通过 HTTPS 发送且不能被 JavaScript 访问:

Set-Cookie: language=en-US; Expires=Wed, 21 Oct 2025 07:28:00 GMT; Secure; HttpOnly; Path=/; SameSite=Lax

在这个例子中:

language=en-US 指定了 Cookie 的名称和值。
Expires 设置了 Cookie 的过期时间。
Secure 确保 Cookie 只能通过 HTTPS 发送。
HttpOnly 防止 JavaScript 访问此 Cookie。
Path=/ 表示此 Cookie 对整个站点都可用。
SameSite=Lax 控制跨站请求的行为。

Cookie 分类

1. Session Cookies

定义:这些 Cookie 在用户的会话期间存在,当浏览器关闭时通常会被删除(除非设置了过期时间)。它们不包含 Expires 或 Max-Age 属性。
用途:主要用于短期存储用户状态信息,如登录状态或临时购物车内容。
特点:依赖于浏览器会话,没有持久化存储。

2. Persistent Cookies

定义:这些 Cookie 具有明确的有效期,即使关闭浏览器后仍然存在。通过 Expires 或 Max-Age 属性设置过期时间。
用途:用于长期保存用户偏好设置、跟踪信息等。
特点:可以在多次会话之间保持有效,直到达到设定的过期时间。

3. First-Party Cookies

’定义:由用户正在访问的网站直接设置的 Cookie。
用途:主要用于个性化体验、记住用户偏好、维持会话状态等。
特点:只能被设置它的域名访问。

4. Third-Party Cookies

定义:由第三方域(如广告网络或社交媒体插件)设置的 Cookie。
用途:常用于跨站追踪用户行为、提供个性化广告等。
特点:可能会引发隐私问题,许多现代浏览器默认限制或阻止此类 Cookie。

二、 Session

session在网络应用中称为“会话控制”,是服务器为了保存用户状态而创建的一个特殊的对象。简而言之,session就是一个对象,用于存储信息。 服务器会为每一个游览器(客户端)创建一个唯一的session。这个session是服务器端共享,每个游览器(客户端)独享的。我们可以在session存储数据,实现数据共享。
Session 是一种用于在 Web 应用程序中维持用户状态的机制。尽管 Cookie 通常被用来存储和传输与会话相关的标识符,但 Session 本身是由服务器端管理的,并且可以包含比 Cookie 更多、更复杂的数据。

Session 工作机制

在这里插入图片描述

原理:

session是每一个游览器(客户端)所唯一的,这个是怎么实现的呢?其实,在访问一个网站时,在HTTP请求中往往会携带一个cookie,这个cookie的名字是JSESSIONID,这个JSESSIONID表示的就是session的id,这个是由服务器创建的,并且是唯一的。服务器在使用session时,会根据JSESSIONID来进行不同操作。
在这里插入图片描述

创建 Session:

当用户首次访问网站并需要开始一个会话时(例如登录),服务器会创建一个新的 Session 并生成一个唯一的 Session ID。
这个 Session ID 通常通过 HTTP 响应头中的 Set-Cookie 发送到客户端,并保存为一个 Cookie。

存储 Session 数据:

服务器将与该用户会话相关的所有数据存储在服务器端。这可能包括用户的身份验证信息、购物车内容、偏好设置等。
存储位置可以是内存、文件系统、数据库或分布式缓存(如 Redis)。

使用 Session:

在后续请求中,客户端会在每个请求中自动发送包含 Session ID 的 Cookie。
服务器接收到来自客户端的请求后,通过解析 Cookie 头中的 Session ID 来查找对应的 Session 数据,并恢复用户的会话状态。

销毁 Session:

当用户注销或会话超时时,服务器会删除相应的 Session 数据,并可能指示客户端删除对应的 Cookie。

session常用方法

resquest.getSession(): 得到请求游览器(客户端)对应的session。如果没有,那么就创建应该新的session。如果有那么就返回对应的session
setAttribute(String s, Object o): 在session存放属性
getAttribute(String s): 从session中得到s所对应的属性
removeAttribute(String s): 从session中删除s对应的属性
getId(): 得到session所对应的id
invalidate(): 使session立即无效
setMaxInactiveInterval(int i): 设置session最大的有效时间。注意,这个有效时间是两次访问服务器所间隔的最大时间,如果超过最大的有效时间,那么这个session就失效了。

Session 和 Cookie 的关系

Session ID 通过 Cookie 传输:虽然 Session 数据存储在服务器端,但为了识别用户并恢复其会话状态,服务器依赖于客户端发送的 Session ID。这个 Session ID 通常是通过 Cookie 从服务器传递到客户端并在每次请求中返回给服务器的。
Cookie 和 Session 本质上是两种不同的技术,用于解决 HTTP 无状态协议下的状态管理问题,但它们的实现方式和适用场景有显著差异:

1. Cookie(客户端存储)

定义:

Cookie 是由服务端生成并发送给客户端的一小段数据(键值对),由客户端(如浏览器)保存,并在后续请求中自动携带回服务端。

特点:

数据存储在客户端(浏览器本地)。

每次请求自动附加到请求头的 Cookie 字段中。

用途:

记录简单、非敏感的状态(如用户主题偏好、追踪ID)。

仅用 Cookie 的场景(无 Session)
假设服务端不使用 Session 技术,直接通过 Cookie 管理状态:

示例:

服务端设置 Cookie:Set-Cookie: username=Alice; theme=dark。

客户端保存 Cookie,后续请求自动携带:Cookie: username=Alice; theme=dark。

服务端逻辑:直接读取请求头中的 Cookie 值(如 username=Alice)。无需在服务端存储任何信息,直接基于 Cookie 的值处理请求(例如显示“欢迎 Alice”)。

局限性:

安全性低:Cookie 存储在客户端,可被篡改(如用户手动修改 username=Admin)。

无法存储敏感数据:密码、权限等信息不应通过 Cookie 直接传递。

2. Session(服务端存储)

定义:

Session 是服务端存储的用户会话数据(如登录状态、购物车内容),通常通过一个 Session ID 标识客户端身份,而 Session ID 一般通过 Cookie 传递。

特点:

数据存储在服务端(如内存、Redis、数据库)。

通过 Session ID 关联客户端(客户端只需保存 Session ID)。

用途:管理敏感或复杂的状态(如用户登录凭证)。

关键点:

服务端仅存储 Session ID 与会话数据的映射,不存储客户端 Cookie 本身。

Session ID 是客户端和服务端之间的“钥匙”,确保安全性的核心在于保护 Session ID(如使用 HTTPS、设置 HttpOnly 标志)。

在这里插入图片描述

三、认识JWT

1.什么是JWT呢?

JWT 是一种 开放标准(RFC 7519) 的 Token 格式,用于在各方之间安全传输 JSON 数据。它通过签名或加密确保数据的完整性和可信性,常用于身份验证和授权。

2.JWT 的核心结构

JWT 由三部分组成,以 . 分隔:

Header.Payload.Signature

Header(头部)

描述 Token 类型和签名算法(如 HMAC、RSA)。

示例:

{"alg": "HS256",  // 签名算法"typ": "JWT"     // Token 类型
}

Payload(负载)

包含需要传输的 声明(Claims),分为三类:

  • 预定义声明:如 exp(过期时间)、sub(用户ID)。

  • 公开声明:可自定义,但需避免冲突(参考 IANA JWT Registry)。

  • 私有声明:应用自定义的数据(如 user_role)。

示例:

{"sub": "1234567890","name": "Alice","admin": true,"exp": 1717029200  // 过期时间戳
}

Signature(签名)

将 Header 和 Payload 用 Base64Url 编码后拼接,再通过 密钥(Secret) 或 公私钥 进行签名,防止数据篡改。

示例(HMAC-SHA256 算法):

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

3.JWT 的工作流程

用户登录

客户端提交用户名密码。

服务端验证通过后,生成 JWT 并返回给客户端(通常通过 Authorization: Bearer 头或 Cookie)。

客户端存储 JWT

客户端保存 JWT(如浏览器 LocalStorage、Cookie 或移动端本地存储)。

后续请求

客户端在请求头中携带 JWT:

GET /api/profile HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

服务端验证签名和有效期,直接解析 Payload 获取用户信息,无需查询数据库。

Token 过期或失效

客户端需重新登录或使用 Refresh Token 获取新 JWT。

4.JWT 与 Session 的核心区别

在这里插入图片描述

5.JWT 的优缺点

优点

  • 无状态:适合微服务、分布式系统,服务端无需维护会话。
  • 减少数据库压力:用户信息直接包含在 Token 中。
  • 跨域支持:可轻松用于跨域认证(如 OAuth2)。
  • 灵活性:可携带自定义数据(如用户角色、权限)。

缺点

  • 无法即时失效:Token 一旦签发,在过期前始终有效(需结合黑名单机制)。
  • 数据膨胀:Token 大小随 Payload 增加而增大,可能影响性能。
  • 安全性依赖客户端存储:Token 存储在客户端,易受 XSS 攻击窃取。
  • 敏感数据暴露:Payload 默认仅 Base64 编码(非加密),需避免存储敏感信息。

注意(JWT 安全实践):

使用 HTTPS:防止 Token 在传输中被窃听。

短期有效:设置较短的过期时间(如 15 分钟),配合 Refresh Token 续期。

HttpOnly + Secure Cookie:若通过 Cookie 存储,启用安全属性。

签名算法:使用强算法(如 HS256、RS256),避免 none 算法。

黑名单机制:针对需主动失效的 Token,维护一个短期的黑名单。

5.JWT 与 Session 的选择场景

在这里插入图片描述

总结

本文首先介绍了http中的cookie,然后随着技术和业务场景的发展,进一步介绍了session和jwt,可以帮初学者快速了解这方面的知识,比较他们的优缺点和实用场景

引用参考:

HTTP Cookie 你了解多少?
【HTTP完全注解】一文重新认识Cookie
Session详解,学习Session,这篇文章就够了(包含底层分析和使用)
JWT详细教程与使用

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

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

相关文章

【css酷炫效果】纯CSS实现粒子旋转动画

【css酷炫效果】纯CSS实现粒子旋转动画 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492008 缘 创作随缘,不定时更新。 创作背景 刚看到csdn出活动了&…

C++Lambda表达式

Lambda表达式 什么是Lambda表达式 ​ C11的颁布让C丰富了起来,任何一本介绍C11的书籍,都不可能跳过这一个点——Lambda表达式。人们经常称Lambda表达式是一个语法糖,说明这是一个”没有没事,有了更好“的一种语法表达&#xff0…

每天五分钟深度学习框架pytorch:基于pytorch搭建循环神经网络RNN

本文重点 我们前面介绍了循环神经网络RNN,主要分析了它的维度信息,其实它的维度信息是最重要的,一旦我们把维度弄清楚了,一起就很简单了,本文我们正式的来学习一下,如何使用pytorch搭建循环神经网络RNN。 RNN的搭建 在pytorch中我们使用nn.RNN()就可以创建出RNN神经网络…

el-table树形表格合并相同的值

el-table树形表格合并相同的值 el-table树形表格合并相同的值让Ai进行优化后的代码 el-table树形表格合并相同的值 <style lang"scss" scoped> .tableBox {/deep/ &.el-table th:first-child,/deep/ &.el-table td:first-child {padding-left: 0;} } …

2025年3月19日 十二生肖 今日运势

小运播报&#xff1a;2025年3月19日&#xff0c;星期三&#xff0c;农历二月二十 &#xff08;乙巳年己卯月丁亥日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;兔、虎、羊 需要注意&#xff1a;猪、猴、蛇 喜神方位&#xff1a;正南方 财神方位&#xff1a;…

Git——分布式版本控制工具使用教程

本文主要介绍两种版本控制工具——SVN和Git的概念&#xff0c;接着会讲到Git的安装&#xff0c;Git常用的命令&#xff0c;以及怎么在Vscode中使用Git。帮助新手小白快速上手Git。 1. SVN和Git介绍 1.1 SVN 集中式版本控制工具&#xff0c;版本库是集中存放在中央服务器的&am…

QT5.15.2加载pdf为QGraphicsScene的背景

5.15.2使用pdf 必须要安装QT源码&#xff0c;可以看到编译器lib目录已经有pdf相关的lib文件&#xff0c;d是debug 1.找到源码目录&#xff1a;D:\soft\QT\5.15.2\Src\qtwebengine\include 复制这两个文件夹到编译器的包含目录中:D:\soft\QT\5.15.2\msvc2019_64\include 2.找…

【H2O2 | 软件开发】前端深拷贝的实现

目录 前言 开篇语 准备工作 正文 概述 JSON方法 递归 其他 结束语 前言 开篇语 本系列为短篇&#xff0c;每次讲述少量知识点&#xff0c;无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的&#xff0c;希望对诸位有所帮助。…

Docker - 切换源 (Linux / macOS)

文章目录 Linux 系统macOS 系统 Linux 系统 修改配置文件&#xff1a;/etc/docker/daemon.json "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com"]验证是否修改成功&#xff1a; docker info重启 …

hcia复习

一、网络设备 1、交换机&#xff1a;&#xff08;1&#xff09;提供MAC地址表&#xff0c;转发数据&#xff1b; &#xff08;2&#xff09;每个接口是一个独立的冲突域&#xff1b; &#xff08;3&#xff09;凡是连在交换机上的所有设备都处于同一广播域&#xff08;网络&am…

opencv初步学习——图像处理3

这一部分我们将学习opencv中对图像大小进行调整的基本操作&#xff0c;以及掩模操作&#xff0c;我们直接进入正言 一、cv2.resize( )函数 1-1、组成与构造 该函数的作用就算用来帮助我们实现对图像大小的处理&#xff0c;具体的组成与构造如下&#xff1a; cv2.resize(src , …

[LevelDB]关于LevelDB存储架构到底怎么设计的?

本文内容组织形式 LevelDB 存储架构重要特点总体概括LevelDB中内存模型MemTableMemTable的数据结构背景&#xff1a;SkipListSkiplist的数据结构 Skiplist的数据访问细节 SkipList的核心方法Node细节源代码 MemTable的数据加速方式Iterator 的核心方法 MemTable 的读取&写入…

【存储中间件】Redis核心技术与实战(四):Redis高并发高可用(Redis集群 Smart客户端、集群原理)

文章目录 Redis集群Smart客户端smart客户端原理ASK 重定向集群下的Jedis客户端Hash tags 集群原理节点通信通信流程Gossip 消息节点选择 故障转移故障发现主观下线客观下线 故障恢复资格检查准备选举时间发起选举选举投票替换主节点 故障转移时间 集群不可用判定集群读写分离 个…

【接口耗时】⭐️自定义拦截器实现接口耗时统计

&#x1f4a5;&#x1f4a5;✈️✈️欢迎阅读本文章❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;本篇文章阅读大约耗时三分钟。 ⛳️motto&#xff1a;不积跬步、无以千里 &#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;&#x1f381;&#x1f381;&a…

杨校老师课堂之编程入门与软件安装【图文笔记】

亲爱的同学们&#xff0c;热烈欢迎踏入青少年编程的奇妙世界&#xff01; 我是你们的授课老师杨校 &#xff0c;期待与大家一同开启编程之旅。 1. 轻松叩开编程之门 1.1 程序的定义及生活中的应用 程序是人与计算机沟通的工具。在日常生活中&#xff0c;像手机里的各类 APP、电…

【从零开始】Air780EPM的LuatOS二次开发——OneWire协议调试注意事项!

当涉及到与传感器、执行器等外部设备交互时&#xff0c;OneWire协议的高效调试成为决定项目成败的关键环节。OneWire协议&#xff08;单总线协议&#xff09;以其仅需一根数据线即可实现设备通信的极简特性&#xff0c;被广泛应用于温度传感器、身份识别模块等场景。 一、LuatO…

redis数据结构、多路复用、持久化---java

数据结构 Redis 提供了丰富的数据类型&#xff0c;常见的有五种数据类型&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff0c;Set&#xff08;集合&#xff09;、Zset&am…

vue3之写一个aichat ----vite.config.js

vite.config.js的CSS配置 postcss-pxtorem 开发响应式网页的时候需要用到postcss-pxtorem amfe-flexible amfe-flexible是由阿里团队开发的一个库&#xff0c;它可以根据设备的屏幕宽度去动态调整HTML根元素()的字体大小&#xff0c;这意味着无论用户使用什么尺寸的设备访问你…

强化学习(赵世钰版)-学习笔记(8.值函数方法)

本章是算法与方法的第四章&#xff0c;是TD算法的拓展&#xff0c;本质上是将状态值与行为值的表征方式&#xff0c;从离散的表格形式&#xff0c;拓展到了连续的函数形式。 表格形式的优点是直观&#xff0c;便于分析&#xff0c;缺点是数据量较大或者连续性状态或者行为空间时…

C++模版(进阶)

文章目录 一、非类型模版参数二、模版的特化2.1 概念2.2 函数模版特化2.2.1 函数模版特化为指针类型注意事项 2.3 类模版特化2.3.1 全特化2.3.2 偏特化(半特化)2.3.3 类模板特化应用示例 三、模版分离编译3.1 什么是分离编译&#xff1f;3.2 模版的分离编译3.3 解决方法! 四、模…