首页 > 其他分享 >JSON Web Token(JWT)

JSON Web Token(JWT)

时间:2023-04-07 16:45:01浏览次数:58  
标签:Web 过期 JWT Header JSON 签名 Payload 加密算法

JSON Web Token(JWT)

什么是JWT

JSON Web Token(JWT)是一种用于身份验证和授权的开放标准(RFC 7519),它定义了一种紧凑、自包含的方式,用于在网络上传输信息。JWT 由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)。

  • 头部(Header):Header部分通常由两部分信息组成:令牌的类型(这里是JWT)和使用的加密算法(比如HMAC SHA256或RSA)。

  • 载荷(Payload):Payload部分包含了一些声明信息,比如用户的ID、角色、过期时间等等。Payload部分是可以自定义的,但建议不要在Payload中放置敏感信息。

  • 签名(Signature):Signature部分是对Header和Payload部分的签名,可以确保令牌没有被篡改。

下面是一个JWT令牌的示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyMzkwMjJ9.
4v1sxC4W4jEbP7lI4vA-ItQn8-kwxg1A-GACFVHd_9M

它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。

JWT 的三个部分依次如下。

Header(头部)
Payload(负载)
Signature(签名)

写成一行,就是下面的样子。

Header.Payload.Signature

上述JWT令牌包含三部分:

Header部分是一个JSON对象,包含令牌的类型(JWT)和使用的加密算法(HMAC SHA256):

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

Payload部分也是一个JSON对象,包含了一些声明信息,比如用户的ID、角色、过期时间等等:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022,
  "exp": 1516239022 + 3600
}

Signature部分是对Header和Payload部分的签名,确保令牌没有被篡改。

签名的公式如下:

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

其中,HMACSHA256表示使用HMAC SHA256加密算法,base64UrlEncode表示将字符串用Base64编码并且替换掉其中的"+"、"/"和"="为"-""_"和""。

secret是用于加密的密钥,该密钥只有服务端知道,用于验证JWT令牌的合法性。

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

JWT 通常用于在不同的应用程序之间传输身份验证信息,例如将用户登录信息传递给服务器。使用 JWT 的优点包括:无状态、跨平台、可靠性高、易于扩展、支持多种签名算法等。

JWT 的安全问题

JWT 是一种开放的标准,具有一定的安全风险。以下是一些常见的 JWT 安全问题:

1.JWT 的盗用

一旦 JWT 被窃取,攻击者就可以使用这个令牌来伪装成合法用户并访问受保护的资源。因此,在使用 JWT 时需要采取措施保护其机密性,例如使用 HTTPS 协议传输、使用适当的加密算法等。

2.JWT 的伪造

JWT 使用签名来验证其完整性和真实性,但如果签名算法被攻击者破解,则可以使用伪造的 JWT 访问受保护的资源。因此,在选择签名算法时需要谨慎,选择可靠的加密算法。

3.JWT 的过期

JWT 包含一个过期时间(exp),用于指定 JWT 的有效期限。如果过期时间设置过长或者过短,都会导致安全问题。过期时间设置过长,可能导致 JWT 被盗用后长时间有效,从而增加安全风险;过期时间设置过短,则可能导致用户频繁需要重新登录,影响用户体验。

4.JWT 的存储

如果 JWT 存储在客户端的 cookie 中,可能会受到跨站点脚本(XSS)攻击的威胁。攻击者可以通过注入恶意代码来窃取 JWT。因此,在存储 JWT 时,需要采用安全的存储方案,例如使用 HTTP-only cookie、localStorage、sessionStorage 等。

5.JWT 的大小

由于 JWT 包含的信息越多,其大小也会越大,从而影响JWT 的传输效率和性能。因此,在设计 JWT 时,需要权衡安全性和效率,并尽量减小 JWT 的大小。

如何保证JWT安全

为了保证 JWT 的安全性,我们可以采取以下措施:

使用适当的加密算法

在选择签名算法时,需要选择可靠的加密算法,例如 HMAC-SHA256、RSA-SHA256、ECDSA 等。同时,需要注意密钥的管理和保护,例如使用密钥轮换、密钥分离、密钥加密等。

设置适当的过期时间

在设置 JWT 的过期时间时,需要考虑安全和用户体验的平衡。一般来说,过期时间应该设置为比较短的时间,例如 15 分钟到 1 小时,但也要根据具体的应用场景和业务需求来设置过期时间。

使用 HTTPS 协议传输

使用 HTTPS 协议传输可以保证 JWT 的机密性和完整性,防止 JWT 被窃取或篡改。因此,在使用 JWT 时,应该尽可能使用 HTTPS 协议传输。

使用 HTTP-only cookie 存储可以防止 XSS 攻击窃取 JWT。HTTP-only cookie 只能通过 HTTP 协议传输,不能通过 JavaScript 访问。因此,在存储 JWT 时,应该尽可能使用 HTTP-only cookie。

实施访问控制

实施访问控制可以限制 JWT 的使用范围,防止 JWT 被滥用。例如,在 JWT 的载荷中添加用户的访问权限信息,服务器可以根据这些信息来判断用户是否有权访问受保护的资源。

总结

JSON Web Token(JWT)是一种用于身份验证和授权的开放标准,具有无状态、跨平台、可靠性高、易于扩展、支持多种签名算法等优点。然而,JWT 也存在一些安全问题,例如盗用、伪造、过期、存储和大小等问题。为了保证 JWT 的安全性,我们需要选择适当的加密算法、设置适当的过期时间、使用 HTTPS 协议传输、使用 HTTP-only cookie 存储和实施访问控制等措施。

标签:Web,过期,JWT,Header,JSON,签名,Payload,加密算法
From: https://www.cnblogs.com/ikn0w1T/p/17296676.html

相关文章

  • 动力节点王鹤SpringBoot3笔记——第五章 说说Web服务
    第五章说说Web服务基于浏览器的B/S结构应用十分流行。SpringBoot非常适合Web应用开发。可以使用嵌入式Tomcat、Jetty、Undertow或Netty创建一个自包含的HTTP服务器。一个SpringBoot的Web应用能够自己独立运行,不依赖需要安装的Tomcat,Jetty等。SpringBoot可以创建两种类型的Web应......
  • 动力节点王鹤SpringBoot3学习笔记——第五章 说说Web服务
    第五章说说Web服务基于浏览器的B/S结构应用十分流行。SpringBoot非常适合Web应用开发。可以使用嵌入式Tomcat、Jetty、Undertow或Netty创建一个自包含的HTTP服务器。一个SpringBoot的Web应用能够自己独立运行,不依赖需要安装的Tomcat,Jetty等。SpringBoot可以创建两种类型的Web应......
  • 动力节点王鹤SpringBoot3学习笔记——第五章 说说Web服务
    第五章说说Web服务基于浏览器的B/S结构应用十分流行。SpringBoot非常适合Web应用开发。可以使用嵌入式Tomcat、Jetty、Undertow或Netty创建一个自包含的HTTP服务器。一个SpringBoot的Web应用能够自己独立运行,不依赖需要安装的Tomcat,Jetty等。SpringBoot可以创建两种类型的Web应......
  • Spring Boot返回Json数据及数据封装
    1.1简介在项目开发中,接口与接口之间,前后端之间数据的传输都使用Json格式,在SpringBoot中,接口返回Json格式的数据很简单,在Controller中使用@RestController注解即可返回Json格式的数据,@RestController也是SpringBoot新增的一个注解,我们点进去看一下该注解都包含了哪些东西......
  • 小程序开发 JSON转换的使用
    前言  此篇博客讲解小程序的JSON使用,因为JavaScript与JSON泛用性太大。初学者很容易在JSON的使用上困惑。 字符串转JSON请注意,下面的字符串json是带引号的。jsonTest(){letjsonString="{\"id\":\"1\",\"name\":\"测试JSON\"}";letdata......
  • [记录]php url传参json json_decode 后 null
    从APP端或从其他页面post,get过来的数据一般因为数组形式。因为数组形式不易传输,所以一般都会转json后再发送。本以为发送方json_encode(),接收方json_decode(),就解决的问题,结果发现,json_decode()后是NULL。一般会反应是少了一个参数“true”,但是回去看就是 json_decode($data,tru......
  • ctfshow-web4(Nginx日志写shell)
    这是一道有关Nginx日志文件写入shell的题目。  一、基础知识/etc/nginx/nginx.conf:该文件是Ngnix的配置的文件,该文件保存着能够影响服务器运行的配置信息。有时会泄露敏感信息。该文件支持php解析。/var/log/nginx/access.log:该文件是Ngnix的访问日志文件,Ngnix会把每个......
  • Chrome 发布首个 WebGPU 实现
    Chrome团队宣布,经过多年的开发,他们终于发布了WebGPU实现,目前已在Chrome113Beta中默认启用。WebGPU可用于在Web上进行高性能3D图形和数据并行计算。WebGPU初始版本可以在ChromeOS、macOS和Windows上使用,对其他平台的支持将于今年晚些时候推出。WebGPU是由......
  • Web简述:HTTP
    HTTP1、Web概述1.1Web和JavaWeb的概念Web是全球广域网,也称为万维网(www),能够通过浏览器访问的网站。在我们日常的生活中,经常会使用浏览器去访问百度、京东等这些网站,这些网站统称为Web网站。我们知道了什么是Web,那么JavaWeb又是什么呢?顾名思义JavaWeb就是用Java技术来解决相......
  • 如何解决安装完 webdriver-helper 但不可用的问题?
    一、问题分析使用selenium,并使用自动化安装浏览器驱动的方法,下载webdriver_helper的官网:webdriver-helper·PyPI。下载完成后在终端使用pipinstall安装包的绝对路径进行安装,安装完成后本以为可以运行了,结果还是报错了!为什么呢?答案是 webdriver_helper并......