前端需要懂得的后端知识之JWT

2,494 阅读3分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

在大多数前后端分离的项目中,JWT 是常见的一个认证标准,特别适合用于分布式站点的单点登录场景。 JWT 全称是 JSON web token。是一种为了再网络应用中传递数据而创造的一种开放标准。在 JWT 之前,大多数的 web 应用是采用 session 认证的,前后端分离开发成为主流之后,JWT 也就登上了舞台。

基于 Token 的鉴权

token 的鉴权机制是无状态的,它不需要考虑用户在那一台服务器登录,因此也就不需要在服务器中保留用户的认证信息,减少服务器的压力,也提供了扩展的便利。 当用户提交用户名和密码到服务器,服务器校验用户信息并通过后,便会返回一段字符串——token,用户后续的请求中,携带上这个 token 完成认证并返回数据。JWT 既采用的这种鉴权方式。

JWT 的基础构成

一段 JWT 字符串包含三部分,分别是headerpayloadsignature,头部、载荷和签名。

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 也是最佳的方式,可以利用公钥和私钥对,可以确保数来源的安全性,以及防止内容被篡改。

欢迎阅读其它文章