01-JWT概述

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用之间传输信息的令牌。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

1.头部(Header):JWT的头部使用Base64编码,并包含两个主要信息:令牌类型(typ)和所使用的签名算法(alg)。常见的签名算法包括HMAC SHA256、RSA等。例如,一个头部可能如下所示:

{
  "alg": "HS256",
  "type": "JWT"
}

2.载荷(Payload):载荷是JWT的主要内容,也是一个Base64编码的JSON对象。它包含了一些声明,可以是预定义的声明(比如过期时间exp、发行者iss等)或自定义的声明(比如用户ID、角色等)。例如,一个载荷可以是:

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

Base64编码:

一种将二进制数据转换为可打印字符的编码方式。它使用64个可打印字符来表示二进制数据,包括大小写字母、数字和两个额外的字符。Base64编码的用途广泛,常用于在文本协议中传输或存储二进制数据,例如在电子邮件中发送附件、在HTTP请求中传输数据等。

Base64编码的工作原理如下:
1. 将输入数据(如字节流)划分为3个字节一组。
2. 将每组3个字节的数据拆分为四个6位的片段。
3. 将每个6位的片段映射到一个对应的Base64字符上(根据Base64字符表进行映射)。
4. 如果输入数据不足3个字节,会进行相应的填充。
5. 将映射后的Base64字符序列串联起来形成最终的Base64编码结果。

Base64字符表由64个字符组成,一般情况下使用如下字符集:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

最后一个字符”/”有时会被替换为”-”,而最后两个字符”+/”有时会被替换为”-_”以适应不同的应用场景。在URL参数传递中,也常常使用Base64编码,但要避免包含特殊字符,通常会使用URL安全的Base64编码。

举个例子,假设我们要对字符串"Hello, World!"进行Base64编码,具体步骤如下:
1. 将字符串转换为字节数组:[72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33]
2. 将字节数组划分为3个字节一组:[72, 101, 108], [108, 111, 44], [32, 87, 111], [114, 108, 100], [33]
3. 对每个字节组进行Base64编码,得到对应的Base64字符序列:"SGVsbG8=", "bG9vLA==", "IFdvcmxk", "cmVsZA==", "IQ=="
4. 将这些Base64字符序列依次拼接起来,得到最终的Base64编码结果:"SGVsbG8sIFdvcmxkLCBIQ=="。

Base64编码可以通过多种编程语言提供的函数或库进行实现,常用的编程语言都内置了相应的Base64编码和解码方法,使其使用非常简单方便。

3.签名(Signature):签名是对头部和载荷进行数字签名的结果,用于验证令牌的完整性和真实性。签名通常使用密钥进行计算,确保只有持有正确密钥的服务器能够验证和解析JWT。签名的计算过程如下:

  • 将Base64编码的头部和载荷用英文句点(.)连接起来,形成一个待签名的字符串。
  • 使用约定的算法(如HMAC SHA256)和密钥对待签名字符串进行加密,生成签名。
  • 将签名添加到JWT的末尾,形成最终的JWT令牌。

使用JWT进行身份认证和授权的过程如下:

  1. 用户向服务器发送身份验证请求,提供用户名和密码。
  2. 服务器验证用户身份,如果通过验证,则根据用户信息生成一个JWT令牌,并将其返回给客户端。
  3. 客户端收到JWT令牌后,在每次请求时将其放入请求头或参数中发送给服务器。
  4. 服务器在接收到请求后,会验证JWT令牌的有效性和合法性,判断用户是否有权限执行相应的操作。

JWT的优点包括:

  • 轻量且自包含:JWT令牌携带了所有必要的信息,不需要服务端存储用户会话状态。
  • 分布式系统友好:由于无状态性质,JWT适用于分布式系统和多个服务之间的通信。
  • 扩展性强:可以根据需要在载荷中添加自定义的声明,满足各种业务需求。

使用JWT令牌需要注意以下几点:

  1. JWT令牌默认是通过Base64编码传输的,因此可能存在被篡改、解码或窃取的风险。对于敏感数据,应使用HTTPS等安全通道进行传输。
  2. JWT令牌一旦签发,无法撤销或更改过期时间。如果需要立即失效令牌,只能依赖服务端将其加入黑名单或者刷新密钥。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值