文章目录
- 前言
- 什么是jwt
- jwt的结构
- Header
- Payload
- Signature
- 小结
前言
前段时间有个朋友来问我登录相关的问题,正好回顾了一下之前使用到的jwt token,趁此机会整理一下相关内容。
什么是jwt
jwt全称是json web token,那要想了解什么是jwt首先要了解什么是token。
token是一种登录验证方式,使用token做身份认证时,可以确保服务器不会储存用户的登录记录,token登录过程如下
(1)客户端使用用户名跟密码请求登录;
(2)服务端收到请求,去验证用户名与密码;
(3)验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端;
(4)客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;
(5)客户端每次向服务端请求资源的时候需要带着服务端签发的 Token;
(6)服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。
那么接下来就可以了解什么是jwt了。
json web token(JWT)是一个开放标准(rfc7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以JSON对象安全地传输信息。它是以JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输。在数据传输过程中还可以完成数据加密、签名等相关处理。
而使用jwt很符合resetful api的设计理念,即无状态。
jwt的结构
jwt由三部分组成,每部分之间用.分隔,分别为
1、Header
2、Payload
3、Signature
Header
header示例如下:
{
“alg”: “HS256”,
“typ”: “JWT”
}
header由两部分组成,typ代表令牌的类型,也就是jwt,alg代表签名算法,常用的有hs256和rs256,分别代表HMAC和RSA
Payload
我认为Payload是jwt中最核心的部分,其代表了有效负载/声明,是关于实体(通常是用户)和附加数据的陈述。 分为三种类型:registered, public, private claims.
注册(registered)声明:这是一组预定义的声明,不是强制性的,但建议使用。以提供一组有用的、可互操作的声明。比如:iss(发行人)、exp(到期时间)、sub(主题)、aud(受众)等。
公共(public)声明:这些可以由使用人随意定义。 但是为了避免冲突,应该在 IANA JSON Web Token Registry 中定义,或者定义为包含抗冲突命名空间的 URI。
私有(private)声明:这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公共声明。
例如:
{
“exp”: “1664505235”,
“name”: “Charles Wu”,
“admin”: true
}
Signature
要创建签名部分,必须获取已编码的标头(header)、编码的有效负载(payload)、密钥、header中指定的算法,并对其进行签名。
签名用于验证信息在传输过程中是否被篡改,并且在使用私钥签名令牌的情况下,它还可以验证 JWT 的发送者是否正确。
小结
jwt其实生成和验证并不复杂,关键在于理解三个组成的概念。