iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >token与JWT详细介绍
  • 280
分享到

token与JWT详细介绍

java 2023-08-31 05:08:29 280人浏览 八月长安
摘要

token介绍 Token 的中文意思是"令牌"。主要用来身份验证。比传统的身份验证方法,Token 有扩展性强,安全性高的特点,非常适合用在 WEB 应用或者移动应用上。 它是服务端生成的字符串,作为客户端进行请求的一个标识。 token

token介绍

Token 的中文意思是"令牌"。主要用来身份验证。比传统的身份验证方法,Token 有扩展性强,安全性高的特点,非常适合用在 WEB 应用或者移动应用上。

它是服务端生成的字符串,作为客户端进行请求的一个标识。

token出现的背景

        以前,Web 基本上就是文档的浏览而已,每次请求都是一个新的Http协议, 就是请求加响应,尤其是我不用记住是谁刚刚发了HTTP请求。

        随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等,面临一个问题,必须记住哪些人登录系统,也就是说我必须把每个人区分开,这就是一个不小的挑战,因为HTTP请求是无状态的,起初想出的办法就是给每一个人发一个唯一的sessionid(一个随机的字符串),下次大家再向我发起HTTP请求的时候,把这个sessionid带着, 这样我就能区分开谁是谁了。

       每个人只需要保存自己的session id,而服务器要保存所有人的session id !这对服务器说是一个巨大的开销, 严重的限制了服务器扩展能力, 比如说我用两个机器组成了一个集群, 小F通过机器A登录了系统, 那session id会保存在机器A上, 假设小F的下一次请求被转发到机器B怎么办? 机器B可没有小F的 session id啊。

        那只好做session 的复制了, 把session id 在服务器之间搬来搬去, 快累死了。

        于是有人就在思考, 我为什么要保存这可恶的session id, 只让每个客户端去保存多好?

        可是如果不保存这些session id , 怎么验证客户端发给我的session id 的确是我生成的呢? 如果不去验证,我们都不知道他们是不是合法登录的用户, 那些不怀好意的家伙们就可以伪造session id , 为所欲为了。所以,关键点就是验证 !

        比如说, 小F已经登录了系统, 我给他发一个令牌(token), 里边包含了小F的 user id, 下一次小F 再次通过Http 请求访问我的时候, 把这个token 通过Http header 带过来

        不过这和session id没有本质区别啊, 任何人都可以可以伪造, 所以我得想点儿办法, 让别人伪造不了。

        那就对数据做一个签名吧, 比如说我用HMac-SHA256 算法,加上一个只有我才知道的密钥, 对数据做一个签名, 把这个签名和数据一起作为token , 由于密钥别人不知道, 就无法伪造token了。

        这个token服务器不保存,当小F把这个token 给我发过来的时候,我再用同样的HMAC-SHA256 算法和同样的密钥,对数据再计算一次签名, 和token 中的签名做个比较, 如果相同, 我就知道小F已经登录过了,并且可以直接取到小F的user id , 如果不相同, 数据部分肯定被人篡改过, 我就告诉发送者: 对不起,没有认证。

        解除了session id这个负担, 可以说是无事一身轻, 我的机器集群现在可以轻松地做水平扩展, 用户访问量增大, 直接加机器就行。 这种无状态的感觉实在是太好了。

token对比session

这种基于token的认证方式相比传统的session认证方式更节约服务器资源,并且对移动端和分布式更加友好。其优点如下:

  • 支持跨域访问:cookie是无法跨域的,而token由于没有用到cookie(前提是将token放到请求头中),所以跨域后不会存在信息丢失问题
  • 无状态:token机制在服务端不需要存储session信息,因为token自身包含了所有登录用户的信息,所以可以减轻服务端压力
  • 更适用CDN:可以通过内容分发网络请求服务端的所有资料
  • 更适用于移动端:当客户端是非浏览器平台时,cookie是不支持的,采用token认证方式会简单很多
  • 无需考虑CSRF:由于不再依赖cookie,所以采用token认证方式不会发生CSRF,所以也就无需考虑CSRF的防御

JWT介绍

Jwt是token的一种实现方式,它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。

优点

  • 简洁: 可以通过URL、POST参数或者在HTTP header发送,因为数据量小,传输速度也很快
  • 自包含:负载中可以包含用户所需要的信息,避免了多次查询数据库
  • Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持
  • 不需要在服务端保存会话信息,特别适用于分布式微服务

缺点

  • 无法作废已颁布的令牌
  • 不易应对数据过期

示例

组成

JWT是由.分割的三部分组成

jwt token = base64 URL(头部) + "." +base64 URL(负载) + "." + base64 URL(签名)

Base64 URL是一种编码,不是加密方式,是可以解码的

头部(Header)

{  "alg": "HS256",  "typ": "JWT"}
  • alg是签名用的算法,默认为HMAC SHA256(写为HS256),JWT默认也是推荐的算法

  • typ属性表示令牌的类型,JWT令牌统一写为JWT

负载(Payload)

JWT的主体内容部分,也是jsON,包含需要传递的数据

JWT指定七个默认字段供选择

iss:发行人exp:到期时间sub:主题aud:用户nbf:在此之前不可用iat:发布时间jti:JWT ID用于标识该JWT

除默认字段外,我们还可以自定义字段,一般会把包含用户信息的数据放到payload中,如下

{  "sub": "1234567890",  "userID": "123456",  "admin": true}

JWT里不要存放敏感信息,因为base64 URL编码是可以解码的

签名(Signature)

首先,需要指定一个密钥(secreTKEy),该密钥只存在服务器中,不能向用户公开公开,使用header中指定的签名算法默认情况下为HMAC SHA256)根据以下公式生成签名。

Signature = HS256(Base64(头部) + "." + Base64(负载) ,  secretKey)

jwt校验

header 和 payload可以直接利用base64 URL解码出原文。

从header中获取哈希签名的算法,从payload中获取有效数据。

signature使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改。服务端用header、payload、secretKey通过header中的签名算法进行再次加密,比对加密后的数据和客户端发送过来token中的的是否一致。

无论改了头部、负载、和签名中的哪个部分,token校验都不会通过

来源地址:https://blog.csdn.net/m0_56750901/article/details/125493359

--结束END--

本文标题: token与JWT详细介绍

本文链接: https://www.lsjlt.com/news/383965.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • token与JWT详细介绍
    token介绍 Token 的中文意思是"令牌"。主要用来身份验证。比传统的身份验证方法,Token 有扩展性强,安全性高的特点,非常适合用在 Web 应用或者移动应用上。 它是服务端生成的字符串,作为客户端进行请求的一个标识。 token...
    99+
    2023-08-31
    java
  • AndroidCrash与ANR详细介绍
    目录Crash空指针角标越界集合元素删除操作异步操作后对界面元素的处理Intent传递数据过大在子线程中操作UIANRCrash Crash是指程序闪退,导致APP不能正常使用。Cr...
    99+
    2022-11-13
    Android Crash Android ANR
  • 详解JWT与Token的应用与原理
    目录JWT的应用Token的组成原理JWT对称加密JWT非对称加密生成私钥和公钥前言:JWT全称“JSON Web Token”,是实现Token的机制。官网...
    99+
    2023-05-16
    JWT应用与原理 Token应用与原理
  • Python JWT 介绍和使用详解
    1. JWT 介绍 ​jwt( JSON Web Tokens ),是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明。目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项...
    99+
    2022-06-02
    Python JWT使用 Python JWT
  • OAuth2 详细介绍!
    目录 一、文章介绍 二、OAth2 2.1 简介 2.2 OAuth2  授权总体流程 2.3 四种授权模式 1.授权码模式 2.简化模式 3.密码模式 4. 客户端模式 2.4 OAuth2 标准接口 2.5 GitHub 授权登录 1...
    99+
    2023-09-15
    github java
  • springMVC详细介绍
    目录springMVC简介SpringMVC框架的优点第一个SpringMVC程序第一步:创建maven-web项目第二步:在pom.xml中添加依赖和插件第三步注册中央调度器第四步...
    99+
    2022-11-12
  • DockerCompose详细介绍
    目录一、Docker Compose的安装二、Docker Compose的基本使用三、Docker Compose的高级功能四、总结一、Docker Compose的安装 Dock...
    99+
    2023-05-16
    Docker Compose详解 Docker Compose
  • JSON基础介绍与详细用法
    一、什么是JSON 1、JSON指的是JavaScript对象表示法(JavaScript Object Notation)。2、JSON是轻量级的文本数据交换格式,比XML更小、更...
    99+
    2022-11-13
  • JavaScript可视化与Echarts详细介绍
    目录一、可视化介绍二、可视化库介绍三、EchartsEcharts引入和使用了解基础配置一、可视化介绍 可视化:将数据用图表展示出来,让数据更加直观、让数据特点更加突出应用场景:营销...
    99+
    2022-11-13
  • PythonCountingBloomFilter原理与实现详细介绍
    目录前言原理一、BF 为什么不支持删除二、什么是 Counting Bloom Filter三、Counter 大小的选择简单的实现总结前言 标准的 Bloom Filter 是一种...
    99+
    2022-11-11
  • ReactState与生命周期详细介绍
    目录一、State1.1 类组件中的State1.2 函数组件中的State二、React生命周期2.1 挂载2.2 更新2.3 卸载2.4 函数式组件useEffect三、总结一、...
    99+
    2022-11-13
  • JDK与Dubbo中的SPI详细介绍
    目录1、SPI简介2、JDK中的SPI3、Dubbo中的SPI4、Dubbo中扩展点使用方式5、DubboSPI中的Adaptive功能1、SPI简介 SPI 全称为 (Servic...
    99+
    2022-11-13
  • SpringMVC配置与使用详细介绍
    目录一、SpringMVC的使用1、MVC模式2、具体的坐标如下3、配置DispatcheServlet4、编写springmvc.xml的配置文件二、SpringMVC原理1、Sp...
    99+
    2022-11-13
  • Linux的chattr与lsattr命令详细介绍
    这篇文章主要介绍“Linux的chattr与lsattr命令详细介绍”,在日常操作中,相信很多人在Linux的chattr与lsattr命令详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux的c...
    99+
    2023-06-16
  • C++的类与C#的类详细介绍
    本篇内容介绍了“C++的类与C#的类详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!许多编程人员学习C++总结经验为,有的觉得C++语...
    99+
    2023-06-17
  • Yarn的安装与使用详细介绍
    在官方介绍里有这么一句话: Yarn is a package manager for your code. It allows you to use and share code with other d...
    99+
    2022-06-04
    详细介绍 Yarn
  • ES6中Set与WeakSet集合详细介绍
    这篇文章主要讲解了“ES6中Set与WeakSet集合详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ES6中Set与WeakSet集合详细介绍”吧!目录Set是值永不重复的特殊集合S...
    99+
    2023-06-20
  • Node.js 与并发模型的详细介绍
    目录进程线程内核态线程用户态线程轻量级进程(LWP)小结协程I/O 模型阻塞 I/O非阻塞 I/O同(异)步 I/ONode.js 的并发模型总结前言: Node.js 现在已成为构...
    99+
    2022-11-13
  • Spring MVC 与 CORS跨域的详细介绍
    1. CORS 简介同源策略(same origin policy)是浏览器安全的基石。在同源策略的限制下,非同源的网站之间不能发送 ajax 请求的。为了解决这个问题,w3c 提出了跨源资源共享,即 CORS(Cross-Origin R...
    99+
    2023-05-31
    spring mvc cors
  • Java对象与Java类的详细介绍
    本篇内容介绍了“Java对象与Java类的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录面向对象是什么Java类什么是类Java...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作