首页 > 其他分享 >Session、Cookie 和 Token 三种身份验证机制

Session、Cookie 和 Token 三种身份验证机制

时间:2023-07-03 18:33:25浏览次数:42  
标签:身份验证 用户 Token Session Cookie 服务器

Session、Cookie 和 Token 三种身份验证机制

在Web开发中,身份验证是一种常见的需求,它可以保证用户的安全和权限。身份验证的目的是让服务器知道用户是谁,以及用户可以做什么。但是,由于HTTP协议是无状态的,也就是说,每次请求都是独立的,服务器无法直接识别出用户的身份。因此,需要一些机制来在请求之间保存用户的状态信息。本文将介绍三种常用的身份验证机制:Session、Cookie 和 Token。

Session

Session 是一种基于服务器的身份验证机制,它利用服务器端的内存或数据库来存储用户的状态信息。当用户第一次访问服务器时,服务器会为用户创建一个唯一的标识符,称为 Session ID,并将其发送给客户端。客户端可以将 Session ID 保存在浏览器的内存中,或者通过 URL 参数或隐藏表单字段传递给服务器。当用户再次访问服务器时,服务器会根据 Session ID 查找对应的 Session 数据,并根据其中的信息进行身份验证和授权。

Session 的优点是:

  • 安全性较高,因为 Session 数据只存储在服务器端,客户端无法篡改。
  • 灵活性较高,因为 Session 数据可以存储任意类型和数量的信息。

Session 的缺点是:

  • 占用服务器资源,如果用户量较大或 Session 数据较多,会增加服务器的负担和开销。
  • 不利于分布式部署,如果有多台服务器提供服务,需要保证 Session 数据在各个服务器之间同步或共享,否则会导致用户状态丢失或不一致。

Cookie

Cookie 是一种基于客户端的身份验证机制,它利用浏览器的本地存储来保存用户的状态信息。当用户第一次访问服务器时,服务器会为用户生成一个包含用户信息的字符串,并通过响应头 Set-Cookie 发送给客户端。客户端会将这个字符串保存在浏览器的 Cookie 中,并在之后的每次请求中通过请求头 Cookie 自动发送给服务器。当用户再次访问服务器时,服务器会根据 Cookie 中的信息进行身份验证和授权。

Cookie 的优点是:

  • 减轻服务器压力,因为 Cookie 数据存储在客户端,不占用服务器资源。
  • 适合分布式部署,因为 Cookie 数据随着请求发送到任何服务器,不需要额外的同步或共享机制。

Cookie 的缺点是:

  • 安全性较低,因为 Cookie 数据存储在客户端,容易被窃取或篡改。为了增加安全性,可以对 Cookie 数据进行加密或签名,并设置过期时间和域名限制。
  • 灵活性较低,因为 Cookie 数据有大小和数量限制,并且只能存储字符串类型的信息。

Token

Token 是一种结合了服务器端和客户端的身份验证机制,它利用加密算法和密钥来生成和验证用户的状态信息。当用户第一次访问服务器时,服务器会根据用户提供的凭证(如用户名和密码)验证用户的身份,并生成一个包含用户信息和有效期等元数据的字符串,并对其进行加密或签名,称为 Token,并将其发送给客户端。客户端可以将 Token 保存在浏览器的本地存储中,并在之后的每次请求中通过请求头 Authorization 或其他方式发送给服务器。当用户再次访问服务器时,服务器会根据 Token 中的元数据进行身份验证和授权,并检查 Token 的有效性和完整性。

Token 的优点是:

  • 安全性较高,因为 Token 数据经过加密或签名,客户端无法篡改,服务器无需存储用户状态信息,只需要验证 Token 的有效性和完整性。
  • 灵活性较高,因为 Token 数据可以存储任意类型和数量的信息,并且可以根据不同的场景和需求使用不同的加密算法和密钥。

Token 的缺点是:

  • 增加服务器计算量,因为服务器需要对每个 Token 进行加密或签名和解密或验证的操作,这会消耗一定的 CPU 资源和时间。
  • 不利于用户状态管理,因为 Token 一旦生成,就无法修改或撤销,只能等待其过期或失效。如果需要实现用户的登出或权限变更等功能,需要额外的机制来处理。

JAVA示例

以下是使用 JAVA 实现 Session、Cookie 和 Token 三种身份验证机制的简单示例:

Session

// 创建 Session
HttpSession session = request.getSession();
// 设置 Session 属性
session.setAttribute("username", "Alice");
// 获取 Session 属性
String username = (String) session.getAttribute("username");
// 移除 Session 属性
session.removeAttribute("username");
// 销毁 Session
session.invalidate();

Cookie

// 创建 Cookie
Cookie cookie = new Cookie("username", "Alice");
// 设置 Cookie 属性
cookie.setMaxAge(60 * 60); // 有效期为一小时
cookie.setPath("/"); // 适用于所有路径
cookie.setSecure(true); // 只在 HTTPS 下发送
cookie.setHttpOnly(true); // 防止 JavaScript 访问
// 发送 Cookie
response.addCookie(cookie);
// 获取 Cookie
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies) {
    if (c.getName().equals("username")) {
        String username = c.getValue();
    }
}
// 删除 Cookie
cookie.setMaxAge(0); // 设置有效期为0
response.addCookie(cookie); // 重新发送 Cookie

Token

// 生成 Token(使用 JWT 库)
String secret = "secret"; // 密钥
Map<String, Object> claims = new HashMap<>(); // 载荷
claims.put("username", "Alice"); // 用户名
claims.put("role", "admin"); // 角色
claims.put("exp", System.currentTimeMillis() + 60 * 60 * 1000); // 过期时间(一小时后)
String token = Jwts.builder()
        .setClaims(claims)
        .signWith(SignatureAlgorithm.HS256, secret) // 签名算法和密钥
        .compact(); // 生成 Token 字符串
// 发送 Token(可以通过响应体或响应头发送)
response.setHeader("Authorization", "Bearer " + token);
// 获取 Token(可以通过请求体或请求头获取)
String token = request.getHeader("Authorization").substring(7); // 去掉 "Bearer " 前缀
// 验证 Token(使用 JWT 库)
try {
    Claims claims = Jwts.parser()
            .setSigningKey(secret) // 设置密钥
            .parseClaimsJws(token) // 解析 Token 字符串
            .getBody(); // 获取载荷对象
    String username = claims.get("username", String.class); // 获取用户名
    String role = claims.get("role", String.class); // 获取角色
    long exp = claims.get("exp", Long.class); // 获取过期时间
} catch (Exception e) {
    // 如果 Token 无效或过期,会抛出异常
}

对于三种验证方式的对比及使用场景,可以参考以下的表格:

验证方式优点缺点使用场景
Session 安全性高,灵活性高 占用服务器资源,不利于分布式部署 用户量较小,数据量较大,安全性要求较高的情况
Cookie 减轻服务器压力,适合分布式部署 安全性低,灵活性低 用户量较大,数据量较小,安全性要求较低的情况
Token 安全性高,灵活性高 增加服务器计算量,不利于用户状态管理 用户量较大,数据量较大,安全性要求较高的情况

一般来说,Session 更适合传统的 Web 应用,Cookie 更适合简单的 Web 应用,Token 更适合前后端分离的 Web 应用或移动应用。

总结

Session、Cookie 和 Token 是三种常用的身份验证机制,它们各有优缺点,适用于不同的场景和需求。在实际开发中,可以根据具体情况选择合适的身份验证机制,或者结合使用多种身份验证机制,以达到最佳的效果。

标签:身份验证,用户,Token,Session,Cookie,服务器
From: https://www.cnblogs.com/shoshana-kong/p/17523667.html

相关文章

  • 如何使用token进行身份认证
    如何使用token进行身份认证什么是token?token是一种用于身份认证的技术,它是一个包含用户信息和签名的字符串,通常由服务器生成并返回给客户端。客户端在每次请求时,都需要携带token来证明自己的身份。服务器通过验证token的有效性和完整性,来授权客户端访问受保护的资源。为什么要......
  • Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 问题解决
    以下是报错日志解决方案确认以下配置是否都存在:1、配置文件有写mybatis配置2、启动类里加上Mapper扫描的注解(指向自己mapper存放的位置)3、删除SpringBootApplication注解的exclude属性:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,DataSourc......
  • ERROR in static/js/*** from UglifyJs Unexpected token: punc (,) [./~/@vant/poppe
     今天打包的时候发现这样的问题,解决方式:找到webpack.base.conf.js文件,加入下边的代码: {test:/\.mjs$/,loader:"babel-loader",include:[resolve("node_modules/@vant/popperjs/dist/index.esm.mjs")]},......
  • springboot+token+redis,模拟登录
    登录测试的controller:loginTest.javapackagecom.example.demo.controller;importcom.example.demo.po.ResponseBean;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.web.bind.annotation.*;importjavax.annotation.Resource;i......
  • 基于Sa-Token实现微服务之前的单点登录
    修改配置文件,准备好四个域名127.0.0.1auth.server.com127.0.0.1user.server.com127.0.0.1third.server.com127.0.0.1eureka.server.com注册中心:eureka-server服务pom依赖<dependency><groupId>org.springframework.cloud</groupId>......
  • 云服务器 搭建NFS 文件系统 用于解决负载均衡session 文件共享等
    解决的问题:如果多台服务器负载均衡用户没有根据TCP设置分配在一台服务器那么session无法共享文件无法共享一台服务器创建了文件另外一台也会同步创建1.搭建NFSServe注意:共享系统的服务端和客户端不能安装在同一台服务器上例如你做负载均衡的2台服务器内网ip 12.20.10......
  • token(JWT)
    token(JWT)token是服务端生成并返回给HTTP客户端的一串加密字符串,token中保存着用户信息实现会话控制,可以识别用户的身份,主要用于移动端APPtoken的工作流程校验身份,校验通过后响应token,token一般是在响应体中返回给客户端的后续发送请求时,需要手动将token添加在请求报文中......
  • 三个好基友Cookie、Session和Token
    原创声明,转载请注明文章链接来源、作者信息https://mp.weixin.qq.com/s/JGuo0HPAEmcNQMAQ22MhjgCookie、Token和Session区别hello,我是索奇~精心写了一篇Cookie、Session和Token的vivid文章,并分享给大家我们可以把Cookie、Token和Session看作是三个好基友,它们都是用来跟踪用户的身......
  • Csharp的CancellationToken 案例
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Net.Http;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;//命名空间namespacepro01{//类internalclassProgram{//main方法......
  • node使用jsonwebtoken生成token与验证是否过期
    场景我们可以使用cookie,session,token来做鉴权。下面我们来看一下,如何使用token来做鉴权jwt.sign的简单介绍npminstalljsonwebtoken下载使用jsonwebtoken生成token的基本语法。jwt.sign(payload,secretOrPrivateKey,[options,callback])第1个参数payload:可以......