cookie/session/token/jwt

Cookie

  • 定义: Cookie 是服务器发送到用户浏览器存储在本地的小型数据片段,用于在客户端存储会话信息。

    • Cookie是Web服务器发送给浏览器的一小段数据,浏览器之后在每次请求同一服务器时会将这段数据回传。Cookie的主要作用是维持用户状态,例如存储登录信息或用户偏好设置。

  • 应用场景: 用于在客户端存储用户的会话状态,如用户登录状态、购物车内容等

    • 用户认证:存储用户会话标识。

    • 用户偏好:如网页字体大小、页面布局等个性化设置。

    • 购物车:在不登录的情况下临时保存用户的购物车信息。

  • 实现方式: 通过HTTP响应头Set-Cookie设置Cookie,浏览器在后续请求中通过Cookie请求头携带这些数据。

  • 示例代码(设置Cookie):

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
​
HttpServletResponse response = ...;
Cookie cookie = new Cookie("username", "JohnDoe");
cookie.setMaxAge(1*60*60); // 秒 设置有效期为1小时
response.addCookie(cookie);

Session

  • 定义: Session 是存储在服务器上的用户会话信息,通过唯一的会话标识符来关联客户端请求和用户数据。

    • Session是在服务器端为每个用户创建的一种会话状态,用来跟踪用户的状态信息。每个Session都有一个唯一的Session ID来标识。

  • 应用场景: 用于存储和管理大量和敏感的用户数据,如用户权限、购买历史等

    • 用户身份验证:存储登录状态,权限信息。

    • 跨页面数据共享:在不同请求间传递数据。

  • 实现方式: 服务器为每个新用户分配一个Session,并生成一个唯一Session ID,此ID通常通过Cookie发送给客户端,客户端后续请求时携带此ID,服务器根据ID找到对应的Session。

  • 示例代码(Servlet中使用Session):

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
​
// 获取或创建用户的 Session
HttpSession session = request.getSession();
​
// 向 Session 存储用户信息
session.setAttribute("username", "JohnDoe");

Token

  • 定义: Token 是用于身份验证或授权的通用术语,可以是基于 Cookie 的会话标识符或更复杂的安全令牌。

  • 应用场景: 用于确认用户身份,在不同系统或服务之间进行传递和验证。

  • 实现方式:

    在实际应用中,Token 可以是各种形式,包括基于 JWT 的安全令牌。

JWT ( JSON Web Token)

  • 定义: JWT 是一种基于 JSON 格式的安全令牌,用于在客户端和服务器之间安全地传递信息。

    • JWT是一种紧凑、自包含的方式,用于在各方之间安全地传输信息。它是一个JSON对象,经过加密后可以被信任。常用于认证和授权场景。

  • 应用场景:

    • 用户认证:代替传统的Session机制,实现无状态认证。

    • API访问控制:确保API请求来自合法用户。

  • 实现方式: JWT由三部分组成:Header、Payload、Signature。通过指定算法对前两部分进行签名,以保证数据的完整性和来源的可靠性。

  • 示例代码(使用jjwt库生成JWT):

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
​
String secretKey = "yourSecretKey";
long validityInMilliseconds = 3600000; // 有效期1小时
​
// 生成JWT
String token = Jwts.builder().setSubject("JohnDoe") // 主题,可以是用户ID或其他标识.claim("role", "admin") // 自定义声明.setIssuedAt(new Date(System.currentTimeMillis())) // 发布时间.setExpiration(new Date(System.currentTimeMillis() + validityInMilliseconds)) // 过期时间.signWith(SignatureAlgorithm.HS256, secretKey) // 签名算法和密钥.compact(); // 压缩成字符串形式

jwt和token关系

  • JWT(JSON Web Token)是一种具体的Token实现方式。换句话说,Token是一个更广泛的概念,而JWT是Token的一个子集,专注于通过JSON格式安全地传输信息。

  • Token,一般而言,是指在计算机安全领域中用于验证身份、授权访问或传递信息的一种加密字符串。Token可以有多种实现形式和标准,比如OAuth Tokens、API Tokens等,它们各有不同的结构和应用场景。

  • JWT (JSON Web Token) 是一种基于JSON的开放标准(RFC 7519),用于在双方之间安全、高效地传递信息。JWT主要由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。它设计得足够紧凑,可直接在网络中传输,且由于其签名机制,能够在不查询数据库的情况下验证Token的有效性及完整性,非常适用于分布式系统的认证和授权场景。

  • 因此,当人们谈论“Token”时,可能指代任何形式的认证或信息传递令牌;而提到JWT时,特指遵循JWT标准的这种特定类型的Token。

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

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

相关文章

分层解耦----

分层解耦 类聚 软件中各个功能模块内部的功能联系. 例如: 高类聚示例:想象一下餐厅的厨房,每个厨师负责自己的工作站,一个专门做沙拉,一个专门烤肉,另一个专门做甜点。每个工作站内的工作高度类聚,即每个…

vite项目如何在本地启动https协议

vite项目如何在本地启动https协议 本地启动正常配置在vite.config.js文件中默认启动http协议的请求,如何改成https呢?今天的开发中遇到了这个问题项目需求: 本地启动https协议的前端页面并且正常访问后台https协议的接口 解决方法&#xff1a…

private修饰的方法或属性能被子类继承嘛?

先说结论:能。 这是一个反直觉的问题,毕竟大家在学习阶段接收到的知识就是:被privaite修饰的方法和成员变量不能被继承。 证明过程可参考文档:private修饰的变量如何调用_你真的熟悉java继承关系?那你知道父类private…

Elasticsearch:Runtime fields - 运行时字段(二)

这是继上一篇文章 “Elasticsearch:Runtime fields - 运行时字段(一)” 的续篇。 在查询时覆盖字段值 如果你创建的运行时字段与映射中已存在的字段同名,则运行时字段会隐藏映射字段。在查询时,Elasticsearch 会评估运…

MySQL 8.0新特性INTERSECT和EXCEPT用于集合运算

MySQL8.0.31 新版本的推出,MySQL增加了对SQL标准INTERSECT和EXCEPT运算符的支持。 1、INTERSECT INTERSECT输出多个SELECT语句查询结果中的共有行。INTERSECT运算符是ANSI/ISO SQL标准的一部分(ISO/IEC 9075-2:2016(E))。 我们运行两个查询,第一个会列…

Python基础小知识问答系列-获取列表中最大或最小N个元素

1. 问题: 怎么从数值列表中获取最大或最小几个元素? 怎么从字典元素列表中,获取字典中某个值最大或最小的几个字典元素? 2. 解决方法: 使用heapq模块中的nlargest、nsmallest。 示例: import heapqtest_list [1, 3…

事务性消息

事务性消息是一种保证消息在传递和处理过程中具有一致性、原子性、隔离性和持久性的消息传递机制。事务性消息确保在消息的发送和消费过程中,要么所有操作全部成功,要么全部失败回滚,从而保持数据的一致性和完整性。事务性消息通常用于需要严…

java基于ssm+vue 病人跟踪治疗信息管理系统

1病人功能模块 病人登录进入病人跟踪治疗信息管理系统可以查看首页、个人中心、病例采集管理、预约管理、医生管理、上传核酸检测报告管理、上传行动轨迹管理、病人治疗状况管理等内容。 病例采集管理,在病例采集管理页面可以查看账号、姓名、住院号、入院时间、病…

电通出席2024年世界经济论坛(WEF),重申推动可持续发展创新和人才培育的承诺

中国,上海——电通将出席世界经济论坛2024年新领军者年会(夏季达沃斯),本次大会将于6月25日至6月27日在中国大连举行。 2024年世界经济论坛主题为“未来增长的新前沿”,将聚焦于全球经济复苏、通胀缓解,以…

前端基础:JavaaScript(篇二)

目录 内置对象 String字符串 属性 代码 运行 方法 代码 运行 日期 代码 运行 Math 代码 运行 数组 定义 属性 代码 运行 方法 join(分隔符>) : 代码 运行 reverse(): 代码 运行 sort() : 代码 运行 事件 …

深⼊理解MySQL Innodb存储引擎的缓冲池、事务、索引底层工作原理,掌握 MySQL 主从同步,读写分离技术以及集群的搭建,具备分库分表,SQL调优经验

深入理解MySQL的InnoDB存储引擎是数据库管理员和开发人员的重要技能。以下是对InnoDB存储引擎的缓冲池、事务、索引以及主从同步、读写分离技术和集群搭建的详细原理介绍: ### InnoDB存储引擎 1. **缓冲池(Buffer Pool)**: - 缓冲池是InnoDB存储引擎…

Elasticsearch实战教程: 如何在海量级数据中进行快速搜索

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 Elasticsearch(简称ES)是一个基于Apache Lucene™的开源搜索引擎,无论在开源还是专有领…

Python冒泡排序

冒泡排序过程:从第一个值开始,每取一个值与剩余后面的每个值两两比较,如果后面的值比当前值大,就交换它们的位置 以下是冒泡排序的Python实现: ls [2, 5, 3, 11, 7, 9]for i in range(len(ls)):for j in range(len(…

Linux查询某个目录中包含的文件总个数和文件总存储,结果写入文件中

在Linux中,如果你想要将命令的输出结果保存到文件中,可以使用重定向操作符 > 或 >>。这里有两个基本的区别: > 会创建一个新的文件或者覆盖已存在的文件,然后将输出写入该文件。>> 会将输出追加到已存在的文件…

【SPIE独立出版】第四届智能交通系统与智慧城市国际学术会议(ITSSC 2024)

第四届智能交通系统与智慧城市国际学术会议(ITSSC 2024)将于2024年8月23-25日在中国西安举行。本次会议主要围绕智能交通、交通新能源、无人驾驶、智慧城市、智能家居、智能生活等研究领域展开讨论, 旨在为该研究领域的专家学者们提供一个分享…

SWOT视角洞察:一篇文章详解AI Agent发展

AI Agent自盖茨远见后火爆,吴恩达提出设计模式成创业圣经。其优势显著:技术门槛低,市场需求广,非技术人员可参与开发。然而,挑战亦不容忽视:技术成熟度需提升,数据安全和隐私保护待加强&#xf…

Linux shell编程学习笔记61: pstree 命令——显示进程树

0 前言 在 Linux shell编程学习笔记59: ps 获取系统进程信息,类似于Windows系统中的tasklist 命令https://blog.csdn.net/Purpleendurer/article/details/139696466?spm1001.2014.3001.5501 中我们研究了ps命令。在Linux中,通过ps命令&am…

【Hec-Ras】第一期:软件安装

Hec-Ras软件安装 1 HEC-RAS软件介绍2 HEC-RAS软件下载3 HEC-RAS软件安装4 HEC-RAS软件界面介绍参考 1 HEC-RAS软件介绍 HEC-RAS 是美国陆军工程兵团工程水文中心( Hydrologic Engineering Centers, HEC)开发的河道水力计算程序(River Analys…

C++中的虚函数与Java中的接口区别

在C和Java中,虚函数(virtual function)和接口(interface)虽然都用于实现多态性,但它们在设计和使用上有着本质的区别,因此不能简单地将C中的虚函数理解为Java中的接口。 C中的虚函数 定义&…

go sync包(五) WaitGroup

WaitGroup sync.WaitGroup 可以等待一组 Goroutine 的返回,一个比较常见的使用场景是批量发出 RPC 或者 HTTP 请求: requests : []*Request{...} wg : &sync.WaitGroup{} wg.Add(len(requests))for _, request : range requests {go func(r *Reque…