Cookie、Session与Token技术全解析
一、Cookie 技术1. 描述Cookie 是服务器通过 HTTP 响应头发送到浏览器并由浏览器临时或持久化存储的小型文本数据大小通常不超过4KB。Cookie 与域名绑定浏览器访问同一域名时会自动在请求头中携带 Cookie服务器以此识别客户端状态。2. 工作原理客户端首次请求服务器无 Cookie。服务器创建数据通过响应头Set-Cookie将 Cookie 发送给浏览器。浏览器将 Cookie 保存到内存或硬盘。后续请求时浏览器自动在请求头Cookie中携带该域名下的有效 Cookie。服务器解析 Cookie识别用户身份、状态等信息。3. 核心关键字Set-Cookie响应头下发 CookieCookie请求头自动携带setMaxAge过期时间秒setPath有效路径setHttpOnly禁止 JS 读取防 XSSnew Cookie(name, value)创建对象4. 适用场景记住用户名、自动登录购物车、浏览记录广告追踪、会话标识5. SpringBoot 代码示例RestController RequestMapping(/cookie) public class CookieController { // 设置Cookie GetMapping(/set) public String setCookie(HttpServletResponse response) { Cookie cookie new Cookie(username, student); cookie.setMaxAge(7 * 24 * 60 * 60); // 7天 cookie.setPath(/); cookie.setHttpOnly(true); response.addCookie(cookie); return Cookie 设置成功; } // 获取Cookie GetMapping(/get) public String getCookie(HttpServletRequest request) { Cookie[] cookies request.getCookies(); if (cookies null) return 无Cookie; for (Cookie c : cookies) { if (username.equals(c.getName())) { return 获取到Cookie c.getValue(); } } return 未找到Cookie; } // 删除Cookie GetMapping(/delete) public String deleteCookie(HttpServletResponse response) { Cookie cookie new Cookie(username, null); cookie.setMaxAge(0); cookie.setPath(/); response.addCookie(cookie); return Cookie已删除; } }二、Session 技术1. 描述Session 是服务器为每个客户端单独开辟的一块内存空间用于存储会话数据。每个 Session 拥有唯一标识SessionID默认通过 Cookie 传递名为JSESSIONID。Session 数据保存在服务器端安全性远高于 Cookie。2. 工作原理客户端首次请求服务器创建 Session 对象生成唯一SessionID。服务器将 SessionID 存入 Cookie返回给浏览器。浏览器保存该 Cookie后续请求自动携带JSESSIONID。服务器根据 SessionID 找到对应的 Session 数据。会话超时或主动销毁服务器释放 Session 内存。3. 核心关键字JSESSIONIDSession 唯一标识HttpSession会话对象setAttribute存数据getAttribute取数据invalidate()销毁会话setMaxInactiveInterval超时时间4. 适用场景用户登录状态保持后台管理系统权限验证跨页面共享临时数据5. SpringBoot 代码示例RestController RequestMapping(/session) public class SessionController { // 登录设置Session GetMapping(/login) public String login(HttpSession session) { session.setAttribute(userId, 1001); session.setAttribute(username, admin); session.setAttribute(isLogin, true); return Session 登录成功; } // 获取Session信息 GetMapping(/info) public String info(HttpSession session) { Boolean isLogin (Boolean) session.getAttribute(isLogin); if (isLogin null || !isLogin) { return 未登录请先登录; } Integer userId (Integer) session.getAttribute(userId); String username (String) session.getAttribute(username); return 用户信息ID userId 用户名 username; } // 退出销毁Session GetMapping(/logout) public String logout(HttpSession session) { session.invalidate(); return 已退出Session已销毁; } }三、Token 令牌技术1. 描述Token 是服务器生成的加密身份令牌最常用实现为JWTJSON Web Token。JWT 是无状态认证服务器不存储会话只通过密钥签名验证合法性。适合前后端分离、API、跨域、分布式系统。2. 工作原理用户登录成功服务器使用密钥将用户信息加密签名生成 JWT。JWT 返回给客户端客户端保存在localStorage或请求头中。后续请求在请求头Authorization: Bearer token携带 Token。服务器使用相同密钥验签、解密获取用户信息。过期或非法 Token 直接拒绝访问。3. JWT 结构三部分Header头部声明类型与加密算法Payload载荷存储用户 ID、用户名、过期时间非加密不存密码Signature签名服务器密钥签名防篡改4. 核心关键字JWTJSON Web TokenSecret Key密钥HS256签名算法Authorization: Bearer请求头携带无状态、跨域、防篡改5. 适用场景前后端分离项目RESTful API 接口认证小程序、App、微服务6. SpringBoot JWT 完整代码6.1 依赖 pom.xmldependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.9.1/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-impl/artifactId version0.9.1/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-jackson/artifactId version0.9.1/version /dependency6.2 JWT 工具类Component public class JwtUtil { // 密钥 private final String SECRET mySecretKey12345678901234567890; // 过期时间 2 小时 private final long EXPIRATION 2 * 60 * 60 * 1000L; // 生成Token public String createToken(String username, Integer userId) { return Jwts.builder() .setHeaderParam(typ, JWT) .claim(userId, userId) .claim(username, username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() EXPIRATION)) .signWith(SignatureAlgorithm.HS256, SECRET) .compact(); } // 解析Token public Claims parseToken(String token) { try { return Jwts.parser() .setSigningKey(SECRET) .parseClaimsJws(token) .getBody(); } catch (Exception e) { return null; } } // 是否过期 public boolean isExpired(String token) { Claims claims parseToken(token); return claims null || claims.getExpiration().before(new Date()); } }6.3 接口使用RestController RequestMapping(/token) public class TokenController { Resource private JwtUtil jwtUtil; // 登录生成Token GetMapping(/create) public String create() { String token jwtUtil.createToken(admin, 1001); return 生成Token\n token; } // 验证Token GetMapping(/verify) public String verify(String token) { if (jwtUtil.isExpired(token)) { return Token 已过期; } Claims claims jwtUtil.parseToken(token); Integer userId (Integer) claims.get(userId); String username (String) claims.get(username); return 验证成功\n用户ID userId \n用户名 username; } }四、三者对比对比项CookieSessionTokenJWT存储位置浏览器客户端服务器内存客户端安全性低明文较高高加密签名是否有状态有状态有状态无状态跨域支持不支持不支持支持分布式支持差需要共享优秀核心关键字Set-Cookie、maxAgeJSESSIONID、invalidateJWT、秘钥、签名适用场景记住用户名、购物车传统 Web 会话前后端分离、API、微服务五、总结Cookie服务器下发、浏览器保存、自动携带适合存储非敏感小数据。Session服务器存储、通过 JSESSIONID 识别适合传统 Web 会话登录。Token加密签名、无状态、跨域强适合前后端分离、API、分布式系统。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2571491.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!