Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试官:Session和JWT有什么区别?

面试官:Session和JWT有什么区别?

作者头像
用户11397231
发布于 2024-12-27 00:21:27
发布于 2024-12-27 00:21:27
13900
代码可运行
举报
文章被收录于专栏:算法算法
运行总次数:0
代码可运行

引言

在用户和服务器之间建立认证状态是Web开发中常见的需求。SessionJWTJSON Web Token)是两种常用的机制,但它们在工作原理、存储方式和安全性等方面存在差异。

什么是JWT?

JWT是一种开放标准(RFC 7519),用于在网络上安全传输信息的简洁、自包含的方式。它通常被用于身份验证和授权机制。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

  • 头部(Header):包含了关于生成该JWT的信息以及所使用的算法类型。
  • 载荷(Payload):包含了要传递的数据,例如身份信息和其他附属数据。JWT官方规定了7个字段,可供使用:
    • iss (Issuer):签发者。
    • sub (Subject):主题。
    • aud (Audience):接收者。
    • exp (Expiration time):过期时间。
    • nbf (Not Before):生效时间。
    • iat (Issued At):签发时间。
    • jti (JWT ID):编号。
  • 签名(Signature):使用密钥对头部和载荷进行签名,以验证其完整性。

JWT优点分析

相较于传统的基于会话(Session)的认证机制,JWT具有以下优势:

  • 无需服务器存储状态:服务器无需存储任何会话状态信息,所有的认证和授权信息都包含在JWT中。
  • 跨域支持JWT可以轻松地在多个域之间进行传递和使用,实现跨域授权。
  • 适应微服务架构:在微服务架构中,很多服务是独立部署并且可以横向扩展的,这就需要保证认证和授权的无状态性。
  • 自包含JWT包含了认证和授权信息,以及其他自定义的声明,这些信息都被编码在JWT中。
  • 扩展性JWT可以被扩展和定制,可以按照需求添加自定义的声明和数据。

JWT基本使用

Java开发中,可以借助JWT工具类来方便的操作JWT,例如HuTool框架中的JWTUtil

3.1 添加HuTool框架依赖

pom.xml中添加以下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>
3.2 生成Token
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String, Object> map = new HashMap<String, Object>() {
    private static final long serialVersionUID = 1L;
    {
        put("uid", Integer.parseInt("123")); // 用户ID
        put("expire_time", System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 15); // 过期时间15天
    }
};
String token = JWTUtil.createToken(map, "服务器端秘钥".getBytes());
3.3 验证和解析Token

验证Token的示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2MjQwMDQ4MjIsInVzZXJJZCI6MSwiYXV0aG9yaXRpZXMiOlsiUk9MRV_op5LoibLkuozlj7ciLCJzeXNfbWVudV8xIwiUk9MRV_op5LoibLkuIDlj7ciLCJzeXNfbWVudV8yIl0sImp0aSI6ImQ0YzVlYjgwLTA5ZTctNGU0ZC1hZTg3LTVkNGI5M2FhNmFiNiIsImNsaWVudF9pZCI6ImhhbmR5LXNob3AifQ.aixF1eKlAKS_k3ynFnStE7-IRGiD5YaqznvK2xEjBew";
JWTUtil.verify(token, "123456".getBytes());

解析Token的示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiYWRtaW4iOnRydWUsIm5hbWUiOiJsb29seSJ9.U2aQkC2THYV9L0fTN-yBBI7gmo5xhmvMhATtu8v0zEA";
final JWT jwt = JWTUtil.parseToken(rightToken);
jwt.getHeader(JWTHeader.TYPE);
jwt.getPayload("sub");
3.4 代码实战

在登录成功之后,生成Token的示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 登录成功,使用 JWT 生成 Token
Map<String, Object> payload = new HashMap<String, Object>() {
    private static final long serialVersionUID = 1L;
    {
        put("uid", userinfo.getUid());
        put("manager", userinfo.getManager());
        // JWT 过期时间为 15 天
        put("exp", System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 15);
    }
};
String token = JWTUtil.createToken(payload, AppVariable.JWT_KEY.getBytes());

例如在Spring Cloud Gateway网关中验证Token的实现代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import com.example.common.AppVariable;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.List;

/**
 * 登录过滤器(登录判断)
 */
@Component
public class AuthFilter implements GlobalFilter, Ordered {
    // 排除登录验证的 URL 地址
    private String[] skipAuthUrls = {"/user/add", "/user/login"};

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 当前请求的 URL
        String url = exchange.getRequest().getURI().getPath();
        for (String item : skipAuthUrls) {
            if (item.equals(url)) {
                // 继续往下走
                return chain.filter(exchange);
            }
        }
        ServerHttpResponse response = exchange.getResponse();
        // 登录判断
        List<String> tokens =
                exchange.getRequest().getHeaders().get(AppVariable.TOKEN_KEY);
        if (tokens == null || tokens.size() == 0) {
            // 当前未登录
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
        // token 有值
        String token = tokens.get(0);
        // JWT 效验 token 是否有效
        boolean result = false;
        try {
            result = JWTUtil.verify(token, AppVariable.JWT_KEY.getBytes());
        } catch (Exception e) {
            result = false;
        }
        if (!result) {
            // 无效 token
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        } else { // 判断 token 是否过期
            final JWT jwt = JWTUtil.parseToken(token);
            // 得到过期时间
            Object expObj = jwt.getPayload("exp");
            if (expObj == null) {
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                return response.setComplete();
            }
            long exp = Long.parseLong(expObj.toString());
            if (System.currentTimeMillis() > exp) {
                // token 过期
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                return response.setComplete();
                        }
    }
    return chain.filter(exchange);
}

@Override
public int getOrder() {
    // 值越小越早执行
    return 1;
}
}

JWT实现原理

JWT本质上是将秘钥存放在服务器端,并通过某种加密手段进行加密和验证的机制。加密签名=某加密算法(header+payload+服务器端私钥),因为服务端私钥别人不能获取,所以JWT能保证自身其安全性。

Session VS JWT

SessionJWT的区别主要有以下几点:

  • 工作原理不同Session机制依赖于服务器端的存储,而JWT是一种无状态的认证机制,它通过在客户端存储令牌(Token)来实现认证。
  • 存储方式不同Session信息存储在服务器端,而JWT信息存储在客户端。
  • 有效期和灵活性不同Session的有效期通常由服务器控制,而JWT的有效期可以在令牌生成时设置,并且可以在客户端进行缓存和重复使用。

总结

SessionJWT各有优势和适用场景。Session适合于需要频繁更改用户状态和服务器资源充足的场景,而JWT适合于分布式系统、微服务架构以及需要跨域认证的场景。选择合适的认证机制,可以提高系统的安全性、可扩展性和维护性。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试官:Session和JWT有什么区别?
Session 和 JWT(JSON Web Token)都是用于在用户和服务器之间建立认证状态的机制,但它们在工作原理、存储方式和安全性等方面存在着一些差异,下面我们一起来看。
磊哥
2024/04/04
3320
面试官:什么是JWT?为什么要用JWT?
目前传统的后台管理系统,以及不使用第三方登录的系统,使用 JWT 技术的还是挺多的,因此在面试中被问到的频率也比较高,所以今天我们就来看一下:什么是 JWT?为什么要用 JWT?
磊哥
2023/12/06
5050
面试官:什么是JWT?为什么要用JWT?
【微服务环境配置JWT】SpringBoot中配置jwt
1. 在微服务父工程中pom文件中引入,jwtToken依赖 <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version> </dependency> 2. 配置创建JwtToken的工具类 package priv.kuki.utils; import io.
CODER-V
2023/04/06
7440
微服务网关和Jwt令牌 入门学习!
对于微服架构的项目,不同的微服务会有不同的网络地址, 外部客户端可能需要调用多个服务的接口才能完成一个业务需求, 如果让客户端直接与各个微服务通信,会有以下的问题:
Java_慈祥
2024/08/06
2620
微服务网关和Jwt令牌 入门学习!
面试系列之-分布式统一设置验证token
在 Feign 客户端中,我们可以通过实现 RequestInterceptor 接口来实现拦截器。在拦截器中,我们可以设置请求头信息来携带 token。
用户4283147
2023/11/20
3570
面试系列之-分布式统一设置验证token
Java架构笔记:用JWT对SpringCloud进行认证和鉴权
JWT(JSON WEB TOKEN)是基于RFC 7519标准定义的一种可以安全传输的小巧和自包含的JSON对象。由于数据是使用数字签名的,所以是可信任的和安全的。JWT可以使用HMAC算法对secret进行加密或者使用RSA的公钥私钥对来进行签名。
慕容千语
2019/06/11
2.5K0
微服务网关鉴权:gateway使用、网关限流使用、用户密码加密、JWT鉴权
不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:
botkenni
2022/09/07
2.2K0
微服务网关鉴权:gateway使用、网关限流使用、用户密码加密、JWT鉴权
微服务网关限流&鉴权
​ 不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:
杨不易呀
2022/01/19
2K0
Gateway 自定义过滤器
Spring Cloud Gateway虽然自带有许多实用的GatewayFilter Factory、Gateway Filter、Global Filter,但是在很多业务情景下仍然需要自定义过滤器。实现一些自定义操作,满足业务需求。所以自定义过滤器就显得非常有必要。本文分表介绍自定义Gateway Filter、自定义Global Filter、自定义Gateway Filter Factory。
BUG弄潮儿
2020/12/17
2.2K0
【畅购商城】用户注册以及整合JWT
POST http://localhost:10010/web-service/user/register
陶然同学
2023/02/24
3960
【畅购商城】用户注册以及整合JWT
快速搭建一个网关服务,动态路由、鉴权的流程,看完秒会(含流程图)
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/09/23
1K0
快速搭建一个网关服务,动态路由、鉴权的流程,看完秒会(含流程图)
Token认证
文章目录 1. 认证机制 1.1. 常见的几种认证机制 1.1.1. HTTP Basic Auth 1.1.2. OAuth(开放授权) 1.1.3. Cookie/Session 认证机制 1.1.4. 基于 Token 的认证机制 1.1.5. 有状态服务和无状态服务 1.2. 基于JWT(JSON WEB TOKEN)的Token认证机制实现 1.2.1. 头部(Header) 1.2.2. 载荷(Payload) 1.2.3. 签名(Signature) 1.3. JJWT 1.3.1. 添加
爱撒谎的男孩
2019/12/31
2.2K0
java JWT:JSON Web Token 详解
JWT(JSON Web Token)是一种用于在各方之间安全传递信息的紧凑型、URL安全的令牌。它在现代 Web 应用中非常常见,尤其是在分布式系统和微服务架构中,主要用于身份验证和授权机制。本文将介绍 JWT 的基本概念、结构,并结合 Spring Boot 和 Node.js 等框架的实际应用场景,通过代码示例深入解析其原理与用法。同时,还会推荐一些常用的 JWT 工具,帮助你更好地理解和调试 JWT。
井九
2024/10/12
5300
SpringCloud Gateway + Jwt + Oauth2 实现网关的鉴权操作
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/08/29
3.7K0
SpringCloud Gateway + Jwt + Oauth2 实现网关的鉴权操作
SpringBoot学习笔记(八)——JWT
Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
张果
2022/11/30
1.9K0
SpringBoot学习笔记(八)——JWT
面试官:SpringCloudGateway过滤器类型有哪些?
在 Spring Cloud Gateway 中,过滤器是在请求到达目标服务之前或之后,执行某些特定操作的一种机制。例如,它可以实现对传入的请求进行验证、修改、日志记录、身份验证、流量控制等各种功能。
磊哥
2024/02/01
1630
面试官:SpringCloudGateway过滤器类型有哪些?
基于SpringBoot的JWT单点登录
这样我们的jwt单点登录的业务就完成了,但是还存在一个问题,加入用户在访问的过程中登录密文已经过期,那么是十分影响用户体验。我们如何解决这个问题
全栈程序员站长
2022/08/26
6070
基于SpringBoot的JWT单点登录
SpringBoot集成Shiro权限+Jwt认证
科技新语
2025/01/15
1160
SpringBoot集成Shiro权限+Jwt认证
什么是JWT
JWT(JSON Web Token)一种开放的标准规范(RFC 7519),用于在网络上安全传输和验证信息,通常被用于登录验证。
ma布
2024/11/15
1.4K0
什么是JWT
JWT
JWT官网 JSON Web Token (JWT) 是一个通过JSON形式作为WEB应用的令牌,用于在各方之间以 JSON 对象的形式安全传输信息。在传输过程中可以完成数据加密、签名等操作。 以下是JWT使用的一些场景:
十玖八柒
2022/08/01
1.4K0
JWT
相关推荐
面试官:Session和JWT有什么区别?
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验