首页 > 其他分享 >JWT令牌——从入门到精通

JWT令牌——从入门到精通

时间:2024-11-05 19:45:53浏览次数:6  
标签:令牌 入门 JWT 用户 Header token session 服务器

一、跨域认证的问题

互联网服务离不开用户认证。一般流程是下面这样。
1、用户向服务器发送用户名和密码。
2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
3、服务器向用户返回一个 session_id,写入用户的 Cookie。
4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
这种模式的问题在于,扩展性不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。
举例来说,A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?
一种解决方案是 session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败, 同时它增加了数据库的压力.

  1. 持久化媒介比如数据库压力比较大
  2. 如果数据库挂了,所有登录都会失效
    另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。
    把用户信息放到客户端,服务端的app是不是就是无状态的。微服务都是无状态的。

二、JWT 的原理

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。
{
“姓名”: “张三”,
“角色”: “管理员”,
“到期时间”: “2018年7月1日0点0分”
}
以后,用户与服务端通信的时候,都要求发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。
服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

三、JWT 的数据结构

实际的 JWT 大概就像下面这样。
在这里插入图片描述
它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。
JWT 的三个部分依次如下。
● Header(头部) 明文
● Payload(负载) 明文
● Signature(签名)
写成一行,就是下面的样子。
Header.Payload.Signature
在这里插入图片描述

下面依次介绍这三个部分。

  1. Header
    Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。
    { “alg”: “HS256”, “typ”: “JWT”}
    上面代码中,
    alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);
    typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
    最后,将上面的 JSON 对象使用 Base64URL 算法(详见后文)转成字符串。
  2. Payload
    Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。
    iss (issuer):签发人exp (expiration time):过期时间sub (subject):主题aud (audience):受众nbf (Not Before):生效时间iat (Issued At):签发时间jti (JWT ID):编号
    除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。
    {
    “sub”: “1234567890”,
    “name”: “John Doe”,
    “admin”: true
    }
    注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
    这个 JSON 对象也要使用 Base64URL 算法转成字符串。
  3. Signature
    签名,利用“加密算法”对JWT进行签名,保证没有被篡改过,值得注意的是,这里的数据都是明文的,算法实际上执行的是最后的数据签名功能,所以后面看到“加密、解密”,其实都是为签名服务的。
    首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
    HMACSHA256(base64UrlEncode(header) + “.” +base64UrlEncode(payload), secret)
    算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
  4. Base64URL
    前面提到,Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似,但有一些小的不同。
    JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。这就是 Base64URL 算法。

四、JWT 的使用方式

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息token字段里面。
token: 令牌

五、JWT 的几个特点

(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
(2)JWT 不加密的情况下,不能将重要数据写入 JWT。
(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证.
(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

标签:令牌,入门,JWT,用户,Header,token,session,服务器
From: https://blog.csdn.net/qq_52747920/article/details/143523201

相关文章

  • Nop入门: 动态SQL管理
    Nop平台提供了类似MyBatis的动态SQL管理能力,但是功能特性远比MyBatis丰富、强大。同时它的实现反而更加简单,在NopORM的基础上实现SqlLibManager只需要300多行的代码。一.使用说明1.1增加一个sql-lib.xml文件<!--/nop/demo/sql/demo.sql-lib.xml--><sql-libx:schema......
  • rust学习二、入门之运行单个脚本
    入门者,在搭建好环境好之后,接下来得先熟悉工具。有了趁手的工具,学起来才会快得多!作为入门者,非常希望能够单独运行一个rust脚本,而没有必要一个练习就建立一个项目。在https://crates.io上,我们可以找到各种各样的工具,有两个可以关注:cargo-script ,很不幸的是,这个项目自从2017年......
  • Java入门十二——static详解(含toString)
    上节课,我们只是微微提到了static,今天我们来具体讲讲static的用法static1.类名.静态成员变量(上篇博客Java入门十一有讲)为了方便大家查看,我把链接放在这里Java入门11——关键字总结+static-CSDN博客2.类名.静态成员方法这里,我们首先创建两个类,分别是java12和demo1,然后调用d......
  • 全网最详细大语言模型(LLM)入门学习路线图
    Github项目上有一个大语言模型学习路线笔记,它全面涵盖了大语言模型的所需的基础知识学习,LLM前沿算法和架构,以及如何将大语言模型进行工程化实践。这份资料是初学者或有一定基础的开发/算法人员入门活深入大型语言模型学习的优秀参考。这份资料重点介绍了我们应该掌握哪些核......
  • Go 语言变量类型:从入门到精通,一篇搞定所有知识点!
    Go语言变量类型1.基本类型1.1数值类型1.2布尔类型1.3字符串类型2.复合类型2.1数组2.2切片2.3字典(map)2.4结构体2.5接口3.类型转换4.零值5.示例1.基本类型Go语言中的基本类型主要包括数值类型、布尔类型和字符串类型。1.1数值类型整型:int:根据......
  • 挖漏洞怎么赚钱?挖漏洞入门到精通,收藏这篇就够了
    我就是一个最普通的网络安全工程师,出道快10年了,不出意外地遭遇到瓶颈期,但是凭技术在各大平台挖漏洞副业,硬是妥妥扛过来了。因为对于程序员来讲,这是个试错成本很低、事半功倍的选择。编程技能是一种强大生产力,决定程序员是一个高薪职业,同时由于技术迭代太快,决定程序员也是......
  • 九、Go语言快速入门之map
    文章目录Map:one:使用`Map`:star2:声明和初始化:star2:`map`容量:star2:用切片作为`map`的值:two:测试键值对是否存在及删除元素:three:`For`-`range`:four:`map`类型的切片:five:map的排序:six:将map的健和值对调......
  • 了解病毒木马(非常详细),零基础入门黑客,看这篇就够了!
    1、病毒木马是什么病毒木马都属于恶意软件,病毒会自我复制,木马则擅长伪装。2、病毒木马有哪些(1)破坏病毒:如熊猫烧香,以破坏计算机为目的,让计算机不能正常使用。(2)勒索病毒:本质是加密软件,被不法分子用于勒索。2017-2018年特别猖獗。(3)挖矿病毒:虚拟货币,通过计算资源获得。通......
  • 300个网络安全软件和在线工具(归类版)(非常详细),零基础入门到精通,看这一篇就够了
    系统下载1、KALI安装版https://pan.quark.cn/s/483c664db4fb2、KALI免安装版https://pan.quark.cn/s/23d4540a800b3、下载所有Kali系统https://pan.quark.cn/s/7d8b9982012f4、KALI软件源https://pan.quark.cn/s/33781a6f346d5、所有Linux系统https://pan.quark.c......
  • 中国十大网络安全公司(非常详细),零基础入门到精通,看这一篇就够了
    文章目录前言1、深信服科技股份有限公司2、奇安信3、启明星辰信息技术集团股份有限公司4、天融信(南洋股份)5、美亚柏科6、蓝盾股份7、绿盟科技8、任子行9、安恒信息10、山石网科零基础网络安全学习计划学习路线图大纲总览学习计划阶段一:初级网络安全工程师阶段二:中级or高......