JWT大揭秘:什么是JWT,JWT有哪些使用场景,

1.JWT(JSON Web Token)是什么?

经过加密的用户信息,请求中作为授权头携带,用于用户身份的校验。jwt是token生成的一种方式。

2.JWT(JSON Web Token)由三部分组成:

  1. Header(头部)
  2. Payload(负载)
  3. Signature(签名)

JWT大揭秘:什么是JWT,JWT有哪些使用场景,

JWT大揭秘:什么是JWT,JWT有哪些使用场景,

可以使用window.btoa进行编码成base64,并使用window.atob进行解码成json对象。这两个函数也是浏览器提供的全局函数。

3.JWT的签名和验证过程:

签名过程:
  1. 创建JWT的Header和Payload:Header部分通常包含类型(例如JWT)和签名算法(如HS256)的信息。Payload部分则包含需要传递的数据,如用户ID、角色、过期时间等。
  2. 拼接Header和Payload:将Header和Payload使用点号(.)进行拼接。
  3. 签名:使用服务器端的私钥(或称为签名密钥)对拼接后的字符串进行签名。签名的算法在Header中指定,可以是HS256、RSA等。签名的目的是为了验证数据的完整性和发送者的身份。
  4. 组成完整的JWT:将签名附加到拼接后的字符串末尾,再次使用点号(.)分隔,形成完整的JWT。

JWT大揭秘:什么是JWT,JWT有哪些使用场景,

验证过程:
  1. 接收JWT:客户端在请求时携带JWT,服务器接收并解析JWT。
  2. 分离Header、Payload和Signature:服务器根据点号(.)将JWT拆分为Header、Payload和Signature三部分。
  3. 验证签名:服务器使用自己的私钥(与签名时使用的私钥相对应)对Header和Payload拼接后的字符串进行签名,并将结果与JWT中的Signature进行对比。如果两者一致,则说明JWT是有效的,数据未被篡改。
  4. 检查Payload中的数据:服务器可以进一步验证Payload中的数据,如检查用户ID、角色等是否与预期一致,以及检查JWT是否过期。

需要注意的是,JWT的验证过程依赖于私钥的安全性。如果私钥泄露,攻击者可能会伪造有效的JWT。因此,保护私钥的安全至关重要。此外,JWT的Payload部分通常不存储敏感信息,因为这部分信息是base64编码,可以被解码和查看。如果Payload报错了敏感信息,应该对base64进行加密处理。对于敏感信息,应使用其他加密方式进行保护。

代码示例:

import jwt  
from datetime import datetime, timedelta  
  
//定义密钥  
SECRET_KEY = 'your-secret-key'  
  
//定义JWT的有效期(例如:1小时)  
EXPIRATION_DELTA = timedelta(hours=1)  
  
//生成JWT  
def create_token(user_id):  
    payload = {  
        'user_id': user_id,  
        'exp': datetime.utcnow() + EXPIRATION_DELTA  
    }  
    token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')  
    return token  
  
//验证JWT  
def verify_token(token):  
    try:  
        payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])  
        user_id = payload['user_id']  
        return user_id  
    except jwt.ExpiredSignatureError:  
        return None  # Token已过期  
    except jwt.InvalidTokenError:  
        return None  # Token无效或已篡改  
  
//使用示例  
token = create_token(123)  
print("Generated Token:", token)  
  
user_id = verify_token(token)  
if user_id:  
    print("Verified User ID:", user_id)  
else:  
    print("Token is invalid or expired.")

4.JWT的使用场景有哪些:

  1. 用户身份验证与授权:JWT最常见的使用场景是用户身份验证。一旦用户登录成功,服务器会生成一个包含用户信息的JWT,并将其返回给客户端。在后续的请求中,客户端只需携带这个JWT,服务器就可以通过验证JWT的有效性来确认用户的身份,并授权其访问相应的资源。这种方式避免了频繁查询数据库,提高了应用的性能。
  2. 单点登录(SSO) :JWT在单点登录场景中也非常有用。单点登录允许用户在一个应用系统中登录后,无需再次登录即可访问其他相关应用。通过使用JWT,可以将用户的登录状态信息编码在token中,并在多个应用之间共享。这样,用户只需在一次登录后,就可以无缝地切换到其他应用,提高了用户体验。
  3. 信息交换:由于JWT中包含签名,因此它可以在传输信息中进行安全控制。JWT可以在不同服务之间安全地传递信息,确保信息的完整性和真实性。这在进行敏感数据交换或API通信时特别有用。
  4. 无状态认证:对于RESTful API来说,JWT是实现无状态认证的一种理想方式。无状态认证意味着服务器不保存任何会话信息,每次请求都需要携带足够的认证信息。通过使用JWT,客户端可以在每个请求中附带token,服务器通过验证token的有效性来确认客户端的身份,从而实现了无状态认证。

此外,JWT还可以用于一次性验证场景,如用户注册后的账户激活链接。JWT的payload中包含的固定参数(如签发者和过期时间)使得这种场景得以实现。

总之,JWT的应用场景非常丰富,涵盖了用户身份验证、授权、信息交换、无状态认证等多个方面。通过使用JWT,可以简化身份验证流程,提高应用的安全性和性能。

原文链接:https://juejin.cn/post/7345404320966639655 作者:奶茶不加冰七分甜

(0)
上一篇 2024年3月13日 下午4:21
下一篇 2024年3月13日 下午4:31

相关推荐

发表回复

登录后才能评论