这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战
在大多数前后端分离的项目中,JWT 是常见的一个认证标准,特别适合用于分布式站点的单点登录场景。 JWT 全称是 JSON web token。是一种为了再网络应用中传递数据而创造的一种开放标准。在 JWT 之前,大多数的 web 应用是采用 session 认证的,前后端分离开发成为主流之后,JWT 也就登上了舞台。
基于 Token 的鉴权
token 的鉴权机制是无状态的,它不需要考虑用户在那一台服务器登录,因此也就不需要在服务器中保留用户的认证信息,减少服务器的压力,也提供了扩展的便利。 当用户提交用户名和密码到服务器,服务器校验用户信息并通过后,便会返回一段字符串——token,用户后续的请求中,携带上这个 token 完成认证并返回数据。JWT 既采用的这种鉴权方式。
JWT 的基础构成
一段 JWT 字符串包含三部分,分别是header
、payload
和signature
,头部、载荷和签名。
header 头部
JWT 的头部包含两部分信息,一个是类型,一个是加密的算法名称。完整的格式是如下的格式:
{
'type': 'JWT',
'alg': 'HS256'
}
将上面的数据进行 base64 处理,得出一个完整的 header。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
payload 载荷
可以简单的理解为携带的一些公共和私有的声明,包含三部分内容:
- 标准中注册的声明
- 公共的声明
- 私有的声明
标准中注册的声明
这个声明可以包含以下信息,建议包含,但不强制使用:
- iss: JWT 签发者
- sub: JWT 所面向的用户
- aud: 接收 JWT 的一方
- exp: JWT 的过期时间,这个过期时间必须要大于签发时间
- nbf: 定义在什么时间之前,该jwt都是不可用的
- iat: JWT 的签发时间
- jti: JWT 的唯一身份标识,主要用来作为一次性 token,从而回避重放攻击。
公共的声明
公共的声明相当于是你想添加的任何自定义信息,一般是一些与用户有关的辅助信息,因为这一部分的字符是可以被解密的,因此不建议添加敏感数据。
私有的声明
私有的声明是提供者和消费者所共同定义的信息,同样也不建议添加敏感数据。
signature 签名
这一部分是将前面 base64 处理后的 header 和 payload 使用点连接,并使用 header 中声明的加密方式加密。由此构成了 JWT 的第三部分。
何时应该使用 JWT
Authorization (授权) :
当用户登录之后,后续每个请求都将包含 JWT,一般将 JWT 信息在请求头部携带。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
Information Exchange (信息交换)
在各个应用之间传输数据,JWT 也是最佳的方式,可以利用公钥和私钥对,可以确保数来源的安全性,以及防止内容被篡改。