cookie,session,token,jwt,oauth2 有什么区别?

news/2025/11/27 9:41:01/文章来源:https://www.cnblogs.com/12lisu/p/19275618

前言

最近发现有些小伙伴,对Token、Session、Cookie、JWT、OAuth2这些概念非常容易搞混。

有些小伙伴在工作中可能会遇到过这样的困惑:

  • 做登录功能时,到底该用Session还是JWT?
  • OAuth2和Token是什么关系?
  • 为什么有的方案要把Token存在Cookie里?

今天这篇文章专门跟大家一起聊聊这个话题,希望对你会有所帮助。

一、从餐厅就餐模型开始讲

为了让大家更好理解,我先用一个餐厅就餐的比喻来解释这些概念:

image

现在,让我们深入每个概念的技术细节。

二、Cookie:HTTP的世界身份证

2.1 什么是Cookie?

Cookie是存储在浏览器端的一小段文本数据,由服务器通过HTTP响应头的Set-Cookie字段发送给浏览器,浏览器随后会自动在每次请求中通过Cookie头将其带回给服务器。

工作原理

image

2.2 Cookie实战代码

// 服务器设置Cookie
@PostMapping("/login")
public ResponseEntity login(@RequestBody User user, HttpServletResponse response) {if (authService.authenticate(user)) {Cookie cookie = new Cookie("session_id", generateSessionId());cookie.setMaxAge(3600); // 1小时有效期cookie.setHttpOnly(true); // 防止XSS攻击cookie.setSecure(true); // 仅HTTPS传输cookie.setPath("/"); // 对整个站点有效response.addCookie(cookie);return ResponseEntity.ok().build();}return ResponseEntity.status(401).build();
}// 读取Cookie
@GetMapping("/profile")
public ResponseEntity getProfile(@CookieValue("session_id") String sessionId) {User user = sessionService.getUserBySession(sessionId);return ResponseEntity.ok(user);
}

2.3 Cookie的重要属性

属性 作用 安全建议
HttpOnly 防止JavaScript访问 必须设置为true,防XSS
Secure 仅通过HTTPS传输 生产环境必须设置为true
SameSite 控制跨站请求时是否发送Cookie 建议设置为Strict或Lax
Max-Age 设置Cookie有效期 根据业务安全性要求设置

三、Session:服务端的用户档案

3.1 什么是Session?

Session是存储在服务器端的用户状态信息。服务器为每个用户创建一个唯一的Session ID,并通过Cookie将这个ID传递给浏览器,浏览器后续请求时带上这个ID,服务器就能识别用户身份。

Session存储结构

// 典型的Session数据结构
public class UserSession {private String sessionId;private String userId;private String username;private Date loginTime;private Date lastAccessTime;private Map<String, Object> attributes; // 自定义属性// 省略getter/setter
}

3.2 Session实战代码

// 基于Spring Session的实现
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password,HttpSession session) {User user = userService.authenticate(username, password);if (user != null) {// 将用户信息存入Sessionsession.setAttribute("currentUser", user);session.setAttribute("loginTime", new Date());return "redirect:/dashboard";}return "login?error=true";
}@GetMapping("/dashboard")
public String dashboard(HttpSession session) {// 从Session获取用户信息User user = (User) session.getAttribute("currentUser");if (user == null) {return "redirect:/login";}return "dashboard";
}

3.3 Session的存储方案

1. 内存存储(默认)

# application.yml
server:servlet:session:timeout: 1800 # 30分钟过期时间

2. Redis分布式存储

@Configuration
@EnableRedisHttpSession // 启用Redis Session存储
public class SessionConfig {@Beanpublic LettuceConnectionFactory connectionFactory() {return new LettuceConnectionFactory();}
}

3. Session集群同步问题

image

四、Token:去中心化的身份令牌

4.1 什么是Token?

Token是一种自包含的身份凭证,服务器不需要在服务端存储会话状态,所有必要信息都包含在Token本身中。

Token vs Session 核心区别

image

4.2 Token实战代码

// 生成Token
public String generateToken(User user) {long currentTime = System.currentTimeMillis();return JWT.create().withIssuer("myapp") // 签发者.withSubject(user.getId()) // 用户ID.withClaim("username", user.getUsername()).withClaim("role", user.getRole()).withIssuedAt(new Date(currentTime)) // 签发时间.withExpiresAt(new Date(currentTime + 3600000)) // 过期时间.sign(Algorithm.HMAC256(secret)); // 签名密钥
}// 验证Token
public boolean validateToken(String token) {try {JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret)).withIssuer("myapp").build();DecodedJWT jwt = verifier.verify(token);return true;} catch (JWTVerificationException exception) {return false;}
}

五、JWT:现代化的Token标准

5.1 什么是JWT?

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为JSON对象。

这种信息可以被验证和信任,因为它是数字签名的。

JWT结构

header.payload.signature

解码示例

// Header
{"alg": "HS256","typ": "JWT"
}// Payload
{"sub": "1234567890","name": "John Doe","iat": 1516239022,"exp": 1516242622
}// Signature
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

5.2 JWT实战代码

// 创建JWT
public String createJWT(User user) {return Jwts.builder().setHeaderParam("typ", "JWT").setSubject(user.getId()).setIssuer("myapp").setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + 3600000)).claim("username", user.getUsername()).claim("role", user.getRole()).signWith(SignatureAlgorithm.HS256, secret.getBytes()).compact();
}// 解析JWT
public Claims parseJWT(String jwt) {return Jwts.parser().setSigningKey(secret.getBytes()).parseClaimsJws(jwt).getBody();
}// 在Spring Security中使用JWT
@Component
public class JwtFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {String token = resolveToken(request);if (token != null && validateToken(token)) {Authentication auth = getAuthentication(token);SecurityContextHolder.getContext().setAuthentication(auth);}chain.doFilter(request, response);}
}

5.3 JWT的最佳实践

1. 安全存储

// 前端安全存储方案
// 不推荐:localStorage(易受XSS攻击)
// 推荐:HttpOnly Cookie(防XSS)或内存存储

2. 令牌刷新机制

// 双Token机制:Access Token + Refresh Token
public class TokenPair {private String accessToken;  // 短期有效:1小时private String refreshToken; // 长期有效:7天
}// 刷新令牌接口
@PostMapping("/refresh")
public ResponseEntity refresh(@RequestBody RefreshRequest request) {String refreshToken = request.getRefreshToken();if (validateRefreshToken(refreshToken)) {String userId = extractUserId(refreshToken);String newAccessToken = generateAccessToken(userId);return ResponseEntity.ok(new TokenPair(newAccessToken, refreshToken));}return ResponseEntity.status(401).build();
}

六、OAuth 2.0:授权框架之王

6.1 什么是OAuth 2.0?

OAuth 2.0是一个授权框架,允许第三方应用在获得用户授权后,代表用户访问受保护的资源。

OAuth 2.0角色

  • 资源所有者(Resource Owner):用户
  • 客户端(Client):第三方应用
  • 授权服务器(Authorization Server):颁发访问令牌
  • 资源服务器(Resource Server):托管受保护资源

6.2 OAuth 2.0授权码流程

image

6.3 OAuth 2.0实战代码

// Spring Security OAuth2配置
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {@Autowiredprivate AuthenticationManager authenticationManager;@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.inMemory().withClient("clientapp").secret(passwordEncoder.encode("123456")).authorizedGrantTypes("authorization_code", "refresh_token").scopes("read", "write").redirectUris("http://localhost:8080/callback");}@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) {endpoints.authenticationManager(authenticationManager).tokenStore(tokenStore()).accessTokenConverter(accessTokenConverter());}
}// 资源服务器配置
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/api/public/**").permitAll().antMatchers("/api/private/**").authenticated().antMatchers("/api/admin/**").hasRole("ADMIN");}
}

七、五大概念对比

为了让大家更清晰地理解这五个概念的关系和区别,我准备了以下对比表格:

7.1 功能定位对比

概念 本质 存储位置 主要用途 特点
Cookie HTTP状态管理机制 浏览器 维持会话状态 自动携带,有大小限制
Session 服务端会话信息 服务器 存储用户状态 服务端状态,需要存储管理
Token 访问凭证 客户端/服务端 身份认证 自包含,可验证
JWT Token的一种实现标准 客户端/服务端 安全传输信息 标准化,自包含,可签名
OAuth2 授权框架 不直接存储 第三方授权 标准化授权流程

7.2 应用场景对比

场景 推荐方案 原因说明
传统Web应用 Session + Cookie 简单易用,生态成熟
前后端分离应用 JWT 无状态,适合API认证
第三方登录 OAuth 2.0 标准化授权,安全可靠
微服务架构 JWT 分布式认证,无需会话同步
移动端应用 Token 轻量级,适合移动网络

7.3 安全考虑对比

安全威胁 Cookie方案防护 Token/JWT方案防护
XSS攻击 HttpOnly Cookie 避免localStorage存储
CSRF攻击 SameSite Cookie 自定义Header+CSRF Token
令牌泄露 短期有效+HTTPS 短期有效+HTTPS+刷新机制
数据篡改 服务端验证 签名验证

总结

通过今天的深入探讨,我们可以得出以下结论:

  1. Cookie是载体:HTTP协议的状态管理机制,是Session和Token的传输媒介之一。
  2. Session是状态:服务端维护的会话状态,需要借助Cookie或URL重写来实现。
  3. Token是凭证:认证授权的凭证,可以放在Cookie、Header或URL中。
  4. JWT是标准:Token的一种标准化实现,自包含、可验证、可信任。
  5. OAuth2是框架:授权框架,定义了完整的第三方授权流程。

最终建议

  • 简单Web应用:Session + Cookie
  • 前后端分离:JWT + HTTP Header
  • 第三方授权:OAuth 2.0 + JWT

没有最好的方案,只有最合适的方案。

理解每个技术的本质和适用场景,才能做出正确的架构决策。

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。

更多项目实战在我的技术网站:http://www.susan.net.cn/project

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

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

相关文章

内网win10电脑连接外网白名单服务

前提:在客户方做内网开发,服务部署在客户自己的服务器上,内外网隔离。现在项目需要调用一些固定ip的外部服务,开发机需要连通这些服务。hosts文件添加要访问的服务的域名,域名解析由网关负责,ip地址指向网关就行…

2025年灵活办公室渠道哪家强

2025年灵活办公室渠道首选:江苏高格商务服务有限公司灵活办公新趋势,高格领航未来随着2025年的到来,灵活办公市场呈现出蓬勃发展的态势。在众多办公服务商中,江苏高格商务服务有限公司凭借其卓越的服务品质和前瞻性…

2025年11月热处理厂家推荐榜单与市场选择指南

随着制造业向高端化、精密化方向转型,热处理作为提升机械零部件性能的关键工艺环节,其专业性和可靠性日益受到重视。许多机械制造企业、零部件供应商及研发机构在寻找热处理合作厂家时,往往面临信息不对称、技术能力…

2025年11月连接器厂家推荐榜单:主流品牌综合对比与选择指南

在工业自动化、电气连接及设备制造领域,选择一家可靠的连接器厂家是确保系统稳定、提升生产效率的关键一环。许多工程师、采购决策者或项目负责人在筛选供应商时,通常会综合考虑厂家的技术实力、产品范围、质量控制、…

【ACM出版 | EI,Scopus,ACM三检索】第二届体育科技与运动表现分析国际学术会议(ICSTPA 2025)

2025年体育科技与运动表现分析国际学术会议(ICSTPA 2025)将于2025年12月5 - 7日在华南师范大学体育科学学院隆重召开。【【ACM 独立出版 | EI检索快速稳定 | 华南师范大学主办】】 第二届体育科技与运动表现分析国际…

【URP】Unity[内置Shader]光照着色器Lit

Lit Shader的作用与原理 Lit Shader是Unity通用渲染管线(URP)中的核心着色器,专门用于实现基于物理的渲染(PBR)效果。它能以照片级质量渲染真实世界的表面材质,如石头、木材、【从UnityURP开始探索游戏渲染】专栏-直…

【SAE出版 | EI检索】第五届物流系统与交通运输国际学术会议(LSTT 2025)

第五届物流系统与交通运输国际学术会议(LSTT 2025)将于2025年12月5-7日在大连召开,这是一个集中探讨全球物流和交通运输领域创新和挑战的国际学术平台。【【SAE出版 | 录用率高 | EI检索稳定 | 往届多个数据库收录】…

2025 年留学生求职机构最新推荐榜,聚焦服务深度与成果转化,权威测评赋能海归高效就业留学生求职/大学留学生求职/海归留学生求职/留学生求职就业推荐

引言 全球化就业市场竞争持续加剧,回国求职的留学生规模预计突破 135 万,而优质岗位增长率不足 6%,平均 40 人角逐 1 个核心职位,87% 的留学生因求职信息差、职场规则适配不足陷入困境。本次榜单由国际行业协会联合…

2025年11月热处理厂家选择指南:多维度对比与行业标准验证

作为机械制造、航空航天或汽车工业领域的从业者,您可能正在寻找一家可靠的热处理服务供应商。热处理工艺直接影响零部件的耐磨性、疲劳强度和寿命,选择专业技术扎实、资质齐全的厂家至关重要。当前行业呈现专业化与绿…

2025年最新专注力少儿训练公司哪家好

2025年专注力少儿训练首选:德一书院在当今信息爆炸的时代,少儿专注力训练已成为家长们关注的重点。2025年,如果您正在寻找专业的专注力训练机构,德一书院无疑是您的最佳选择。为什么选择德一书院?专业的专注力训练…

研发制品仓库选型新思路:安全、成本与未来技术兼容性的平衡之道

云原生与DevOps成熟背景下,研发制品仓库成为软件供应链核心,国际产品存在局限,国产制品管理平台优势凸显。在安全内生管控、成本优化、多类型制品兼容、国产化适配等方面表现突出,企业选型需聚焦这些维度,选择契合…

本地业绩库AI助手:让企业从文件夹混乱中解放出来!

每家企业都在说“要数字化转型”, 但真正的转变,不在于买多少系统, 而在于——让自己的资料“能被理解”。 🧠 D-Hub智慧标书-“业绩库AI助手” 不需要上云、不怕泄密,兼容现有文件结构, 让你从文件夹地狱走向知…

2025 最新冷却塔施工单位推荐排行榜:覆盖防腐美化维修全场景,聚焦专业资质与全国服务冷却塔美化/冷却塔防腐/冷却塔彩绘/冷却塔维修/冷却塔绘画公司推荐

引言 随着工业生产对配套设施可靠性要求的提升,冷却塔作为核心散热设备,其施工质量直接关系到生产效率、安全运营与成本控制。当前市场中施工单位资质参差不齐、技术工艺差异显著,部分企业存在服务响应滞后、区域覆…

温度+厚度+高度!博尔思三维教育助力终身成长

在深圳这座教育资源丰富的城市,家长们常常为孩子的个性化成长需求而奔波。博尔思教育作为首批市教育局白名单机构之一,17年来以“一个团队服务一名学生”为核心,累计帮助数万学子突破学习瓶颈。拥有300余名专职教师…

2025年专业汽车窗膜供货商推荐排行榜单

2025年专业汽车窗膜供货商推荐排行榜单榜单前言随着汽车后市场需求的不断升级,汽车窗膜作为重要的汽车配件,其品质和性能越来越受到消费者的重视。经过对市场各品牌的综合评估,我们为您带来2025年度专业汽车窗膜供货…

习题解析之:上课 or 休息

习题解析之:上课 or 休息【问题描述】 按照武汉理工大学课表时间安排,编写一个根据输入的时间输出课堂的节数or休息。按上图所示,根据输入的时间hh:mm,输出第n节课其中1<=n<=13或者休息。 本题中不允许使用e…

匹配更快、管控更严:比心平台的核心竞争力拆解

在游戏社交成为主流需求的当下,6000万用户与超800万游戏大神的选择,让比心从单一服务平台成长为行业领先者之一。用户对陪伴、上分、情感共鸣的核心诉求,推动比心十年间不断迭代,从游戏陪练延伸至电竞社区生态。平…

2025年新疆电线电缆厂家权威推荐榜单:高温电缆/电力电缆/矿用电缆源头厂家精选

在新疆的能源基地建设、城乡电网改造和工业发展中,电线电缆作为电力传输和信号控制的核心载体,其导电性能、绝缘强度及环境适应性直接影响工程质量和运营安全。本文基于企业生产能力、产品体系、质量控制和区域服务能…

2025 最新烟囱施工单位推荐排行榜:涵盖防腐美化拆除新建等全业务,技术革新与快速响应企业精选烟囱防腐/烟囱美化/烟囱刷航标/烟囱绘画/烟囱拆除/烟囱安装/烟囱加固公司推荐

引言 烟囱工程作为工业生产与基础设施的核心配套,其施工质量直接关联企业安全运营、环保合规与长期效益。当前市场中,资质不齐、技术滞后、响应缓慢等问题频发,部分企业因选择不当导致工程返工、安全事故或生产停滞…

2025年淮安备婚平台Top5推荐:口碑与专业度并重

摘要 淮安备婚服务行业近年来快速发展,随着年轻人对婚礼个性化需求的提升,本地平台和服务商不断涌现,专注于提供高品质、定制化的备婚解决方案。本文基于行业数据和用户反馈,整理出2025年淮安地区备婚平台推荐榜单…