jwt鉴权

作者: 机智的老刘明同志 | 来源:发表于2019-07-28 11:11 被阅读0次

什么是JWT(Json web token):

       JWT是目前最流行的跨域认证解决方案。基于json的开放标准(RFC7用于519),以token的方式代替传统的session-cookie模式,用于服务器,客户端传递信息签名验证。

传统的cookie-session鉴权: 

        1. 客户端使用用户名和密码登录

        2. 服务器端验证账号密码通过后,在session里保存一些数据(比如说用户UID,登录时间等等)

        3. 服务器向用户返回一个session_id,写入用户的cookie中

        4. 此后用户的每一次请求都用 把cookie中的这个sessioni_d传给服务器

        5. 服务器接收到session_id 找到之前保存的数据就可以知道用户有没有登录

传统方式的缺点:

        1. session通常放在内存中,用户数量如果过大会对服务器产生压力

        2. 扩展性。 哪怕session以文件形式保存,放在redis中。对于分布式系统来说会产生高流量的数据读取(文件同步读取问题)

        3. 容易受到csrf攻击

JWT的验证方式:

        1. 客户端使用用户名和密码的方式请求登录

        2. 服务器验证账号和密码的真伪,如果通过后会返回一个token给客户端

        3. 客户端收到token之后缓存起来,比如放在浏览器中的Local Stage中,之后的每次请求都会携带token

        4. 服务器收到token之后,进行验证。通过验证则返回数据

JWT的优点:

        1. 服务器不用session了,变为无状态。减小了开支

        2. jwt构成简单,占用很少的字节

        3. json格式通用。不用语言之间都可以处理

JWT的结构:

jwt头部:

        {

            'typ': 'JWT',        // 这个token的类型:默认jwt,写死

            'alg': 'HS256'    // 签名的算法,默认是HMAC SHA256

        }

        然后将头部进行base64编码, 构成了第一部分:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

载荷payload:

        载荷也是一串json,用来存放实际需要传递的数据。他由三部分组成

        官方标准的字段声明(JWT规定了7个官方标准字段,非必填。为了紧凑。声明名称都是三个字符的缩写)

            iss: jwt签发者

            sub: jwt所面向的用户

            aud: 接收jwt的一方

            exp: jwt的过期时间,这个过期时间必须要大于签发时间

            nbf: 定义在什么时间之前,该jwt都是不可用的.

            iat: jwt的签发时间

            jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

        公共的字段声明

        私有的字段声明


        定义一个payload: (这里是不加密的,不要放敏感数据)

            {

                "user_name": "John Doe",

                "user_id": 10

            }

        BASE64后的结果: eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

签名signature:

        JWT的第三部分是一个签证(签名)信息,即对前两部分签名后得到的一个字符串。

        签名:使用密钥(SECRECT_KEY )对数据进行加密,得到了一个值(签名)。

        签名的作用:防止数据篡改,客户端传给服务器的jwt如果被修改过,服务器验签(校验)会不通过。

base64UrlEncode:

        Base64编码 使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。

        为了更好地在url上传递,=可以省略,+替换为- ,/替换为_

JWT的使用:

        1.http头部加上 Authorize:bearer  token

        2. 直接url后面通过一个get参数传递

JWT校验真伪:

        1. 服务器收到JWT

        2. 将header和payload 用秘钥和对应的算法生成签名

        3. 判断生成的签名和jwt的第三部分是否一致

        4. 一致则代表可信,不一致则返回错误

相关文章

  • JWT鉴权 Session鉴权

    JWT鉴权:image.png session鉴权:image.png

  • Koa 使用 JWT 实现鉴权

    JWT 鉴权的优势 JWT (JSON Web Token) 是现今比较主流的的登录鉴权方式。token 类似一个...

  • JWT 鉴权

    JWT 是什么 JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑且自包...

  • JWT 鉴权

    使用 koa-jwt + jsonwebtoken 完成用户鉴权功能。项目地址:https://github.co...

  • jwt鉴权

    什么是JWT(Json web token): JWT是目前最流行的跨域认证解决方案。基于json的开放标准(R...

  • 前端鉴权和缓存相关收藏

    Auth2鉴权 JWT cookie-session 缓存相关

  • JWT

    概述 JWT 基于 token 的鉴权机制,基于 token 的鉴权机制类似于 http 协议也是无状态的,它不需...

  • 鉴权

    常见的鉴权方式:Session/Cookie、Token(JWT)、OAuth、SSO Session/Cooki...

  • PHP中怎样使用JWT进行鉴权验证?

    1.概述 JWT可以取代以往的基于 COOKIE/SESSION 的鉴权体系,是目前最热门跨域鉴权的解决方案,接下...

  • 四、SpringCloud鉴权之OAuth2.0(中篇)

    鉴权(中篇) SpringSecurity + OAuth2 + JWT 前言 上篇 文章我们完成了SpringS...

网友评论

      本文标题:jwt鉴权

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