JWT介绍

什么是JWT?

        Json Web Token(JWT) 是一个开放标准(RFC 7519),它定义了一种紧凑的,自包含的方式,用于在各方之间以json对象安全地传输信息,此信息可以验证和信任.因为它是数字签名的,jwt可以使用加密算法(使用HMAC 算法) 或使用RSA或ECDSA 的公钥/私钥进行签名.

        通俗的讲:

        JWT就是通过json格式作为Web应用程序中的令牌,用于在各方之间安全地将信息以JSON的形式传输,在数据传输过程中.还可以对数据进行加密,签名等相关处理.

JWT的使用场景

 授权:
        这是使用JWT的最常见方案。 一旦用户登录,每个后续请求将包括 JWT,从而允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。

信息交换:
        JSON Web Token是在各方之间安全地传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以您可以确保发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否遭到篡改。

JWT认证过程

        

1.首先,前端通过 Web 表单将自己的用户名和密码发送到后端的接口。这一过程一般是一个 HTTP POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探。

2.后端核对用户名和密码成功后,将用户的id等其他信息作为 JWT Payload(负载),将其与头部分别进行Base64编码拼接后签名,形成一个JWT(Token)。形成的JWT就是一个形同lll.zzz.xxx的字符串。

3.后端将JWT字符串作为登录成功的返回结果返回给前端。前端可以将返回的结果保存在 localStorage 或 sessionStorage 上,退出登录时前端删除保存的JWT即可。

4.前端在每次请求时将 JWT 放入 HTTP Header 中的 Authorization 位。(解决 XSS 和 XSRF 问题)

5.后端检查是否存在,如存在验证JWT的有效性。例如,检查签名是否正确;检查Token是否过期;检查Token的接收方是否是自己(可选)。

6.验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作,返回相应结果。
 

 

JWT与Session的差异:

        相同点是,它们都是存储用户信息;然而,Session是在服务器端的,而JWT是在客户端的

Session方式存储用户信息的最大问题在于要占用大量服务器内存,增加服务器的开销。

        而JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。

Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。

JWT的优势:

  • 简洁: 可以通过URL,POST参数或者Http 请求头发送,因为数据量小,传输速度也快

  • 自包含:负载中包含了用户所需要的数据,避免多次查询数据库

  • 因为Token是以JSON加密的形式保存在客户端,所以JWT是跨语言的,原则上任何语言的Web项目都支持

  • 不需要在服务端保存会话信息,特别适用于分布式微服务.

 

JWT的结构

JSON Web令牌以紧凑的形式由三部分组成,这些部分由点(.)分隔,分别是:

  • 头部(header)

  • 载荷 (payload)

  • 签名(signature)

JWT通常如下所示: xxxxxx.yyyyyy.zzzzz

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySWQiOjEyMywiVXNlck5hbWUiOiJhZG1pbiJ9.Qjw1epD5P6p4Yy2yju3-fkq28PddznqRj3ESfALQy_U

头部(Header)

标头通常由两部分组成:

  1. 令牌的类型(即JWT)
  2. 所使用的签名算法,例如 HMAC SHA256 或 RSA。
    它会使用 Base64 编码组成 JWT 结构的第一部分
{
  "alg": "HS256",		//alg:algorithm(算法)
  "typ": "JWT"			//typ:type(类型)
}

注意:Base64是一种编码,也就是说,它是可以被翻译回原来的样子来的,它并不是一种加密过程。

然后用Base64Url编码(该加密是可以对称解密的)得到头部: 即:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

 

 载荷 (payload)

        令牌的第二部分是有效负载,其中包含声明。声明是有关实体(通常是用户)和其他数据的声明。同样的,它会使用 Base64 编码组成 JWT 结构的第二部分。
        简单来说,Payload 中包含了用户所需要的信息,如用户id、用户名、权限等。(由于Base64可以被解码,所以不要放用户的敏感信息,如密码!)

{"sub": "1234567890", "name": "John Doe", "admin": true }

然后将其base64url加密,得到jwt的一部分

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

 

签名(Signature)

        前面两部分都是使用 Base64 进行编码的,即前端可以解开知道里面的信息。Signature 需要使用编码后的 header 和 payload 以及提供的密钥,使用 header 中指定的签名算法(HS256)进行签名。签名的作用是保证 JWT 没有被篡改过。(header、payload 被篡改时,由于签名基于header和payload生成,所以将无法通过验证)

        签名时需要用到前面编码过的两个字符串,以头部中指定的加密算法(HMACSHA256) 加密,就如下

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

 加密后再进行 base64url 编码最后得到的字符串就是 token 的第三部分

TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

注意:secret是保存在服务器端的,jwt的签发也是在服务端的,secret就是用来进行jwt的签发和jwt的验证,所以它就是你服务端的私钥,在任何场景都不应该流露出去,一旦客户端得知这个secret,那就意味着客户端可以自我签发jwt了

 签名的作用: 保证 JWT 没有被篡改过,原理如下:

HMAC 算法是不可逆算法,类似 MD5 和 hash ,但多一个密钥,密钥(即上面的 secret)由服务端持有,客户端把 token 发给服务端后,服务端可以把其中的头部和载荷再加上事先共享的 secret 再进行一次 HMAC 加密,得到的结果和 token 的第三段进行对比,如果一样则表明数据没有被篡改。

 

JWT总结

  • 因为json的通用性,所以JWT是可以跨语言支持的,像C#,JavaScript,NodeJS,PHP等许多语言都可以使用

  • 因为有了payload部分,所以JWT可以在自身存储一些其它业务逻辑所必要的非敏感信息

  • 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的

  • 它不需要在服务端保存会话信息,所以它易于应用的扩展安全相关

  • 不应该在jwt的payload部分存储敏感信息,因为该部分是客户端可解密的部分

  • 保护好secret私钥。该私钥非常重要

  • 如果可以,请使用https协议

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JWT(JSON Web Token)是一种用于在网络应用程序之间安全传输信息的开放标准。它以 JSON 为基础并使用数字签名或消息认证码(MAC)来验证信息的完整性和真实性。 JWT 由三个部分组成:头部、载荷和签名。 头部包含 JWT 使用的签名算法信息,例如 HMAC SHA256 或 RSA。载荷包含需要传输的信息,例如用户 ID 或权限信息。签名是将头部、载荷和秘钥组合后生成的哈希值,用于验证信息的真实性。 JWT 的工作原理如下: 1. 用户使用用户名和密码进行身份验证。 2. 服务器验证用户名和密码的正确性。 3. 如果验证成功,服务器生成 JWT 并将其发送回客户端。 4. 客户端将 JWT 存储在本地并在每个后续请求中将其包含在请求头部中。 5. 服务器在接收到请求时,验证 JWT 的签名并检查载荷中的信息是否与所需的一致。如果验证成功,服务器会处理请求。 JWT 的优点是: 1. 轻量级和简单:JWT 以 JSON 格式编码,易于理解和实现。 2. 安全性:使用数字签名或消息认证码(MAC)验证信息的完整性和真实性,确保信息不被篡改或伪造。 3. 可扩展性:JWT 载荷可以包含任意数量的属性和元数据,使其非常适合用于身份验证和授权。 4. 无状态:JWT 包含所有必要的信息,因此服务器不需要存储任何会话信息,使其易于扩展和实现负载均衡。 然而,JWT 也存在一些缺点,例如: 1. JWT 一旦生成就无法撤销,因此必须确保密钥的安全性。 2. JWT 中包含的信息对于攻击者来说是可见的,因此敏感信息不应该存储在 JWT 中。 3. JWT 无法在传输过程中进行更新,因此在过期之前必须生成新的 JWT。 总体来说,JWT 是一种非常有用的身份验证和授权解决方案,但在使用时需要仔细考虑其安全性和缺点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值