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

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

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

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

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

可以使用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。
验证过程:
  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进行加密处理。对于敏感信息,应使用其他加密方式进行保护。

代码示例:

python 复制代码
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,可以简化身份验证流程,提高应用的安全性和性能。

相关推荐
Alice-YUE31 分钟前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
是上好佳佳佳呀2 小时前
【前端(十一)】JavaScript 语法基础笔记(多语言对比)
前端·javascript·笔记
CDN3602 小时前
排查实录:网站偶发502/504错误?360CDN回源超时配置与日志分析技巧
前端·数据库
之歆3 小时前
Day07_CSS盒子模型 · 样式继承 · 用户代理样式
前端·css
DanCheOo3 小时前
AI 应用的安全架构:Prompt 注入、数据泄露、权限边界
前端·人工智能·prompt·安全架构
We་ct4 小时前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
weisian1514 小时前
基础篇--概念原理-2-参数是什么?——从原理到实战,一篇讲透
面试·职场和发展·模型参数·7b和70b·参数=规则,不是原始数据
weixin_427771614 小时前
前端调试隐藏元素
前端
爱上好庆祝5 小时前
学习js的第五天
前端·css·学习·html·css3·js
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题】【Java基础篇】第26题:Java的抽象类和接口有哪些区别
java·开发语言·面试