https>https://img-blog.csdnimg.cn/f86536c2d1c742988807d98f20aee6a6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5piv5bm05bCR55qE5qyi5ZacX2xpdQ==,size_16,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" />
Q:一句话概述Jwt?
A:在开发API时,为了防止API被非法调用,会引入参数签名。最简单的参数签名就是把各种参数拼接成字符串,再加一个密钥,最后做一个MD5签名。只要请求来的签名不符就可以认为签名被恶意篡改过。Jwt就是把这件事规范下来了。Jwt的Header部分说明如何进行签名,payload部分就是参数,signature部分就是签名。然后为了URL安全,把整个数据做base64即可。
Q:Jwt的好处?
A:可以使服务器免于存储Session的压力,同时在集群环境下,也免除了Session需要同步的烦恼;
Q:Jwt的认证流程?
https>https://img-blog.csdnimg.cn/img_convert/f864b191eeaed4503883665915bbaa56.webp?x-oss-process=image/format,png" alt="img" />
Q:Jwt与Session Cookie的区别?
A:Jwt验证方式中,Jwt即扮演cookie的角色。客户端在需要身份认证的时候则传回Jwt,区别在于服务器端,此时的服务端不需要通过Session来获取身份信息,而是直接提取Jwt中的信息。也就是说Jwt并不是一个简单的Token,而是可以把信息(Json格式)编码进去的数据。服务器验证签名相符则表示可以使用其携带的数据,否则认证失败。因为信息编码在Jwt中,所以可以免去Session查询的消耗。
而Jwt中的数据需要通过对比签名来确保正确,签名需要的密钥只能存在服务器端。把Jwt的下发和验证逻辑都在服务端处理,这是保证安全的关键。
Q:Jwt的组成部分
A:
- 头部(header)
{
"alg" : "AES256",
"typ" : "JWT"
}
alg声明使用哪种Hash算法。
- 荷载(payload)
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
payload也就是Jwt中携带的数据。
- 签名(signature)
签名是Jwt认证的安全核心。因为Base64编码基本等于公开,也很容易被篡改。如何保证可信,那就在签名上面。签名是header、payload和一个密钥产生的哈希值。纵然前面的数据容易被篡改,可是如果不知道签名的密钥则很难保证签名正确。
几个安全要点
- 不要假如敏感信息在payload中,因为base64可以无障碍解码
- 密钥一定要管理好,只能存在服务器。因为安全的核心在签名,签名的核心在密钥
- payload中加入过期时间。因为服务器不存储状态。所以无法判断其有效期。
参考:
JWT(JSON Web Token) 原理简析