Cookie、Session、Token(JWT)还不懂?

Cookie、Session、Token(JWT)

三者的区别与用途!如何进行身份认证,保持用户登录状态?

Cookie、Session 和 Token 都是在 Web 开发中用于管理用户状态和进行身份认证的技术,它们之间有以下区别和用途:

一、Cookie

  1. 含义:Cookie 是存储在用户浏览器中的一小段数据。它由服务器发送到客户端,客户端在后续请求中会将 Cookie 发送回服务器。

  2. 用途:

    • 存储用户偏好设置:例如,用户选择的语言、主题等可以存储在 Cookie 中,以便在用户下次访问时恢复这些设置。

    • 跟踪用户会话:通过设置一个会话 ID 的 Cookie,可以在多个请求之间跟踪用户的会话。

  3. 特点:

    • 存储在客户端:这意味着用户可以查看和修改 Cookie 的内容(虽然通常不建议这样做)。

    • 有大小限制:一般来说,Cookie 的大小不能超过 4KB。

二、Session

  1. 含义:Session 是在服务器端存储的用户会话数据。当用户登录或进行其他需要身份认证的操作时,服务器会创建一个 Session,并为其分配一个唯一的 Session ID。

  2. 用途:

    • 存储用户登录状态:服务器可以在 Session 中存储用户的登录信息,以便在后续请求中验证用户的身份。

    • 保存用户特定的数据:例如,在购物网站中,服务器可以在 Session 中存储用户的购物车内容。

  3. 特点:

    • 存储在服务器端:相比 Cookie,Session 数据更加安全,因为用户无法直接访问和修改服务器端的数据。

    • 依赖 Cookie 或 URL 重写:通常,服务器会通过在 Cookie 中存储 Session ID 来跟踪用户的 Session。如果客户端不支持 Cookie,也可以使用 URL 重写的方式将 Session ID 附加到 URL 中。

    • 占用服务器资源,扩张性差(分布式集群,登录时只存储到了一台服务器,负载均衡时,访问到其他服务器就没有该session显示未登录),依然需要依赖cookie跨域限制

三、Token

  1. 含义:Token 是一种包含用户身份信息的加密字符串。它由服务器生成并发送给客户端,客户端在后续请求中携带 Token 以证明自己的身份。

  2. 用途:

    • 无状态身份认证:Token 可以在无状态的环境中进行身份认证,例如 RESTful API。服务器不需要存储 Session 数据,只需要验证 Token 的有效性即可。

    • 跨域身份认证:Token 可以在不同的域之间进行身份认证,因为它是独立于特定的服务器会话的。

  3. 特点:

    • 自包含:Token 中包含了用户的身份信息,因此服务器不需要在其他地方存储用户的状态。

    • 可扩展性:Token 可以很容易地与第三方服务集成,因为它们不依赖于特定的服务器会话。

四、JWT

JSON Web Token,就是通过JSON来进行传递的加密后字符串。

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为 JSON 对象。JWT 由三部分组成,分别用点(.)分隔,这三部分分别是:

一、头部(Header)

  1. 组成内容:通常由两部分组成,令牌的类型(即 “JWT”)和所使用的签名算法,例如 HMAC SHA256 或 RSA。

  2. 示例:{"typ":"JWT","alg":"HS256"}。这表示是一个 JWT,并且使用 HMAC SHA256 算法进行签名。

  3. 编码方式:这个 JSON 对象会使用 Base64Url 编码方式进行编码,生成 JWT 的第一部分。

二、载荷(Payload)

  1. 包含信息:载荷部分包含声明(claims),声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型:注册声明、公开声明和私有声明。

    • 注册声明:预定义的声明,如 “iss”(issuer,签发者)、“exp”(expiration time,过期时间)、“sub”(subject,主题)、“aud”(audience,受众)等。

    • 公开声明:可以由使用 JWT 的各方定义的自定义声明。但为了避免冲突,应该在一个命名空间中定义它们,如 “https://example.com/claims”。

    • 私有声明:在同意使用它们的各方之间共享的自定义声明,通常用于在特定的应用程序上下文中传递特定的信息。

  2. 示例:{"sub":"1234567890","name":"John Doe","admin":true}。在这个例子中,“sub” 是主题,可能是用户的唯一标识符;“name” 是用户的名字;“admin” 是一个自定义的声明,表示用户是否是管理员。

  3. 编码方式:同样使用 Base64Url 编码方式进行编码,生成 JWT 的第二部分。前端也就可以通过截取第二部分信息,通过Base64编码解析获得相关信息

三、签名(Signature)

  1. 生成方式:签名是对头部和载荷的签名,用于验证消息的完整性和真实性,并防止篡改。签名是使用头部(header)中指定的签名算法,对头部和载荷进行签名(自己知道的私钥,通过算法加密)生成的。例如,如果使用 HMAC SHA256 算法,签名是通过将头部和载荷的 Base64Url 编码后的字符串连接起来,使用一个密钥进行 HMAC SHA256 哈希生成的。

  2. 示例:假设使用密钥 “secret” 和 HMAC SHA256 算法,对前面的头部和载荷进行签名,生成的签名可能是 “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.signature_here” 中的 “signature_here” 部分。

  3. 作用:接收方可以使用相同的密钥和算法对头部和载荷进行签名验证,如果生成的签名与接收到的签名一致,则说明消息没有被篡改。

例如,一个完整的 JWT 可能看起来像这样:

eyJhbGci0iJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtzSI6I1h1c2h1IiwicmVhbG5hbWui0iLlvpDlurYifQ.SBKBBM9fBaBEZ71SbzRxn91xfvtvKq6C-XNezgoZBWw

总之,JWT 的三部分组成提供了一种安全、紧凑的方式来在各方之间传输信息,并且可以通过签名验证消息的完整性和真实性。

五、如何进行身份认证和保持用户登录状态
  1. 使用Cookie:

  • 先发送请求到服务端

  • 服务端响应中set-cookie参数上添加上用户登录信息

  • 在每次请求中携带上cookie信息

  1. 使用 Cookie 和 Session:

  • 用户登录时,服务器验证用户的凭据,如果验证成功,服务器创建一个 Session,并在 Session 中存储用户的登录信息。然后,服务器将 Session ID 作为一个 Cookie 返回给客户端。

  • 在后续请求中,客户端会自动将 Cookie 发送回服务器,服务器通过 Session ID 找到对应的 Session,从而验证用户的身份并获取用户的状态信息。

  • 为了保持用户登录状态,服务器可以设置 Cookie 的过期时间,或者在用户进行某些操作时刷新 Cookie 的过期时间。

  1. 使用 Token:

  • 用户登录时,服务器验证用户的凭据,如果验证成功,服务器生成一个 Token,并将其返回给客户端。

  • 在后续请求中,客户端将 Token 作为一个请求头或参数发送给服务器。服务器验证 Token 的有效性,如果有效,则认为用户已经登录。

  • 为了保持用户登录状态,服务器可以在 Token 中设置过期时间,或者在 Token 即将过期时生成一个新的 Token 并返回给客户端。

例如,在一个基于 Spring Boot 的 Web 应用中,可以使用 Spring Security 来实现基于 Cookie 和 Session 的身份认证,也可以使用 JWT(JSON Web Token)来实现基于 Token 的身份认证。以下是一个使用 JWT 实现身份认证的示例:

 import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;import org.springframework.security.core.Authentication;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.web.filter.OncePerRequestFilter;​import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.Date;​public class JwtAuthenticationFilter extends OncePerRequestFilter {​private final UserDetailsService userDetailsService;private final String secret;​public JwtAuthenticationFilter(UserDetailsService userDetailsService, String secret) {this.userDetailsService = userDetailsService;this.secret = secret;}​@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {​String token = getTokenFromRequest(request);if (token!= null &&!token.isEmpty()) {try {String username = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getSubject();UserDetails userDetails = userDetailsService.loadUserByUsername(username);Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authentication);} catch (Exception e) {// Token 无效,不进行身份认证}}​filterChain.doFilter(request, response);}​private String getTokenFromRequest(HttpServletRequest request) {String bearerToken = request.getHeader("Authorization");if (bearerToken!= null && bearerToken.startsWith("Bearer ")) {return bearerToken.substring(7);}return null;}​public String generateToken(String username) {Date expirationDate = new Date(System.currentTimeMillis() + 86400000); // 1 day expirationreturn Jwts.builder().setSubject(username).setExpiration(expirationDate).signWith(SignatureAlgorithm.HS512, secret).compact();}}

在这个示例中,JwtAuthenticationFilter类实现了一个 Spring Security 的过滤器,用于从请求中提取 JWT Token,并进行身份认证。如果 Token 有效,过滤器会创建一个Authentication对象,并将其设置到SecurityContextHolder中,以便后续的请求可以获取用户的身份信息。

总之,Cookie、Session 和 Token 都有各自的特点和用途,可以根据具体的应用场景选择合适的技术来进行身份认证和保持用户登录状态。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

一步步带你Linux内核编译与安装

Linux内核编译与安装 安装流程 #mermaid-svg-0PfY2uowOUJaN2Ov {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0PfY2uowOUJaN2Ov .error-icon{fill:#552222;}#mermaid-svg-0PfY2uowOUJaN2Ov .error-text{fill:#5522…

地区环境保护支出数据(2007-2023年)

政府环境保护支出是指ZF在环境保护方面投入的CZ资金,用于自然生态保护、污染防治、环境监测与监管等多个领域,旨在改善环境质量、防范环境风险以及促进可持续发展 一、数据介绍 数据名称:地区环境保护支出数据 数据范围:中国31…

yakit使用教程(二,配置证书并进行抓包改包操作)

前文链接:yakit下载安装教程。 一,下载并配置证书。 点击mitm,在跳转后的页面点击高级配置。 点击证书下载。 点击下载到本地并打开(建议下载到桌面)。 在火狐浏览器下载并安装FoxyProxy,具体参数配置如上…

一文上手skywalking【上】

一、skywalking预览 1.1 skywalking 概述 ​ Apache SkyWalking, 适用于分布式系统的应用程序性能监控工具,专为微服务、云原生和基于容器的 (Kubernetes) 架构而设计。官方地址: https://skywalking.apache.org/ 适用于分布式系统的应用程…

Humans or LLMs as the Judge? A Study on Judgement Bias

文章目录 题目摘要引言相关作品论法官的偏见实验方案结果与讨论欺骗LLM法官结论 题目 人类还是LLMs作为裁判?判断偏差研究 论文地址:https://arxiv.org/pdf/2402.10669 摘要 采用人类和大型语言模型(LLM)作为评估LLM性能的评判者(也称为人类和LLM-as-a…

Java语法-类和对象之抽象类和接口

1.抽象类 1.1 抽象类的概念 一个类中没有足够的信息来描述一个具体的对象,这样的类就是抽象类 比如: 从图中我们可以看出,只有继承了的类,我们产生的实例,调用的draw方法都是他们本身重写的draw方法,不会调用父类Shape的draw()方法,因此我们可以不管父类里面的draw()方法里面的…

第十四届蓝桥杯真题Java c组A.求和(持续更新)

博客主页:音符犹如代码系列专栏:蓝桥杯关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 【问题描述】 求1(含)至 20230408(含)中每个数的和。 【答案提交】 这是一道结…

24年下重庆事业单位考试报名超详细流程

🎈提交报考申请 考生通过重庆市人力资源和社会保障局官网(rlsbj.cq.gov.cn)“热点服务”中“人事考试网上报名”栏进行报名。报名时间为2024年8月12日9:00—8月17日9:00。 🎈网上缴费 资格初审合格后,考生应在2024年8…

flink设置保存点和恢复保存点

增加了hdfs package com.qyt;import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.api.java.tuple.Tuple2;import org.apache.flink.runtime.state.storage.FileSystemCheckpointStorage;import org.apache.flink.streaming.api.datastream.Dat…

精通推荐算法32:行为序列建模总结

1 行为序列建模总体架构 2 行为序列整体总结 用户行为序列建模是推荐算法中至关重要的一环,也是目前较为核心和前沿的研究方向。其主要分为短序列建模和长序列建模两大方向。短序列建模又主要分为池化和序列化两种方式,其中池化包括Sum-Pooling、Averag…

信道衰落的公式

对于天线: 对于天线的面积计算: 天线的接收功率密度: 天线的接收功率: 移动无线信道(I) (xidian.edu.cn)https://web.xidian.edu.cn/zma/files/20150710_153736.pdf 更加常用的考虑了额外的信道衰落pathlo…

甘肃辣椒油:舌尖上的热辣诱惑

💥宝子们,今天必须要给你们安利甘肃食家巷的辣椒油🌶️!✨甘肃辣椒油,那可是有着独特魅力的美食瑰宝😍。它以其鲜艳的色泽、浓郁的香气和醇厚的辣味,瞬间点燃你的味蕾🔥。&#x1f3…

《Spring Boot应用进阶:打造优雅的错误处理机制与全局异常拦截器》

文章目录 自定义异常类AppException封装业务有关的枚举类AppExceptionCodeMsg全局异常拦截器Handler响应类模板Resp案例展示 || Demo项目结构pom依赖DemoController实际执行结果 Demo案例Git地址 | Gitee 本文主要介绍自己在工作中在处理抛出异常类和封装响应类处理的模板总结。…

【matlab画多纵坐标图像】

一 、什么是多纵坐标图像 多纵坐标图像是一种在同一个坐标系中,使用多个纵坐标轴来表示不同的数据指标的图像。在多纵坐标图中,每个纵坐标轴可以有不同的刻度和单位,用于表示不同的数据范围。这样可以方便地比较不同指标的变化趋势&#xff0…

【C语言】单片机map表详细解析

1、RO Size、RW Size、ROM Size分别是什么 首先将map文件翻到最下面,可以看到 1.1 RO Size:只读段 Code:程序的代码部分(也就是 .text 段),它存放了程序的指令和可执行代码。 RO Data:只读…

供应链 | 顶刊POMS论文精读:交易成本经济学(TCE)——供应链效率理论

编者按 供应链效率提升指南:不可不知的TCE理论视角 本文为Production and Operations Management 期刊论文,原文信息: Ketokivi, M., & Mahoney, J. T. (2020). Transaction cost economics as a theory of supply chain efficiency. …

自然资源部最新Nature正刊!!!

2024年8月21日,国际顶级期刊《Nature》发表了自然资源部第二海洋研究所李家彪院士为通讯作者,张涛为第一作者的论文“超慢速扩张加克洋中脊的高变化岩浆增生”。这一成果颠覆了国际海洋学术界半个多世纪以来一直认为的超慢速扩张洋中脊岩浆供给极度贫瘠的…

9.28 Qt界面

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->setWindowTitle("Plane");this->setWindowIcon(QIcon("C:/Users/EDY/Desktop/递送发送.png"));QPushButton *btn1new QPushButton;this->setFixedSize(64…

[SAP ABAP] 锁对象

在SAP中使用锁对象,用于避免在数据库中插入或更改数据时出现不一致的情况 1.创建锁对象 数据准备 学校表(ZDBT_SCH_437) 使用事务码SE11创建锁对象 点击"锁对象"单选按钮,输入以E开头的锁定对象的名称,然后点击创建按钮 锁对象名…

施工现场安全帽监控预警#YOLO视觉 ai视频识别安全帽监测系统

在建筑工地上,安全始终是首要任务。为了提高工地安全,引入了安全帽监控预警系统,这是一项创新技术,利用人工智能和视频识别技术来监测工地上的安全帽佩戴情况。 这个系统的主要工作原理是在工地高危区域门口部署安全帽识别系统&a…