JWT(JSON Web Token)

一. 为什么要使用JWT

我们传统用户认证,一般是登录之后把用户信息存到了服务器(如session中),然后发送sessionid给客户端及浏览器,用户登录之后想进行一些操作及发送请求调用API,必须携带sessionid,服务器接收到sessionid进行防篡改验证,验证此次操作为本人,才能继续进行一下步操作。
如果用户数量过多,成千上万的用户同时在线,这么多用户的信息状态都储存在服务器里面,就会给服务器造成压力,开销巨大。
使用传统的基于cookie的session的用户认证方式,在这个人流量巨大的互联网时代已经出现各种弊端。
eg:服务器开销大影响服务器性能;不允许垮域访问;跨站请求伪造(CSRF)等等
我们传统的把用户状态信息存到服务器,让服务器来管理用户这种方式开销大,让用户自己管理自己的信息(客户端浏览器)怎么样呢,于是有人想出了token,及给每个用户颁发一个令牌,用户以后调用资源接口,必须携带这个令牌,验证通过才能进行下一步操作。
使用token的好处:
①服务器压力和开销小:用户信息只是一个无状态字符串,服务器只负责生成了发给用户,然后再解析,不存用户信息,由用户自己管理自己的信息。
②跨平台:当你的客户端是一个原生平台(iOS, Android,Windows 8等)时,Cookie是不被支持的(你需要通过Cookie容器进行处理),这时采用Token认证机制就会简单得多。
③跨域:Cookie是不允许垮域访问的,我们只需要把token用cookie存着,请求的时候从本地cookie取出token即可。
④防范CSRF:因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨站请求伪造)的防范。
⑤性能:一次网络往返时间(通过数据库查询session信息)总比做一次HMACSHA256计算 的Token验证和解析要费时得多.
⑥基于标准化:你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft).

原理

然而这个token,是由服务器通过秘钥(serectkey)然后把用户id以及其他信息包装进行一系列的加密算法生成,用户登录的成功,顺带把这个token返回到客户端,用户以后拿着token来访问相关资源,服务器接收到token,通过serectkey然后通过特定算法,解析出这个token中的用户id,解析成功!那么这个人就是该用户,然后通过解析出的id进行该用户的相关操作。

二. 什么是JWT

官网:link.
基于标准化:你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft).

JSON Web Token(JWT) :是token的一种实现,原理一样,但是JWT就是一个很具体的标准了,用点号分为三段,分别表示头、信息和签名。
token是一个字符串的话,那么JWT就是 xxxxx.yyyyy.zzzzz,三个字符串的组合体。 即: Header . Payload . Signature
在这里插入图片描述

Header—标头

该部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。
{
“alg”: “HS256”,
“typ”: “JWT”
}

alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
最后,将上面的 JSON 对象使用 Base64URL 算法转成字符串。

Payload—有效载荷

该部分也是一个 JSON 对象,用来存放实际需要传递的数据。
列举几个常用的官方字段声明,还有其他的字段可以去官方文档查看。
①官方标准中注册的声明:
● iss (issuer):签发人
● exp (expiration time):过期时间
● sub (subject):主题
● aud (audience):受众
● iat (Issued At):签发时间
● jti (JWT ID):编号
②公共的声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加敏感信息,因为该部分在客户端可解密。
③私有的声明
​ 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息,
这个指的就是自定义的claim。比如下面那个结构举例中的admin和name都属于自定的claim。
{
“sub”: “1234567890”,
“name”: “John Doe”,
“admin”: true
}

这个 JSON 对象也要使用 Base64URL 算法转成字符串。

Signature—签名

要创建签名部分,您必须获取编码的标头,编码的有效载荷,机密,标头中指定的算法,并对其进行签名。
例如,如果要使用HMAC SHA256算法,则将通过以下方式创建签名:
HMACSHA256(
base64UrlEncode(header) + “.” +
base64UrlEncode(payload),
secret)
签名用于验证消息在此过程中没有更改,并且对于使用私钥进行签名的令牌,它还可以验证JWT的发送者是它所说的真实身份。

组合

输出是三个由点分隔的Base64-URL字符串,可以在HTML和HTTP环境中轻松传递这些字符串,与基于XML的标准(例如SAML)相比,它更紧凑。
下面显示了一个JWT,它已对先前的标头和有效负载进行了编码,并用一个秘密进行了签名。
在这里插入图片描述

三. JWT的使用(JAVA)

首先导入相关依赖jar包,可去maven仓库找,也可去官网找,官网有各种版本的jwt,这里我使用jjwt。

    <!-- https:/
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的基于 JSON Web TokenJWT)的身份验证案例: 1. 安装所需的库 ``` pip install pyjwt ``` 2. 生成JWT Token ```python import jwt import datetime # 定义过期时间 expire_time = datetime.datetime.utcnow() + datetime.timedelta(minutes=30) # 定义payload payload = { 'user_id': '123456', 'username': 'john', 'exp': expire_time } # 生成token jwt_token = jwt.encode(payload, 'secret_key', algorithm='HS256') print(jwt_token) ``` 上述代码中,我们使用了 pyjwt 库来生成 JWT Token。它的 encode() 方法接收三个参数:payload、密钥和算法。payload 是一个字典,包含我们想要在 Token 中存储的信息,例如用户ID、用户名、过期时间等等。密钥是一个字符串,用于加密 Token。算法是指用于加密 Token 的算法,这里我们选择了 HS256。 3. 验证JWT Token ```python import jwt # 定义Token jwt_token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMTIzNDU2IiwidXNlcm5hbWUiOiJqb2huIiwiZXhwIjoxNjMxMzEwMDUzfQ.XsDEjcd7jH8qC-6pZlWjZaFvDz-pT8NvQYrWb8I3-5c' # 验证Token try: decoded_token = jwt.decode(jwt_token, 'secret_key', algorithms=['HS256']) print(decoded_token) except jwt.ExpiredSignatureError: print('Token已过期') except jwt.InvalidTokenError: print('无效的Token') ``` 上述代码中,我们使用了 pyjwt 库的 decode() 方法来验证 Token。它接收三个参数:Token、密钥和算法。如果 Token 有效,则返回包含信息的字典。如果 Token 过期或无效,则会引发 jwt.ExpiredSignatureError 或 jwt.InvalidTokenError 异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王景清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值