JWT令牌

article/2025/10/16 14:37:40

1.普通令牌的问题

        客户端申请到令牌,接下来客户端携带令牌去访问资源,到资源服务器将会校验令牌的合法性。      

  

从第4步开始说明:

1、客户端携带令牌访问资源服务获取资源。

2、资源服务远程请求认证服务校验令牌的合法性

3、如果令牌合法资源服务向客户端返回资源。

这里存在一个问题:

就是校验令牌需要远程请求认证服务,客户端的每次访问都会远程校验,执行性能低。

如果能够让资源服务自己校验令牌的合法性将省去远程请求认证服务的成本,提高了性能。如下图:

         令牌采用JWT格式即可解决上边的问题,用户认证通过后会得到一个JWT令牌,JWT令牌中已经包括了用户相关的信息,客户端只需要携带JWT访问资源服务,资源服务根据事先约定的算法自行完成令牌校验,无需每次都请求认证服务完成授权。

2.什么是JWT令牌

JSON Web Token(JWT)是一种使用JSON格式传递数据的网络令牌技术,它是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任,它可以使用HMAC算法或使用RSA的公钥/私钥对来签名,防止内容篡改。官网:JSON Web Tokens - jwt.io

使用JWT可以实现无状态认证,什么是无状态认证?

传统的基于session的方式是有状态认证,用户登录成功将用户的身份信息存储在服务端,这样加大了服务端的存储压力,并且这种方式不适合在分布式系统中应用。

如下图,当用户访问应用服务,每个应用服务都会去服务器查看session信息,如果没有则认证用户没有登录,此时就会重新认证,而解决这个问题的方法是Session复制、Session黏贴。

无状态认证

 如果是基于令牌技术在分布式系统中实现认证则服务端不用存储session,可以将用户身份信息存储在令牌中,用户认证通过后认证服务颁发令牌给用户,用户将令牌存储在客户端,去访问应用服务时携带令牌去访问,服务端从jwt解析出用户信息。这个过程就是无状态认证

 JWT令牌的优点:

  1. 基于json,非常方便解析
  2. 可以在jwt令牌中自定义丰富的内容,易扩展
  3. 通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高
  4. 资源服务使用JWT可不依赖认证服务就完成授权

缺点

JWT令牌较长,占用的存储空间较大

3.jwt结构分析

JWT令牌由三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz

  1. Header       

  头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)

  一个例子如下:

  下边是Header部分的内容

JSON
   {
    "alg": "HS256",
    "typ": "JWT"
  }

  将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分。

  1.  Payload

  第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。

  此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。

  最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。

  一个例子:

JSON
  {
    "sub": "1234567890",
    "name": "456",
    "admin": true
  }

  1.  Signature

  第三部分是签名,此部分用于防止jwt内容被篡改。

  这个部分使用base64url将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用header中声明签名算法进行签名。

  一个例子:

JSON
  HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secret)

base64UrlEncode(header):jwt令牌的第一部分。

base64UrlEncode(payload):jwt令牌的第二部分。

secret:签名所使用的密钥。

4.为什么JWT可以防止篡改?

第三部分使用签名算法对第一部分和第二部分的内容进行签名,常用的签名算法是 HS256,常见的还有md5,sha 等,签名算法需要使用密钥进行签名,密钥不对外公开,并且签名是不可逆的,如果第三方更改了内容那么服务器验证签名就会失败,要想保证验证签名正确必须保证内容、密钥与签名前一致。

从上图可以看出认证服务和资源服务使用相同的密钥,这叫对称加密,对称加密效率高,如果一旦密钥泄露可以伪造jwt令牌。

JWT还可以使用非对称加密,认证服务自己保留私钥,将公钥下发给受信任的客户端、资源服务,公钥和私钥是配对的,成对的公钥和私钥才可以正常加密和解密,非对称加密效率低但相比对称加密非对称加密更安全一些。

4.测试生成jwt令牌

package com.xuecheng.auth.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;import java.util.Arrays;/*** @author Administrator* @version 1.0**/
@Configuration
public class TokenConfig {private String SIGNING_KEY = "mq123";@AutowiredTokenStore tokenStore;@Autowiredprivate JwtAccessTokenConverter accessTokenConverter;@Beanpublic TokenStore tokenStore() {return new JwtTokenStore(accessTokenConverter());}@Beanpublic JwtAccessTokenConverter accessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();converter.setSigningKey(SIGNING_KEY);return converter;}//令牌管理服务@Bean(name="authorizationServerTokenServicesCustom")public AuthorizationServerTokenServices tokenService() {DefaultTokenServices service=new DefaultTokenServices();service.setSupportRefreshToken(true);//支持刷新令牌service.setTokenStore(tokenStore);//令牌存储策略TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();tokenEnhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter));service.setTokenEnhancer(tokenEnhancerChain);service.setAccessTokenValiditySeconds(7200); // 令牌默认有效期2小时service.setRefreshTokenValiditySeconds(259200); // 刷新令牌默认有效期3天return service;}}

postMan请求

{"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsieHVlY2hlbmctcGx1cyJdLCJ1c2VyX25hbWUiOiJ6aGFuZ3NhbiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2NzczNzc3MDQsImF1dGhvcml0aWVzIjpbInAxIl0sImp0aSI6ImRkZGZlOTFkLWJiZTItNGEwOC1iZTI0LTQ4ZmM0NTdmMDIxNyIsImNsaWVudF9pZCI6IlhjV2ViQXBwIn0.8Yn2fGo2qckpgGSD-oOCHgQIIhxb9DfEBdLwB4VKDdE","token_type": "bearer","refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsieHVlY2hlbmctcGx1cyJdLCJ1c2VyX25hbWUiOiJ6aGFuZ3NhbiIsInNjb3BlIjpbImFsbCJdLCJhdGkiOiJkZGRmZTkxZC1iYmUyLTRhMDgtYmUyNC00OGZjNDU3ZjAyMTciLCJleHAiOjE2Nzc2Mjk3MDQsImF1dGhvcml0aWVzIjpbInAxIl0sImp0aSI6ImI3NzczZjZjLTk5NmUtNGM0Yy04ZWVmLTJjMzZkMjRmZDEyNyIsImNsaWVudF9pZCI6IlhjV2ViQXBwIn0.hI9f5tHEvAE8SE5nLZkYZV_5n2K9DthSrblMoF4CUiE","expires_in": 7198,"scope": "all","jti": "dddfe91d-bbe2-4a08-be24-48fc457f0217"
}

1、access_token,生成的jwt令牌,用于访问资源使用。

2、token_type,bearer是在RFC6750中定义的一种token类型,在携带jwt访问资源时需要在head中加入bearer jwt令牌内容

3、refresh_token,当jwt令牌快过期时使用刷新令牌可以再次生成jwt令牌。

4、expires_in:过期时间(秒)

5、scope,令牌的权限范围,服务端可以根据令牌的权限范围去对令牌授权。

6、jti:令牌的唯一标识。

check_token接口校验jwt令牌

localhost:63070/auth/oauth/check_token?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsieHVlY2hlbmctcGx1cyJdLCJ1c2VyX25hbWUiOiJ6aGFuZ3NhbiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2NzczNzc3MDQsImF1dGhvcml0aWVzIjpbInAxIl0sImp0aSI6ImRkZGZlOTFkLWJiZTItNGEwOC1iZTI0LTQ4ZmM0NTdmMDIxNyIsImNsaWVudF9pZCI6IlhjV2ViQXBwIn0.8Yn2fGo2qckpgGSD-oOCHgQIIhxb9DfEBdLwB4VKDdE

5.扩展JWT令牌的信息

在验证完毕用户的身份之后,可以将用户的信息转为json格式,作为username字段封装到jwt令牌中。这样做的原因是,避免了再写一个dto类。具体做法见下:

 @Overridepublic UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {//查询到相应的数据库数据XcUser xcUser = userMapper.selectOne(new LambdaQueryWrapper<XcUser>().eq(XcUser::getUsername, s));//根据框架的调用情况,因为这个方法是被DaoAuthentication调用,所以要查看这个类是怎么调用的//查询之后发现,调用类在处理返回值时,如果是空,调用类会自己去抛异常if(xcUser == null){//我们这里直接返回空值,另外注意是有必要判断的,// 否则后面会报空指针异常return null;}String username = xcUser.getUsername();String password = xcUser.getPassword();//创建用户权限集合,如果不加,则会报can not pass a null GrantedAuthority collectionString[] authorities = {"test"};//随便创建的一个权限集合
//        不能再json中保存密码,所以注释掉密码字段xcUser.setPassword(null);//此处转换成JSON对象的目的是,下面用user.withUserName的方法加入的信息太少
//        而此时已经校验过了用户的身份,所以将xcuser转换为json格式,保留全部的信息String userJson = JSON.toJSONString(xcUser);//因为要返回UserDetails类的对象,而这个类的对象创建起来十分麻烦,所以调用工具类创建UserDetails build = User.withUsername(userJson).password(password).authorities(authorities).build();return build;}

反向解析json:

6.网关统一鉴权做什么?

 


http://chatgpt.dhexx.cn/article/WZN061nV.shtml

相关文章

Openresty(十五)通过lua实现令牌校验

一 模块地址 &#xff08;1&#xff09;插件安装 "安装方式"1.opm安装 -->默认安装的位置opm get SkyLothar/lua-resty-jwt2.源码安装,进行copy -->不建议 参考博客 网关权限控制 &#xff08;2&#xff09;常用方法介绍 ① sign 功能&#xff1a…

JWT(JSON WEB TOKEN)

JSON WEB TOKEN简称JWT&#xff0c;是用于对应程序上的用户进行身份验证的标记。也就是说&#xff0c;使用JWTS的应用程序不再需要保存有关其用户的cookie和session数据。此特性便于可伸缩性&#xff0c;同时保证应用程序的安全。 格式 JWT就是一个字符串&#xff0c;经过加密…

JWT令牌技术

JWT令牌 全称&#xff1a;JOSN Web Token(https://jwt.io/) 定义了一种简介的、自包含的格式&#xff0c;用于在通信双方以JSON数据格式安全的传输信息。犹豫数字签名的存在&#xff0c;这些信息是可靠的。 通过base64编码 JWT的组成&#xff1a; &#xff08;JWT令牌由三个…

2 Go语言JSON与XML解析与表单操作

2 Go语言JSON与XML解析与表单操作 1 数据交互的格式2 JSON方式2.1 JSON序列化2.2 JSON反序列化2.3 解析到interface 3 XML方式3.1 解析XML3.2 生成XML 4 字段校验5 文件上传2.1 前后端模拟上传2.2 go客户端模拟上传 3 防止重复提交 1 数据交互的格式 常见的数据交互格式有&…

C++中json解析开源库收集,支持json5

文章目录 zpl-c 库HJSONcJSONRapidJSON &#xff08;推荐&#xff09;DAW JSON Link v2JSON &#xff0c;这库稳定&#xff0c;文档齐全。(推荐)json-c &#xff08;c实现&#xff09;json_dto (一个小的头文件助手)json11 ( C11 的小型 JSON 库 )json_spirit (开发中&#xff…

SpringBoot之JWT令牌

目录 介绍 生成和校验 登录下发令牌 介绍 JWT全称&#xff1a;JSON Web Token &#xff08;官网&#xff1a;https://jwt.io/&#xff09; 定义了一种简洁的、自包含的格式&#xff0c;用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在&#xff0c;这些信…

七 微服务网关gateWay和Jwt令牌

之前写过一篇微服务网关Zuul&#xff0c;今天介绍gateWay&#xff0c;二者大同小异&#xff0c;但各有优势&#xff0c;大家可以都了解一下&#xff0c;拓展自己的知识面&#xff1b; 一 微服务网关 主要作用 整合各个微服务功能&#xff0c;形成一套系统在微服务网关中实现…

登录校验-会话技术/JWT令牌

登录校验 会话技术 会话&#xff1a; 用户打开浏览器&#xff0c;访问web资源的时候&#xff0c;会话建立。直到一方断开连接&#xff0c;会话结束&#xff0c;一次会话中包含多次响应 会话跟踪&#xff1a;一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请求是否来…

服务的校验Content-Type,只接收application/json格式的CSRF绕过方法

如何在JSON端点上利用CSRF漏洞 转载自&#xff1a;https://www.freebuf.com/articles/web/164234.html Alpha_h4ck &#xff08;CSRF Flash HTTP 307&#xff09;别说了&#xff0c;你已经“死”了&#xff01; 如果你想通过第三方攻击者控制的服务器在JSON端点利用一个CS…

nginx 限流,以及nginx直接返回json格式数据

高并发系统有三把利器用来保护系统&#xff1a;缓存、降级和限流 今天我们这里说说限流。一般会在应用层配合redis做限流策略&#xff0c;这里我们聊聊nginx层限流。 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统&#xff0c;一旦达…

JWT-JSON Web令牌的深入介绍

JWT-JSON Web令牌的深入介绍 从桌面应用程序到Web应用程序或移动应用程序&#xff0c;身份验证是几乎所有应用程序中最重要的部分之一。 本教程是JWT&#xff08;JSON Web令牌&#xff09;的深入介绍&#xff0c;可帮助您了解&#xff1a; 基于会话的身份验证与基于令牌的身份…

JSON Web Token原理深入理解

什么是JWT JWT全称Json Web Token&#xff0c;翻译为JSON格式的网络令牌&#xff0c;很多时候又简称为Token(JWT是Token的一种实现方式)。它要解决的问题&#xff0c;就是为多种终端设备&#xff0c;提供统一的、安全的令牌格式。因此&#xff0c;JWT只是一个令牌格式而已&…

【JWT】jwt令牌研究

一、JWT介绍 在介绍JWT之前先看一下传统校验令牌的方法&#xff0c;如下图&#xff1a; 问题&#xff1a; 传统授权方法的问题是用户每次请求资源服务&#xff0c;资源服务都需要携带令牌访问认证服务去校验令牌的合法性&#xff0c;并根据令牌获取用户的相关信息&#xff0c…

JWT令牌验证

JWT令牌验证 jwt的由来及解决的问题JWT的工作原理JWT组成重点&#xff1a;JWT实现验证&#xff1a;4.1 首先前后端跨域配置&#xff1a;4.2 jwt配置&#xff1a;4.3 web.xml配置&#xff1a;4.4 登录成功时生成jwt令牌前端NodeJs服务器配置拦截器&#xff0c;配置在http目录下4…

如何使用JSON Web令牌(JWT)保护您的文档

如何使用JSON Web令牌&#xff08;JWT&#xff09;保护您的文档 在本文中&#xff0c;我们讲解如何使用JSON网络令牌JWT来保护在线文档免受未经授权的访问&#xff0c;从而可以更安全的把在线文档编辑器开发集成进您自己的网络应用中去。 这里将集成开源的办公套件ONLYOFFICE …

day13 SpringBoot案例3 令牌技术、登录校验

登录校验的实现思路是怎样的&#xff1f; 项目中访问核心资源&#xff0c;通常都要进行登录校验&#xff0c;访问京东商城的订单&#xff0c;必须要先登录才能访问查询 实现思路: 可以在访问资源前进行访问的拦截&#xff0c;判断你当前会话是否有登录&#xff0c;如果没有登…

pythonjson数据解析失败_json解析失败是什么意思

因为代码的不美观等因素&#xff0c;我们会使用一些解析工具进行处理&#xff0c;有些人在解析时出现了报错。解析失败需要考虑多方面的因素&#xff0c;如格式、String类型、boolean类型等原因&#xff0c;在格式上分为格式错误和格式正确两种讨论。下面就json解析失败的原因为…

Java Web Token令牌校验

前言&#xff1a;本文只涉及JWT的理论部分&#xff0c;不涉及代码 传统的用户校验可以结合cookiesession来实现&#xff0c;但是校验信息存放在服务端&#xff0c;当用户过多时会给服务器造成太大的压力&#xff0c;所以我们可以使用token进行校验&#xff0c;将用户信息加以签…

JWT令牌生成与校验

目录 1 JWT介绍1.1 什么是JWT&#xff1f;1.2 JWT令牌结构 2 配置JWT令牌服务3 生成JWT令牌4 校验JWT令牌5 JWT整合Spring Security5.1 创建表 6 配置授权服务6.1 测试 1 JWT介绍 通过上边的测试我们发现&#xff0c;当资源服务和授权服务不在一起时资源服务使用RemoteTokenSe…

信息系统基础知识(笔记)

一、信息 1.1、信息的基本概念 信息就是信息&#xff0c;既不是物质们也不是论量&#xff0c;信息是能够用来消除不确定的东西 两个概念层次&#xff1a;本体论&#xff08;客观层&#xff0c;与课客体本身因素相关&#xff0c;与主题因素无关&#xff09; 认知论&#xff0…