前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >一文搞懂Cookie、Session、Token、JWT

一文搞懂Cookie、Session、Token、JWT

作者头像
用户11397231
发布2024-12-23 08:19:34
发布2024-12-23 08:19:34
25800
代码可运行
举报
文章被收录于专栏:算法算法
运行总次数:0
代码可运行

一文搞懂Cookie、Session、Token、JWT

在Web开发中,身份验证和会话管理是核心功能。本文将详细介绍Cookie、Session、Token和JWT这四种常用的技术,以及它们的使用场景和优缺点。

请添加图片描述
请添加图片描述

Cookie

Cookie是存储在客户端(用户浏览器)的小块数据,可以用来记住用户的相关信息,例如登录凭证或偏好设置。它们随每个HTTP请求发送给服务器,并且可以被服务器读取以维持会话或个性化用户体验。

示例: 想象用户登录银行网站。服务器创建一个包含会话标识符的Cookie,并通过Set-Cookie头部发送回用户的浏览器。浏览器存储此Cookie,并在随后的请求中将其发送回服务器,允许服务器识别用户并在多个页面加载中保持他们的登录状态。

Session

会话用于跟踪用户在多个页面请求期间的状态。它们通常存储在服务器端,并且与唯一的会话标识符(通常是会话ID)相关联,会话ID作为Cookie发送给客户端。会话允许服务器在用户访问期间记住有关用户的信息。

示例: 用户在电子商务网站上购物。服务器为用户创建一个会话,存储他们的购物车项目和其他相关信息。会话ID作为Cookie发送给用户的浏览器。随着用户在网站上导航,Cookie中的会话ID允许服务器访问用户会话数据,使用户能够无缝购物体验。

Token

Token是一种无状态认证形式,客户端拥有一个令牌,通常是一串字符串,用于认证向服务器的请求。Token不要求服务器跟踪用户的状态,因为所有必要的信息都编码在令牌本身中。

示例: 用户希望通过移动应用程序访问他们的电子邮件。应用程序向电子邮件提供商的服务器发送带有用户凭据的请求。成功认证后,服务器发出一个访问令牌。应用程序存储此令牌,并在随后的API请求中使用它来访问用户的电子邮件。

JWT (JSON Web Tokens)

JWT是一种紧凑、安全的表示双方之间传输声明的方法。JWT是一个包含头部、负载和签名的JSON对象。JWT可用于认证和授权用户,它们是自包含的,意味着验证它们所需的所有信息都包含在令牌本身中。

示例: 开发人员创建了一个具有单点登录功能的Web应用程序。用户登录后,服务器生成一个包含用户身份和权限的JWT。这个JWT发送给客户端并存储在本地。当用户想要访问受保护的资源时,客户端在HTTP请求的Authorization头部中包含JWT。服务器验证JWT,如果有效,则授予资源访问权限。

四者的区别

特性

Cookie

Session

Token

JWT

定义

服务器发送到浏览器的数据,用于跟踪状态

服务器端的会话状态记录

安全令牌,用于身份验证和信息交换

基于JSON的轻量级认证机制

存储位置

客户端

服务器端

客户端(LocalStorage或Cookie)

客户端(LocalStorage或Cookie)

安全性

较低,易被窃取或篡改

较高,数据不在客户端暴露

较高,尤其是加密Token

较高,包含签名,验证数据完整性

跨域支持

默认不支持,可通过设置实现

不支持,依赖Cookie

支持,不依赖Cookie

支持,不依赖Cookie

大小限制

约4KB

无大小限制

无大小限制

通常较小,但受JSON大小限制

生命周期

可设置过期时间

通常在用户关闭浏览器或超时后失效

可设置过期时间

可设置过期时间

无状态支持

不支持,依赖于Cookie

不支持,依赖于Session

支持,但Session需基于Cookie

支持,服务端无状态

适用场景

简单的会话跟踪,用户偏好设置

需要服务器记住用户状态的场景

移动应用、API身份验证、跨域请求

Web应用、移动应用、单点登录

项目实战

以下是在Spring Boot中使用Cookie、Session、Token和JWT的实战示例。

Cookie实战
代码语言:javascript
代码运行次数:0
复制
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

@GetMapping("/setCookie")
public String setCookie(HttpServletResponse response) {
    Cookie cookie = new Cookie("user", "john_doe");
    cookie.setMaxAge(3600); // 设置Cookie的生命周期为1小时
    response.addCookie(cookie);
    return "Cookie设置成功!";
}
Session实战
代码语言:javascript
代码运行次数:0
复制
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;

@GetMapping("/setSession")
public String setSession(HttpServletRequest request) {
    HttpSession session = request.getSession();
    session.setAttribute("user", "john_doe");
    return "Session设置成功!";
}
Token实战
代码语言:javascript
代码运行次数:0
复制
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

@PostMapping("/login")
public String login(@RequestBody UserCredentials credentials) {
    // 在实际应用中,这里应该是对用户进行验证
    if (credentials.getUsername().equals("john_doe") && credentials.getPassword().equals("password123")) {
        // 生成Token
        String token = Jwts.builder()
                .setSubject(credentials.getUsername())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 设置Token过期时间为1小时
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
        return "登录成功!生成的Token:" + token;
    } else {
        return "用户名或密码错误!";
    }
}
JWT实战
代码语言:javascript
代码运行次数:0
复制
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;

@GetMapping("/secure")
public String secure(@RequestHeader("Authorization") String token) {
    // 在实际应用中,这里应该是验证Token的有效性
    String user = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token.replace("Bearer ", "")).getBody().getSubject();
    return "受保护的端点访问成功,用户:" + user;
}

安全措施

  1. 使用HTTPS:保护数据在客户端和服务器之间传输的安全性。
  2. 密钥管理:对于JWT,密钥管理是至关重要的。使用安全的方式来存储和访问签名密钥,并且定期更换密钥。
  3. 防止CSRF攻击:确保所有敏感操作都通过POST请求执行,使用Spring Security的@csrfProtection注解来启用CSRF保护。

总结

Cookie和Session是传统的基于服务器的会话管理机制,而Token和JWT则是更为灵活和安全的身份验证和授权机制,适用于分布式系统和前后端分离的应用场景。JWT是Token的一种实现方式,具有更高的可移植性和可扩展性。选择合适的技术可以有效地保护系统稳定运行并提高用户体验。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一文搞懂Cookie、Session、Token、JWT
    • Cookie
    • Session
    • Token
    • JWT (JSON Web Tokens)
    • 四者的区别
    • 项目实战
      • Cookie实战
      • Session实战
      • Token实战
      • JWT实战
    • 安全措施
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档