五分钟带你看懂什么是JWT

五分钟带你看懂什么是JWT道可道 非常道 名可名 非常名 无 名天地之始 有 名万物之母 故常无 欲以观其妙 常有 欲以观其徼 此两者 同出而异名 同谓之玄 玄之又玄 众妙之门 此两者 同出而异名 同谓之玄 玄之又玄 众妙之门

欢迎大家来到IT世界,在知识的湖畔探索吧!

‬道可道,非常道;名可名,非常名。

无,名天地之始;有,名万物之母。

故常无,欲以观其妙;常有,欲以观其徼。

此两者,同出而异名,同谓之玄。玄之又玄,众妙之门。

此两者,同出而异名,同谓之玄。玄之又玄,众妙之门。

五分钟带你看懂什么是JWT

文章导航



欢迎大家来到IT世界,在知识的湖畔探索吧!

贾明是一个酒馆的会员,当他每次光顾的时候,店里会根据贾明的会员卡进行相应的折扣和优惠。

什么是JWT

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在不同实体之间安全地传输信息。它是一种基于 JSON 的轻量级令牌,通常用于身份验证和授权机制。在上面故事里,可以将会员卡理解为JWT。

JWT 由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature)。每个部分都使用 Base64 编码,并使用句点(.)连接起来。具体结构如下:

header.payload.signature

欢迎大家来到IT世界,在知识的湖畔探索吧!

  • 头部(Header):包含 JWT 的类型(例如,”typ”: “JWT”)和所使用的算法(例如,”alg”: “HS256″)。这些字段提供了关于 JWT 的元数据。
  • 载荷(Payload):存储实际的用户数据或声明。它包含一组称为声明(Claims)的属性,可以自定义添加一些标准声明(如过期时间、发行人等)或自定义声明。载荷中的声明可以被加密,但通常是以明文形式存在。
  • 签名(Signature):用于验证消息的完整性和真实性。签名是通过将头部和载荷与一个秘密密钥进行加密生成的,确保 JWT 没有被篡改过。

单纯看概念,可能有点懵,接下来看一个具体的JWT

欢迎大家来到IT世界,在知识的湖畔探索吧!eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

根据颜色标识,分别是三段加密字符串,解析如下。

五分钟带你看懂什么是JWT

JWT结构

对于已签名的令牌,此信息虽然受到防止篡改的保护,但任何人都可以读取。除非加密,否则不要在JWT的有效负载或报头元素中放置秘密信息。

工作流程

在使用过程中,客户端使用凭证向认证服务器认证,并由认证服务器返回JWT,后续请求中,客户端携带该JWT,服务端通过验证并解析。

五分钟带你看懂什么是JWT

JWT工作流程

  1. 用户使用凭证(如用户名和密码)进行认证。
  2. 认证服务器验证用户凭证,生成 JWT 并将其返回给客户端。
  3. 客户端将 JWT 存储在本地(通常是在客户端的 Cookie 或本地存储中)。
  4. 在后续的请求中,客户端将 JWT 附加到请求的头部或参数中。
  5. 服务器验证 JWT 的签名,并从中提取出用户的身份信息。

看到这里,是不是和文章开头的故事很相似,贾明出示会员卡,店里根据会员卡从会员系统校验会员的信息。认证通过之后,贾明就可以享受相应的会员权益。

JWT的创建与校验

JWT与语言无关,因此有广泛的使用,现在我们以Golang为例,来看下JWT的创建与校验。

JWT创建

func GenerateJWT() (string, error) { // 创建一个新的令牌对象 token := jwt.New(jwt.SigningMethodHS256) // 设置一些标准声明(例如过期时间和发行人) claims := token.Claims.(jwt.MapClaims) claims["exp"] = time.Now().Add(time.Hour * 24).Unix() // 设置过期时间为 24 小时后 claims["iss"] = "your_issuer" // 设置发行人 // 添加自定义声明(如果有需要的话) claims["custom_key"] = "custom_value" // 设置签名密钥 secretKey := []byte("your_secret_key") // 这是你的密钥,请根据实际情况进行更改 tokenString, err := token.SignedString(secretKey) if err != nil { return "", err } return tokenString, nil }
  • 首先,创建一个新的 JWT 对象,使用 jwt.New 函数并指定签名方法为 HS256。
  • 其次,设置一些标准声明(如过期时间和发行人)和自定义声明(如果有需要的话),将它们添加到 JWT 的 Claims 中。
  • 接下来,我们通过调用 SignedString 方法并传递签名密钥来对令牌进行签名。
  • 最后,返回生成的 JWT 字符串。

JWT校验

欢迎大家来到IT世界,在知识的湖畔探索吧!func ValidateJWT(tokenString string) (bool, error) { // 解析 JWT token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { // 验证签名密钥 secretKey := []byte("your_secret_key") // 这是你的密钥,请根据实际情况进行更改 return secretKey, nil }) if err != nil { return false, err } // 验证是否有效 if _, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return true, nil } return false, nil }
  • 首先,使用 jwt.Parse 函数解析传入的 JWT 字符串。在解析过程中,我们还提供了一个回调函数,用于验证签名密钥。
  • 在回调函数中,我们简单地返回事先设置好的签名密钥。
  • 解析后,检查 JWT 是否有效且签名正确。校验通过,则返回 true 表示校验通过;否则,返回 false。

注意,这里只是简单地检查 JWT 的有效性,实际使用过程中,还需要进一步校验数据的合法性等。

看到这里,聪明的你一定想到,既然JWT有时效性,那么过期后要怎么处理?后续将推出JWT续签的几种方法,和续签过程可能出现的问题。关注本公众号并星标,以便及时得到推送!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/103241.html

(0)
上一篇 2026年 1月 25日 下午4:05
下一篇 2026年 1月 25日 下午4:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信