美文网首页
JSON Web Token(JWT)入门

JSON Web Token(JWT)入门

作者: 又语 | 来源:发表于2020-04-14 16:00 被阅读0次

    本文是对 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)入门

          本文链接:https://www.haomeiwen.com/subject/nohtvhtx.html