Jwt的Token详解

简单来说,token就是一种身份验证方法,和cookie有相似作用;它被很多人翻译过来后生动的称为“令牌”,它的扩展性,安全性更高,非常适合用在Web应用和移动开发应用上。

1.1token验证流程

使用token身份验证,服务器端就不会存储用户的登录记录。

(1)客户端使用用户名跟密码请求登录;
(2)服务端收到请求,去验证用户名与密码;
(3)验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端;
(4)客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;
(5)客户端每次向服务端请求资源的时候需要带着服务端签发的 Token;
(6)服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。

Token有很多种,下面重点介绍Jwt

2.1Jwt

json web token(JWT)是一个开放标准(rfc7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以JSON对象安全地传输信息。它是以JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输。在数据传输过程中还可以完成数据加密、签名等相关处理。

http协议无状态的,所以需要sessionId或token的鉴权机制,jwt的token认证机制不需要在服务端再保留用户的认证信息或会话信息。这就意味着基于jwt认证机制的应用程序不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利,jwt更适用于分布式应用

2.2jwt的组成部分

​ 标准的jwt令牌分为三部分,分别是Header、payload、signature;

2.2.1Header

它的组成部分包括两点

  • 参数类型-jwt
  • 签名的算法-hs256

最后会经过Base64加密方式进行编码,看起来是这个样子:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

2.2.2Payload

它的组成就是登陆用户的一些信息,和token发行和失效时间等;这些内容里面有一些是标准字段,你也可以添加其它需要的内容。

iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间
nbf:Not before
iat:Issued at,发行时间
jti:JWT ID

最后它也会通过Base64加密方式进行编码,仍然长的像上面的样子

2.2.3Signature

它是由3个部分组成,先是用 Base64 编码的 header 和 payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。

secret就是在最后第二次加密时加的盐,算是一个秘钥(只保留在服务器),不向外部透露。

来看一下最后的jwt完整版

eyJhbGciOiJIUzI1NiIsInR9cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6I
kpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
8HILod0ncfVDnbKIPJJqLH998duF9DSDGkx3gRPNVI

  • 10
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JWT(JSON Web Token)是一种用于身份验证的开放标准(RFC 7519)。它通过数字签名验证消息的完整性,因此,JWT可以安全地传输信息。JWT通常用于Web应用程序中,以验证用户的身份。 生成JWT token的步骤如下: 1. 首先,需要选择一个加密算法,如HMAC SHA256或RSA。 2. 构建JWT token的header部分。header部分是一个JSON对象,它描述了JWT的类型和加密算法。例如: ``` { "alg": "HS256", "typ": "JWT" } ``` 其中,"alg"表示使用的加密算法,"typ"表示JWT的类型。 3. 构建JWT token的payload部分。payload部分也是一个JSON对象,它包含要传输的信息,例如用户ID、用户名、过期时间等。例如: ``` { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } ``` 其中,"sub"表示主题(通常是用户ID),"name"表示用户名,"iat"表示JWT的发布时间。 4. 使用密钥对header部分和payload部分进行签名。签名可以确保消息的完整性和真实性。签名的方法取决于所选择的加密算法。例如,如果使用HMAC SHA256,签名可以如下计算: ``` HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) ``` 其中,"secret"是一个密钥,用于计算签名。 5. 将header部分、payload部分和签名组合在一起,用"点"连接起来,形成JWT token。例如: ``` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIy. SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` 其中,第一个部分是base64UrlEncode后的header部分,第二个部分是base64UrlEncode后的payload部分,第三个部分是签名。 因为JWT token包含签名,所以接收方可以验证它的完整性和真实性。如果签名验证失败,说明该消息可能已被篡改或伪造。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值