zoukankan      html  css  js  c++  java
  • 什么是JWT?原理是什么?

    什么是JWT

    JWT 是Json Web Tokens的简称。用百度上面的解释讲,是目前流行的跨域认证解决方案,一种基于JSON的、用于在网络上声明某种主张的令牌(token)。

    JTW原理

    jwt验证方式是将用户信息通过加密生成token,每次请求服务端只需要使用保存的密钥验证token的正确性,不用再保存任何session数据了,进而服务端变得无状态,容易实现拓展。

    比如加密前的信息:

    {
        "username": "vist",
        "role": "admin",
        "expire": "2020-11-06 15:14:20"
    }
    

    加密后:

    6gdfg7af816b907f2cc9acbe9c3b4625
    

    JWT 结构


    三部分用“.”隔开。如下

    edsfdfsdffdssdfR5cCI6IkpXVCJ9.ekgjfdsdfgrMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.Sfdsgdfgsdfgf36POk6yJVfgsd4treh5hdfs
    
    

    头部

    头部通常由令牌的类型(typ)和签名的算法(alg)组成。一般使用base64编码。

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

    这里有个点可以说一下,这个typ类型是媒介类型(Media Type),可以认为是媒介类型、介质类型、设备类型等等都可以,用户可以根据令牌类型做不同的操作。举个例子有个项目是移动端端和PC端。那么这里就可以设置typ为移动或PC的。

    载荷

    载荷是数据的主体部分。一般使用base64编码。

    可以使用JWT官方推荐字段:

    iss: 签发者
    sub: 主题
    aud: 接收者
    exp(expires): 过期时间
    iat(issued at): 签发时间
    nbf(not before): 早于某个时间不处理
    jti(JWT ID): 唯一标识
    

    也可以使用自定义字段

    {
        "username": "vist",
        "role": "admin"
    }
    

    主体部分可添加非敏感数据

    这里就有个问题了,那什么是敏感数据。例如:用户的余额、用户的密码、用户的隐私数据(女性的年龄)等等都可以是敏感的数据。而非敏感数据则是你可以公开出去的数据。

    {
      "iss": "我是大哥",
      "sub": "审批",
      "aud": "牛逼",
      "userName": "大哥大",
      "approve":"通过",
      "iat":"1597000000",
      "exp": 1597223455
    }
    

    签名

    签名部分是对前两部分(头部,载荷)的签名,防止数据篡改。

    按下列步骤生成:
    1、先指定密钥(secret)
    2、把头部(header)和载荷(payload)信息分别base64转换
    3、使用头部(header)指定的算法加密

    最终:

    HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), "密钥/盐");
    

    通过算法加密后的结果就是签名。

    头部和载荷都用base64编码不怕被解码获取吗?

    其实不用担心。因为头部和载荷的信息都是非敏感信息,可以公开的,即使拿到token,也只能解析出非敏感的数据,并不能拿到敏感数据。

    同时篡改头部或者载荷的数据是不可能通过校验的。

    因为检验token的时候会将【头部.载荷】进行加密然后和签名比较。而签名是由 [头部数据.载荷数据]经过算法加密生成的。也就是说,篡改了就无法通过校验了。

    JWT特点总结

    JWT更加简洁,更适合在HTML和HTTP环境中传递。,但更建议JWT建议使用HTTPS协议来传输代码。

    JWT适合一次性验证,如:激活邮件

    JWT适合无状态认证

    JWT适合服务端CDN分发内容

    相对于数据库Session查询更加省时

    跨域认证需要做Session共享,而使用了JWT则不需要。因为只要其他服务器只要是使用同一套算法,就可以做信息的校验。

    JWT默认不加密

    使用期间不可取消令牌或更改令牌的权限

  • 相关阅读:
    循环的中断
    创建.NET应用程序所经历的步骤
    完整的开发一个ContentProvider步骤
    Perl 基于OOP的数据库链接(增删改查)
    Perl 基于OOP的数据库链接(优化)
    Perl 基于OOP的数据库链接
    Perl oop链接数据库
    Perl oop研究
    PythonStudy——内存管理机制 Memory management mechanism
    博客园美化——Design by Venti
  • 原文地址:https://www.cnblogs.com/qinjunlin/p/13936971.html
Copyright © 2011-2022 走看看