初识JWT

简介: 初识JWT

认识JWT令牌

我们需要先学习最常见的JWT令牌,官网:jwt.io

JWT(JSON Web Token)令牌是一种基于JSON的开放标准(RFC 7519),用于在网络应用中传输信息的令牌。

JWT令牌由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

  • 头部通常包含令牌的类型和使用的算法(例如,HMAC SHA256或RSA)。
  • 载荷包含要传输的信息,如用户ID、角色或其他自定义的数据。
  • 签名是用于验证令牌的一部分,确保令牌在传输过程中没有被篡改。

JWT的优点包括

  1. 服务端无需存储会话信息:传统的session方式需要服务端存储用户的会话信息,包括用户的身份认证信息和会话状态。但是使用Token,服务端无需存储任何会话信息,所有的认证信息都包含在Token中,使得服务端变得无状态,大大减轻了服务器的负担,同时也方便了服务的水平扩展
  2. 减少网络延迟:传统的session方式需要在每次请求中都携带会话标识,即使是无状态的RESTful API也需要携带身份认证信息。而使用Token,身份认证信息已经包含在Token中,只需要在请求的Authorization头部携带Token即可,减少了每次请求的数据量,减少了网络延迟。
  3. 客户端无需存储会话信息:传统的session方式,客户端需要存储会话标识,以便在每次请求中携带。而使用Token,客户端只需要保存Token即可,方便了客户端的存储和管理
  4. 跨域支持Token可以在各个不同的域名之间进行传递和使用,因为Token是通过签名来验证和保护数据完整性的,可以防止未经授权的修改。

注意事项

在使用JWT时,JWT的3部分分别进行Base64编码后用.进行连接形成最终需要传输的字符串。首先将负载部分的信息进行加密生成令牌,然后将该令牌作为Authorization请求头部的值发送给资源服务器。资源服务器可以通过验证令牌的签名来确保令牌的真实性和完整性。如果验证成功,资源服务器就可以使用负载中的信息进行后续操作。

需要注意的是,由于JWT是基于签名验证的,所以令牌中的信息是可以被解密的。因此,敏感信息(如密码)不应该被存储在JWT的负载部分中。

所以JWT令牌通常用于认证和授权,以验证用户的身份并授予对特定资源的访问权限。在前后端分离的应用程序中,JWT令牌被广泛用于身份验证和API访问控制。

快速使用JWT

JWT令牌实际上是一种经过加密的JSON数据,其中包含了用户名字、用户ID等信息,我们可以直接解密JWT令牌得到用户的信息,我们来试试,导入JWT支持库依赖:

 <dependency>
      <groupId>com.auth0</groupId>
      <artifactId>java-jwt</artifactId>
      <version>4.3.0</version>
 </dependency>

要生成一个JWT令牌非常简单:

public static void main(String[] args) {
    String jwtKey = "abcdefghijklmn";                 //使用一个JWT秘钥进行加密
    Algorithm algorithm = Algorithm.HMAC256(jwtKey);  //创建HMAC256加密算法对象
    String jwtToken = JWT.create()
            .withClaim("id", 1)   //向令牌中塞入自定义的数据
            .withClaim("name", "jinze")
            .withClaim("role", "admin")
            .withExpiresAt(new Date(2024, Calendar.FEBRUARY, 1))  //JWT令牌的失效时间
            .withIssuedAt(new Date())   //JWT令牌的签发时间
            .sign(algorithm);    //使用上面的加密算法进行加密,完成签名
    System.out.println(jwtToken);   //得到最终的JWT令牌
}

可以看到最后得到的JWT令牌就长这样:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYWRtaW4iLCJuYW1lIjoiamluemUiLCJpZCI6MSwiZXhwIjo2MTY2NDg2MDgwMCwiaWF0IjoxNjk0MTY0NTcwfQ.yvmirPLFHbX48bICW3vbr0zpNxFFXZpfbzSLtfVprc4

我们可以使用Base64将其还原为原本的样子:

 public static void main(String[] args) {
         String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYWRtaW4iLCJuYW1lIjoiamluemUiLCJpZCI6MSwiZXhwIjo2MTY2NDg2MDgwMCwiaWF0IjoxNjk0MTY0NTcwfQ.yvmirPLFHbX48bICW3vbr0zpNxFFXZpfbzSLtfVprc4
";
         String[] split = jwtToken.split("\\.");
         for (int i = 0; i < split.length - 1; i++) {
             String s = split[i];
             byte[] decode = Base64.getDecoder().decode(s);
             System.out.println(new String(decode));
         }
 }

解析前面两个部分得到:

LRQ8)QB}QK]CX$)F20UQMIF.png

可以看到确实是经过Base64加密的JSON格式数据,包括我们的自定义数据也在其中,而我们可以直接使用JWT令牌来作为我们权限校验的核心,我们可以像这样设计我们的系统:

首先用户还是按照正常流程进行登录,只不过用户在登录成功之后,服务端会返回一个JWT令牌用于后续请求使用,由于JWT令牌具有时效性,所以说当过期之后又需要重新登录。就像买票,买完过时就无效了。

所以,我们只需要在后续请求中携带这个Token即可(可以放在Cookie中,也可以放在请求头中)这样服务器就可以直接从Token中解密读取到我们用户的相关信息以及判断用户是否登录过期了。

目录
相关文章
|
JavaScript 小程序 前端开发
【手把手教教学物联网项目】01 视频大纲
《手把手教教学物联网项目》是一系列视频教程,旨在引导初学者掌握物联网技术。视频涵盖物联网基础,如物联网概述、架构和技术;STM32微控制器的介绍、编程及外设使用;网关开发,涉及ESP8266和ESP32;物联网通信协议如TCP、MQTT、Modbus等;物联网总线协议如单总线、CAN、IIC和SPI;OLED显示原理与驱动;MQTT服务器搭建;物联网云平台介绍,包括阿里云平台的使用;微信小程序开发入门及前端VUE项目实践。此外,教程还涉及UniAPP和SpringBoot后台开发,最后通过“智能取餐柜”项目将理论知识付诸实践。视频可在B站找到,适合学生、爱好者和开发人员学习物联网技术。
1391 12
【手把手教教学物联网项目】01 视频大纲
|
5月前
|
人工智能 监控 Linux
AI开发革命:阿里云/本地部署OpenClaw+Codex/Claude Code 搭建AI Agent集群指南+免费多模型API配置+避坑教程
OpenClaw+AI Agent集群的模式,彻底打破了独立开发者的效率天花板,让"一人创办百万美元公司"从愿景变为现实。其核心并非依赖更强的AI模型,而是通过精妙的架构设计,让业务上下文与代码实现各司其职,同时借助自动化闭环与自我进化机制,持续降低人工干预成本。
3164 1
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2026年9月30日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
11月前
|
存储 JavaScript 安全
在 Pinia 中如何使用加密插件?
在 Pinia 中如何使用加密插件?
731 158
|
11月前
|
消息中间件 存储 Java
RabbitMQ 和 Spring Cloud Stream 实现异步通信
本文介绍了在微服务架构中,如何利用 RabbitMQ 作为消息代理,并结合 Spring Cloud Stream 实现高效的异步通信。内容涵盖异步通信的优势、RabbitMQ 的核心概念与特性、Spring Cloud Stream 的功能及其与 RabbitMQ 的集成方式。通过这种组合,开发者可以构建出具备高可用性、可扩展性和弹性的分布式系统,满足现代应用对快速响应和可靠消息传递的需求。
571 2
RabbitMQ 和 Spring Cloud Stream 实现异步通信
|
11月前
|
运维 安全 测试技术
Hydra-SSH 漏洞安全防范
Hydra 是由 THC 组织开发的强力网络安全测试工具,主要用于对 SSH、FTP、HTTP 等协议进行认证爆破,适用于授权渗透测试与弱口令检测。其高效性依赖于优化的字典策略,强调质量优先,结合目标信息定制密码列表,提高破解成功率。
744 1
|
11月前
|
JSON 安全 生物认证
WhatWeb-网站安全扫描指纹识别
WhatWeb 是一款网站指纹识别工具,用于快速识别目标网站的 Web 服务器类型、CMS、脚本语言、中间件及可能存在的漏洞信息,常用于渗透测试与安全审计。
593 1
|
自然语言处理 数据安全/隐私保护 iOS开发
ChatGPT使用学习(三):ChatGPT桌面版使用
本文介绍了ChatGPT桌面版,一个由OpenAI推出的独立桌面应用程序,支持离线使用、数据隐私保护和快速响应。用户界面友好,支持多语言交互。桌面版无需网络连接,保护用户数据隐私,并提供快速响应。用户可通过Github链接下载安装,使用谷歌账号登录。此外,OpenAI官方也发布了适用于macOS的桌面端应用,并向所有用户免费开放。
1081 1
|
人工智能 自然语言处理 关系型数据库
DMS+AnalyticDB助力钉钉AI助理,轻松玩转智能问数
DMS+AnalyticDB助力钉钉AI助理,轻松玩转智能问数
740 3
|
JavaScript 开发者
从零基础到实战应用:Angular入门指南带你一步步构建你的第一个Web应用——全面介绍环境搭建、项目创建、组件开发与应用集成
【8月更文挑战第31天】本文档是针对初学者的Angular入门指南。通过详细步骤与示例代码,教你如何使用Angular CLI搭建开发环境、创建新项目、添加及配置组件,并运行首个应用。Angular是由Google开发的强大Web框架,专为高效构建复杂单页应用设计。按照本指南操作,你将能够快速上手Angular,开启Web应用开发之旅。
1441 0

热门文章

最新文章