当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2024-04-03 17:39:40 136观看
导读Session 和 JWT(JSON Web Token)都是用于在用户和服务器之间建立认证状态的机制,但它们在工作原理、存储方式和安全性等方面存在着一些差异,下面我们一起来看。1.什么是JWT?Session 我们已经很熟悉了,那什么是 JWT 呢?JWT(JSO

KHk28资讯网——每日最新资讯28at.com

Session 和 JWT(JSON Web Token)都是用于在用户和服务器之间建立认证状态的机制,但它们在工作原理、存储方式和安全性等方面存在着一些差异,下面我们一起来看。KHk28资讯网——每日最新资讯28at.com

1.什么是JWT?

Session 我们已经很熟悉了,那什么是 JWT 呢?KHk28资讯网——每日最新资讯28at.com

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络上安全传输信息的简洁、自包含的方式。它通常被用于身份验证和授权机制。KHk28资讯网——每日最新资讯28at.com

JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。KHk28资讯网——每日最新资讯28at.com

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

JWT 官网:https://jwt.io/KHk28资讯网——每日最新资讯28at.com

2.JWT优点分析

JWT 相较于传统的基于会话(Session)的认证机制,具有以下优势:KHk28资讯网——每日最新资讯28at.com

  • 无需服务器存储状态:传统的基于会话的认证机制需要服务器在会话中存储用户的状态信息,包括用户的登录状态、权限等。而使用 JWT,服务器无需存储任何会话状态信息,所有的认证和授权信息都包含在 JWT 中,使得系统可以更容易地进行水平扩展。
  • 跨域支持:由于 JWT 包含了完整的认证和授权信息,因此可以轻松地在多个域之间进行传递和使用,实现跨域授权。
  • 适应微服务架构:在微服务架构中,很多服务是独立部署并且可以横向扩展的,这就需要保证认证和授权的无状态性。使用 JWT 可以满足这种需求,每次请求携带 JWT 即可实现认证和授权。
  • 自包含:JWT 包含了认证和授权信息,以及其他自定义的声明,这些信息都被编码在 JWT 中,在服务端解码后使用。JWT 的自包含性减少了对服务端资源的依赖,并提供了统一的安全机制。
  • 扩展性:JWT 可以被扩展和定制,可以按照需求添加自定义的声明和数据,灵活性更高。

总结来说,使用 JWT 相较于传统的基于会话的认证机制,可以减少服务器存储开销和管理复杂性,实现跨域支持和水平扩展,并且更适应无状态和微服务架构。KHk28资讯网——每日最新资讯28at.com

3.JWT基本使用

在 Java 开发中,可以借助 JWT 工具类来方便的操作 JWT,例如 HuTool 框架中的 JWTUtil。KHk28资讯网——每日最新资讯28at.com

HuTool 介绍:https://doc.hutool.cn/pages/JWTUtil/KHk28资讯网——每日最新资讯28at.com

使用 HuTool 操作 JWT 的步骤如下:KHk28资讯网——每日最新资讯28at.com

  • 添加 HuTool 框架依赖
  • 生成 Token
  • 验证和解析 Token

(1)添加 HuTool 框架依赖

在 pom.xml 中添加以下信息:KHk28资讯网——每日最新资讯28at.com

<dependency>    <groupId>cn.hutool</groupId>    <artifactId>hutool-all</artifactId>    <version>5.8.16</version></dependency>

(2)生成 Token

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天}};JWTUtil.createToken(map, "服务器端秘钥".getBytes());

(3)验证和解析 Token

验证 Token 的示例代码如下:KHk28资讯网——每日最新资讯28at.com

String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2MjQwMDQ4MjIsInVzZXJJZCI6MSwiYXV0aG9yaXRpZXMiOlsiUk9MRV_op5LoibLkuozlj7ciLCJzeXNfbWVudV8xIiwiUk9MRV_op5LoibLkuIDlj7ciLCJzeXNfbWVudV8yIl0sImp0aSI6ImQ0YzVlYjgwLTA5ZTctNGU0ZC1hZTg3LTVkNGI5M2FhNmFiNiIsImNsaWVudF9pZCI6ImhhbmR5LXNob3AifQ.aixF1eKlAKS_k3ynFnStE7-IRGiD5YaqznvK2xEjBew";JWTUtil.verify(token, "123456".getBytes());

解析 Token 的示例代码如下:KHk28资讯网——每日最新资讯28at.com

String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiYWRtaW4iOnRydWUsIm5hbWUiOiJsb29seSJ9.U2aQkC2THYV9L0fTN-yBBI7gmo5xhmvMhATtu8v0zEA";final JWT jwt = JWTUtil.parseToken(rightToken);jwt.getHeader(JWTHeader.TYPE);jwt.getPayload("sub");

(4)代码实战

在登录成功之后,生成 Token 的示例代码如下:KHk28资讯网——每日最新资讯28at.com

// 登录成功,使用 JWT 生成 TokenMap<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 的实现代码如下:KHk28资讯网——每日最新资讯28at.com

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;/** * 登录过滤器(登录判断) */@Componentpublic 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;    }}

4.JWT实现原理

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

5.Session VS JWT

Session 和 JWT 的区别主要有以下几点:KHk28资讯网——每日最新资讯28at.com

  • 工作原理不同:Session 机制依赖于服务器端的存储。当用户首次登录时,服务器会创建一个会话,并生成一个唯一的会话 ID,然后将这个 ID 返回给客户端(通常是通过Cookie)。客户端在后续的请求中会携带这个会话 ID,服务器根据会话ID来识别用户并获取其会话信息;而 JWT 是一种无状态的认证机制,它通过在客户端存储令牌(Token)来实现认证。当用户登录时,服务器会生成一个包含用户信息和有效期的 JWT,并将其返回给客户端。客户端在后续的请求中会携带这个 JWT,服务器通过验证 JWT 的有效性来识别用户。
  • 存储方式不同:Session 信息存储在服务器端,通常是保存在内存或数据库中。这种方式需要服务器维护会话状态,因此在分布式系统或微服务架构中,会话信息的共享和同步可能会成为问题;而 JWT信息存储在客户端,通常是保存在浏览器的本地存储或 HTTP 请求的头部中。这种方式无需服务器维护会话状态,使得 JWT 在分布式系统或微服务架构中更加灵活和易于扩展。
  • 有效期和灵活性不同:Session 的有效期通常由服务器控制,并且在会话期间用户状态可以在服务器端动态改变。但这也意味着服务器需要管理会话的生命周期;而 JWT 的有效期可以在令牌生成时设置,并且可以在客户端进行缓存和重复使用。这使得 JWT 在需要频繁访问资源且不需要频繁更改用户状态的场景中更加适用。此外,JWT 还支持在令牌中包含自定义的用户信息,提供了更大的灵活性。

课后思考

既然 JWT 的有效期是在令牌生成时设置的,那如何实现 JWT 的自动续期呢?又如何将已经泄漏的 JWT 令牌作废呢?KHk28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-81235-0.html面试官:Session和JWT有什么区别?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 详解基于Spring Boot的WebSocket持久化方案

下一篇: 接口自动化框架里常用的小工具

标签:
  • 热门焦点
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • JavaScript 混淆及反混淆代码工具

    JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 三言两语说透设计模式的艺术-单例模式

    三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 为什么你不应该使用Div作为可点击元素

    为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 认真聊聊东方甄选:如何告别低垂的果实

    认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
Top