jwt实现token认证

3.1 jwt令牌

JWT全称:JSON Web Token,用于客户端和服务器之间传递安全可靠的信息,本质是一个token,也叫token,令牌的本质就是一个字符串。相当于现在人们的身份证,出门在外验证身份的时候,拿出身份证即可。

3.2 使用jwt令牌时

用户登录 : 用户登录请求,经过负载均衡,把请求发给服务器1,服务器1进行账号密码验证,验证成功之后,生成一个令牌,并返回给客户端。

客户端收到令牌时,把令牌存储起来,可以存储在Cookie中,也可以存储在其它的存储空间,典型的如(localStorage)

查询操作 用户登录之后,携带令牌继续执行查询操作,假如查询博客列表,此时请求经过负载均衡发到服务器2,服务器2先进行权限验证操作。服务器验证令牌是否有效,如果有效,说明用户已经执行了登录操作,如果无效,说明用户之前未执行登录操作。

3.3 令牌的组成

令牌官网所示,token,本质上一个字符串中间使用 符号 点 . 来分割,令牌由三部分组成,header头部(标题包含了令牌的元数据,并且包含签名和/或加密算法的类型)、payload负载 (类似于飞机上承载的物品)和verify signature签名/签证。

3.3.1Header

JWT的头部承载两部分信息:token类型和采用的加密算法。

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

声明类型:这里是jwt

声明加密的算法:通常直接使用 HMAC SHA256

3.3.2 Payload

载荷就是存放有效信息的地方。

  • 标准中注册的声明 (建议但不强制使用) :

iss: jwt签发者

sub: 面向的用户(jwt所面向的用户)

aud: 接收jwt的一方

exp: 过期时间戳(jwt的过期时间,这个过期时间必须要大于签发时间)

nbf: 定义在什么时间之前,该jwt都是不可用的.

iat: jwt的签发时间

jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

  • 自定义字段(最常用)

    可以根据自己的业务加任何字段,比如:

    {
      "userId": 12345,
      "username": "alice",
      "role": "admin"
    }
    ​

    这类信息就可以让前后端都知道这个 token 是谁的、权限是什么。

那别人可以怎么改 payload?

{
  "userId": 123,
  "role": "user"
}
​

攻击者可能会改成:

{
  "userId": 123,
  "role": "admin"
}
​

然后重新拼接 Header 和 Payload,自己生成新的 JWT。但他签不出来!

攻击者即使改了 Payload,但没有你的私钥(或密钥),就没法生成有效签名,服务器会识别出签名不一致,拒绝该 token。

🧠 重要提示:

  • Payload 是明文,任何人拿到 token 都可以解码看到这些内容。

  • 不要把敏感数据(如密码、手机号、身份证号)放进去!

3.3.3 签名

签名实际上是一个使用私钥加密的过程,是对上面两部分数据通过指定的算法生成哈希,以确保数据不会被篡改。

  • 签名(Signature)是怎么生成的?

以 HMAC-SHA256 为例,签名的生成步骤如下:

1. 将 Header 和 Payload 分别进行 base64url 编码;
2. 拼接字符串:base64url(Header) + "." + base64url(Payload);
3. 使用某种算法(比如 HMAC-SHA256)+ 密钥对上述字符串进行加密;
4. 得到签名字符串(Signature)。
signature = HMAC_SHA256(secret, base64url(header) + "." + base64url(payload))
​

签名的作用:

  • 防篡改:验证 Token 是否被人修改。只要有人改了 payload 中的内容,签名就会不一致,服务器验证失败。

  • 验证身份:服务器用同样的密钥重新计算签名,看是否和 token 中的签名一致。

⚠️ 需要注意:JWT 本身并不加密,只是签名,不要在 Payload 放敏感信息。签名的本质:保证 payload 的完整性和可信度,不是加密!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值