1.JWT是什么
JWT(JSON Web Token)是基于token
的鉴权机制类似于http
协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token
认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。
2.JWT认证流程
在前后端分离的项目中:前端将用户的登录信息发送给服务器;服务器接受请求后为用户生成独一无二的认证信息--token,传给客户端浏览器;客户端将token保存在cookie或者storage中;在之后访问客户端都携带这个token请求服务器;服务器验证token的值,如果验证成功则给客户端返回数据。服务器并不保存token。
3.JWT的构成
JWS是JWT的一种实现,除了JWS外,JWE(JSON Web Encryption)也是JWT的一种实现。JWE的生成过程较为复杂,虽保证了安全性,但是降低了访问效率,JWS实现方式分为三部分:头部(header),
载荷(payload
),签证(signature)。
头部(header): 声明类型,声明加密的算法
{
"alg": "HS256", //这里是jwt
"typ": "JWT" //通常直接使用 SHA256
}
载荷(payload):标准中注册的声明,公共的声明,私有的声明
{
"name": "XXX",
"time": XXX,
“email”:"xxx@gmail.com"
//这部分通常会加上token的有效时间
}
签证(signature):
签证由三部分组成,header和payload分别经base64Url(一种在base64上做了一点改变的编码)编码后由'.’连接,服务器生成秘钥(secret),连接之后的字符串在经header中声明的加密方式和秘钥加密,再用'.'和加密前的字符串连接。服务器验证token时只会验证第三部分。
header (base64Url)
.payload (base64Url)
.secret(header (base64Url)+payload (base64Url))
4.JWT如何保证安全
- 1.签证的第三段使用哈希散列的加密方式,不可逆,且秘钥只保存在服务器,较为安全。
- 2.在payload部分不应放入密码等敏感信息,因为base64
Url
可以解码。 - 3.将token的有效期设置的短一点。
- 4.使用HTTPS协议。
- 5.与Session cookie方式相比,session是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造(
CSRF
)的攻击