JWT实现鉴权

一、前言

        JWT全称JSON Web Token,是一种基于JSON的,用于在网络上声明某种主张的令牌(Token)。JWT通常由三部分组成:头信息(header)、消息体(payload)、签名(signature)。

       JWT实现鉴权_第1张图片

        头信息(Header)指定了该JWT使用的签名算法: 

header = '{"alg":"HS256","typ":"JWT"}'

HS256表明了使用HMAC-SHA256来生成签名。

       消息体(payload)包含了JWT的意图,比如userId、roleId、expireTime等。

       签名(Signature)是对前两部分的签名,防止数据篡改。签名首先需要指定1个秘钥(Secret),这个秘钥只有服务器才能知道,不能泄露给用户,然后使用Header里面指定的签名算法(默认是 HMAC SHA256),按照下面公式产生签名。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

算出签名之后, Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。  

二、为什么要用JWT 

       随着技术的发展,分布式Web应用的普及,通过Session管理用户登录状态成本越来越高因此慢慢发展为token的方式做登录身份校验,然后通过Token去取Redis中的缓存的用户信息,随着之后,JWT的出现,检验方式更加简单便捷化,无需通过Redis缓存,而是直接根据Token取出用户的信息,以及对Token的可用性校验,单点登录更加便捷。

                                    JWT实现鉴权_第2张图片

       登录之后,Client保存Token信息,比如用Angular的LocalStorage来保存Token信息。之后每次请求业务接口,把Token信息放到Http请求的Head里面。

三、JWT的使用方式

      客户端收到服务器返回的JWT,可以存储在Cookie里面,也可以存储在localstorage里面。

      此后,客户端每次与服务器通信,都要带上这个JWT,可以把它放在Cookie里面自动发送,但是这样不能跨域,所以更好的做法是放在HTTP请求头信息Authorization里面。

四、JWT特点

(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。

(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。

(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。

(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。

(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

你可能感兴趣的:(决战面试)