首页 > 其他分享 >JWT(JSON WEB TOKEN)是玩具吗

JWT(JSON WEB TOKEN)是玩具吗

时间:2024-03-20 23:01:08浏览次数:34  
标签:WEB 验证 过期 JWT Token JSON 签名 服务器

JWT当然不是玩具,理解其设计意图,和适用场景自然会发现存在的就是有价值的

JWT: JSON Web Token

起源和定义

JWT(JSON Web Token)是由 IETF(Internet Engineering Task Force)基于 RFC 7519 规范定义的。它是一种用于在网络应用间传递信息的标准方法。JWT 最初由无状态的分布式应用场景需求而定义,以提供一种简洁的方式来传递信息,同时保证安全性。

JWT的结构

JWT 由三部分组成,它们使用点号(.)分隔开来:

  1. Header(头部):包含了令牌的元数据信息,例如算法和类型。
    { "alg": "HS256", "typ": "JWT" }

  2. Payload(负载):包含了要传递的用户数据,例如用户ID、角色等。
    { "sub": "1234567890", "username": "exampleUser", "role": "admin" }

  3. Signature(签名):对头部和负载进行签名,以确保消息的完整性。
    HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

    其中,认证秘钥(secret)用于对签名进行验证和生成,确保令牌的真实性和完整性。密钥本身的安全非常重要,如果密钥泄漏那么签名本身等于裸奔

验证机制

JWT 的验证主要依赖于签名和有效期:

  1. 签名验证:接收方通过验证 JWT 中的签名来确保消息的完整性,防止篡改。
    这一过程包括:
    分离出Header和Payload并分别进行Base64Url解码。
    使用Header中定义的算法和服务器的私有密钥对(Header + Payload)进行签名运算。
    比较计算得出的签名与接收到的Token中的Signature部分是否一致。

  2. 有效期验证:接收方验证 JWT 的过期时间(exp),确保 JWT 在有效期内使用。
    对Payload部分进行检查,包括但不限于:
    过期时间(Expiration Time, exp):确认Token未过期。
    生效时间(Not Before, nbf):确认Token已生效。
    发行者(Issuer, iss) 和 受众(Audience, aud):确认Token是由预期的发行者为预期的受众发布的。

处理流程

  • 客户端请求:客户端在后续请求中携带JWT,通常放在Authorization HTTP头的Bearer模式下。
  • 服务器响应:服务器提取JWT,按照上述步骤验证其签名和载荷的有效性。
  • 授权决策:如果JWT验证通过,则服务器信任客户端提供的用户身份和权限信息,允许访问受保护的资源。

使用JWT认证流程图

image

安全考虑

  • 服务器端保存的蜜钥不可泄漏,最好定期刷新
  • 为了保持安全性,应设置合理的Token有效期,并提供Token刷新机制
  • 考虑提供Token撤销机制:创建一个可分布式存储的黑名单(例如,Redis缓存、数据库表或其他高效存储解决方案),用于存储撤销的token的相关信息。这可能是整个JWT令牌,或者是JWT中的唯一标识符(如JTI,JWT ID),当想要撤销某个已经下发的 token就将它加入到名单。需要注意的是,验证的时候肯定是先去验证有效期,如果已经过期,不需要关注是否在黑名单。而且黑名单本身也会自动过期并删除即可,毕竟一支存放它浪费空间毫无意义

优点和缺点

优点:

  • 无状态性:JWT 不需要服务器存储会话信息,减轻了服务器负担。传统方式下,我们需要将会话信息持久化到DB、缓存等服务中,每次都避免不了要获取才能验证。
  • 跨域支持:JWT 可在不同域之间轻松传递信息。
  • 安全性:JWT 使用签名验证消息完整性,防止数据篡改。

缺点:

  • Token 大小:JWT 包含了额外信息,增加了网络传输负担。
  • 无法撤销:JWT 一旦发放,无法撤销,除非设置短期过期时间。
  • 不是那么安全:不能传递敏感信息,本身虽然签名但是荷载部分知识base64,当然可以选择使用一种对成签名算法来对荷载部分加密

相关资料

标签:WEB,验证,过期,JWT,Token,JSON,签名,服务器
From: https://www.cnblogs.com/Nuwa/p/18086333

相关文章

  • JWTBearer
    JWTBearer框架是.NET中一种基于JSONWebToken(JWT)实现的身份验证和授权框架。JWT是一种开放标准,用于在不同系统之间安全地传输信息。它使用JSON对象来表示声明,声明包含关于实体(通常是用户)的信息以及与该实体相关的元数据。这些声明可以被签名和/或加密,以确保只有授权用户可......
  • 在非标准Spring组件中(比如websocket)注入Spring管理bean的方法
    privatestaticUserMapperuserMapper;@AutowiredpublicvoidsetUserMapper(UserMapperuserMapper){WebSocketServer.userMapper=userMapper;}WebSocketServer是通过JavaWebSocketAPI创建的,并且由于@ServerEndpoint不是Spring的标准组件注解,直......
  • SSM整合Jwt
    #导入jwt依赖创键Util123#4.测试......
  • web服务器性能评估和监视
         ......
  • Websoket 客户端忽略证书验证
    一、方法一<dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-WebSocket</artifactId> <version>1.5.2</version></dependency>packagecom.neo.websoket;importorg.java_websocket.client.WebSocket......
  • WebRTC基础使用
    一、什么是WebRTCWebRTC(WebReal-TimeCommunication)是一个由Google、Mozilla、Opera等公司发起的开源项目,它支持网页浏览器进行实时音视频对话。它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和音频流或者其他任意数据的传......
  • JWT令牌-登录认证
    1.JWT令牌组成Header(头),记录令牌类型和签名算法等PayLoad(载荷),携带自定义的信息Signature(签名),对头部和载荷进行加密计算得来用于登录认证承载业务数据,减少后续请求查询数据库的次数防篡改,保证信息的合法性和有效性2.使用引入java-jwt坐标调用API生成或验证......
  • Web框架开发-Django-模板继承和静态文件配置
    一、模板继承目的:减少代码的冗余语法:123{%blockclassinfo%}{%endblock%}具体步骤:1、创建一个base.html文件2、把要显示的页面的内容写在这里面,也就是HTML要在浏览器显示的内容3、在rigth里面写一个盒子{%blockclassinfo%}{%endblock%}......
  • Web框架开发-Django-数据库表的单表查询
    一、添加表记录对于单表有两种方式方式一:12book_obj=models.Book(title="python全栈开发",price=100,publishData="2015-08-08",author='张三',publish='机械工业出版社')    book_obj.save()方式二:12#方式二:    models.Book.objec......
  • web项目部署,一篇就搞定!
    web部署的方式有很多,根据开发方式不同,部署方式也不同。最通用是docker部署,这个想必大家都熟悉。我们今天说另外一种。部署过程1、验证Jdk是否安装成功2、验证Tomcat是否安装成功3、验证Navicat是否能连上数据库4、创建数据库并导入数据库脚本(注意:它这里数据库名必须为:tomexam)......