• 深入了解JWT以及JWT的执行机制


    1.JWT以什么样的形式存在?

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

    2.JWT的构成?

    第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).

    3.JWT的头部header

    jwt的头部承载两部分信息:

    • 声明类型,这里是jwt
    • 声明加密的算法 通常直接使用 HMAC SHA256

    如下列例子:然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.

    {
      'typ': 'JWT',
      'alg': 'HS256'
    }
    

    4.base64编解码

    echo 'abc' | base64  编码

    echo 'sdfsd==' | base64  -D  解码

    5.载荷(payload)就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分,将其进行base64位编码,然后形成第二部分。

    • 标准中注册的声明
    • 公共的声明
    • 私有的声明
    {
      "sub": "1234567890",
      "name": "John Doe",
      "admin": true
    }
    

    6.签证(signature)由三部分组成,经过base64位编码后的(header,payload,secret加密方式)

     这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

    // javascript
    var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
    
    var signature = HMACSHA256(encodedString, 'secret'); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
    

    注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。

    7.应用JWT

    一般是在请求头里加入Authorization,并加上Bearer

    fetch('api/user/1', {
      headers: {
        'Authorization': 'Bearer ' + token
      }
    })
    

    8.JWT验证流程

    (1)浏览器端(客户端)post/user/login + username and password 浏览器在登录表单中输入用户名密码进行登录操作。

    (2)服务器接收到了用户名密码后,利用secret加密方式生成一个JWT,

    (3)将该JWT返回给浏览器browser

    (4)浏览器接收到JWT之后,将JWT放在自己的请求头中,想服务器端请求数据

    (5)服务器端检查JWT的签证,获取到JWT中的payload中的声明信息

    (6)然后将请求的数据响应给浏览器

    9.JWT的优点

    • 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
    • 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
    • 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
    • 它不需要在服务端保存会话信息, 所以它易于应用的扩展

    10.JWT的注意事项

    • 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
    • 保护好secret私钥,该私钥非常重要。
    • 如果可以,请使用https协议
  • 相关阅读:
    appcan封装好的ajax,解决onDATA覆盖问题
    待研究
    mysql主从实验
    jQuery动态加载JS以减少服务器压力
    HTTP协议详解
    企业站收藏
    Linux查看程序端口占用情况
    大流量网站优化
    营销类网站
    Nginx (简体中文)
  • 原文地址:https://www.cnblogs.com/zxh1297/p/9356806.html
Copyright © 2020-2023  润新知