JSON Web Token(JWT)入门

本文是对 JSON Web Token(JWT)原理和用法的基本介绍。


目录

  • 简介
  • 原理
  • 数据结构
  • 使用方式
  • 特点
  • 附录

简介

JSON Web Token(JWT) 是基于 Token 技术的一种标准,是目前流行的跨域认证解决方案。


原理

服务端认证通过后生成一个 JSON 对象返回给客户端,后续客户端向服务端发起请求时都必须带上这个 JSON 对象,服务器只通过这个 JSON 对象便可确认客户端的身份。为了防止 Token 被篡改,服务端在生成 Token 时会加上签名。服务端不再保存任何 Session 数据,从而使得服务端实现了无状态,比较容易实现水平扩展。


数据结构

JWT 最终形态为一个长字符串,由三部分组成,以 . 分隔:Header.Payload.Signature

Header

Header(头部)是一个 JSON 对象,描述 JWT 的元数据。

{
   "alg": "HS256",
   "typ": "JWT"
}
  • alg:签名算法(algorithm)默认采用 HMAC SHA256(HS256)
  • typ:Token 类型,JWT Token 类型统一为 JWT
    最后将以上 JSON 对象使用 BASE64URL 算法编码成字符串。
Payload

Payload(负载)也是一个 JSON 对象,用于存放实际需要传递的数据。
JWT 规定了 7 个官方字段:

  • iss:issuer,签发人
  • exp:expiration time,过期时间
  • sub:subject,主题
  • aud:audience,受众
  • nbf:Not Before,生效时间
  • iat:Issued At,签发时间
  • jti:JWT ID,编号
    除官方字段外,可以自定义私有字段,如:
{
   "username": "admin"
}

注意:JWT 默认是不加密的,所以不要将敏感信息放在 Payload 中。
以上 JSON 对象也要使用 BASE64URL 算法编码成字符串。

Signature

Signature 是对 Header 和 Payload 的签名,防止被篡改。
首先需要一个只有服务端才知道的密钥,然后使用 Header 中指定的签名算法按照以下公式生成签名:

algorithm(base64url.encode(Header) + "." + base64url.encode(Payload), 密钥)

算出签名后,将 Header、Payload 和 Signature 三部分合并成一个字符串,每部分用 . 分隔后得到最终的 Token 返回给用户。


使用方式

服务端生成 JWT Token 后不存储直接返回给客户端,客户端收到后存储在 Cookie 或 LocalStorage 中,后续每个请求中都要带上这个 Token。
建议不要将 Token 放在 Cookie 中,不能解决跨域问题,建议放在 HTTP Header 的 Authorization 字段。


特点

  • JWT 默认不加密,也可以在 Token 生成后加密,不加密时不能放入敏感数据;
  • JWT 最主要用途是用于身份认证,但也可以用于信息交换;
  • JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该 Token 的所有权限。为了减少此风险,JWT 的有效期应该设置得比较短(考虑区分 access_token 和 refresh_token)。对于一些比较重要的权限,使用时应该再次对用户进行认证。

附录

参考:阮一峰 JSON Web Token 入门教程

你可能感兴趣的:(JSON Web Token(JWT)入门)