- JWT的介绍
JWT(JSON Web Token)是一种用于身份验证和授权的开放标准。它由三部分组成,以点号分隔:“Header”、“Payload”和“Signature”组成。
- Header(头部):包含了两个部分,即令牌的类型(通常是JWT)和所使用的签名算法(如HMAC、SHA256或RSA)。它使用Base64编码进行序列化。
- Payload(负载):包含了一些称为声明(Claims)的信息,用于描述用户、角色和其他相关数据。有三种类型的声明:
- Registered Claims(注册声明):这些是一些预定义的声明,包括iss(签发者)、sub(主题)、aud(受众)、exp(过期时间)和nbf(生效时间)等。
- Public Claims(公共声明):这些是用户自定义的声明,可以根据需要添加。
- Private Claims(私有声明):这些也是用户自定义的声明,但是为了避免冲突,需要定义一个命名空间,以确保不同的声明互不干扰。
- Payload也使用Base64编码进行序列化。
- Signature(签名):使用指定的算法和密钥对头部和负载进行加密生成的签名。该签名用于验证传输过程中令牌是否被篡改。
- JWT的工作流程
工作流程如下:
- 用户通过前端的Web表单将自己的用户名和密码发送到后端的接口进行身份验证。
- 服务器根据用户提供的凭证验证用户的身份,将包含用户信息的数据作为JWT的Payload,将其与JWT Header分别进行Base64编码拼接后签名,形成一个JWT Token。
- 后端服务器将JWT Token字符串作为登录成功的结果返回给前端。
- 前端在每次请求中都需要在请求头或请求参数中带上JWT,一般放在HTTP请求头中的Authorization属性中。
- 服务器验证JWT的签名和有效期,验证其有效性,比如签名是否正确、请求是否国企。
- 如果验证通过,服务器可以根据JWT中的声明授权用户访问相应的资源。
- JWT的优点
- JWT是一种轻量级的认证方案,因为它使用JSON进行数据传输。
- JWT是无状态的,服务器不需要在后端存储会话信息,减轻了服务器的负担。
- JWT可以被广泛支持,因为它是一个开放的标准。
- 通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。
- JWT的缺陷
- 由于JWT在负载中携带了用户信息,因此不适合在负载中存储敏感信息,如密码。
- 由于JWT的所有信息都存储在客户端,当令牌被盗用时,服务器无法主动废止令牌,除非使用黑名单等额外措施。
- JWT令牌较长,占存储空间比较大。