JWT对SpringCloud进行系统认证和服务鉴权

原创 2018年04月15日 22:47:23
JWT对SpringCloud进行系统认证和服务鉴权

一、为什么要使用jwt?
在微服务架构下的服务基本都是无状态的,传统的使用session的方式不再适用,如果使用的话需要做同步session机制,所以产生了了一些技术来对微服务架构进行保护,例如常用的鉴权框架Spring Security OAuth2和用Jwt来进行保护,相对于框架而言,jwt较轻,且可以自包含一些用户信息和设置过期时间,省去了Spring Security OAuth2繁琐的步骤。

二、什么是JWT?
jwt(JSON WEB TOKEN)是一种用来在网络上声明某种身份的令牌(TOKEN),它的特点是紧凑且自包含并且基于JSON,通过一些常用的算法对包含的主体信息进行加密,安全性很高。它通常有三个部分组成:头信息(Header),消息体(Payload),签名(Signature)。
Header通常用来声明令牌的类型和使用的算法,Payload主要用来包含用户的一些信息,Signature部分则是将Base64编码后的Header和Payload进行签名。

三、在Spring Cloud 下如何使用 jwt?
在SC(Spring Cloud简称,以下将都采用这种方式)下通常使用需要安全保护的有两处,分别为系统认证和服务内部鉴权。
1系统认证
(1)基本流程
jwt基本使用方式如下图

用户在提交登录信息后,服务器校验数据后将通过密钥的方式来生成一个字符串token返回给客户端,客户端在之后的请求会把token放在header里,在请求到达服务器后,服务器会检验和解密token,如果token被篡改或者失效将会拒绝请求,如果有效则服务器可以获得用户的相关信息并执行请求内容,最后将结果返回。
在微服务架构下,通常有单独一个服务Auth去管理相关认证,为了安全不会直接让用户访问某个服务,会开放一个入口服务作为网关gateway,只允许外网网关,所有请求首先访问gateway,有gateway将请求路由到各个服务,spring cloud下通常使用zuul来实现网关,整个基本过程如下图所示

客户端请求网关后,网关会根据路径过滤请求,是登录获取token操作的路径则直接放行,请求直接到达auth服务进行登录操作,之后进行JWT私钥加密生成token返回给客户端;是其他请求将会进行token私钥解密校验,如果token被篡改或者失效则直接拒绝访问并返回错误信息,如果验证成功经过路由到达请求服务,请求服务响应并返回数据。
(2)如何实现登录、刷新、注销等?
登录比较简单,在验证身份信息后可以使用工具包例如jjwt根据用户信息生成token并设置有效时长,最后将token返回给客户端存储即可,客户端只需要每次访问时将token加在请求头里即可,然后在zuul增加一个filter,此filter来过滤请求,如果是登录获取token则放行,其他的话用公钥解密验证token是否有效。
如果要实现刷新,则需要在生成token时生成一个refreshKey,在登录时和token一并返回给客户端,然后由客户端保存定时使用refreshKey和token来刷新获取新的有效时长的token,这个refreshKey可自定义生成,为了安全起见,服务器可能需要缓存refreshKey,可使用redis来进行存储,每次刷新token都将生成新的refreshKey和token,服务器需要将老refreshKey替换,客户端保存新的token和refreshKey来进行之后的访问和刷新。
如果要实现注销,并使得旧的token即便在有效期内也不能通过验证,则需要修改登录、刷新、和优化zuul的filter。首先在登录时生成token和refreshKey后,需要将token也进行缓存,如果通过redis进行缓存可以直接放一个Set下,此Set存储所有未过期的token。其次,在刷新时在这个Set中删除旧的token并放入新的。最后对zuulFilter进行优化,在解密时先从redis里存放token的Set查找此token是否存在(redis的Set有提供方法),如果没有则直接拒绝,如果有再进行下一步解密验证有效时长,验证有效时长是为了防止刷新机制失效、没有刷新机制、网络异常强行退出等事件出现,在这种情况下旧的token没有被删除,导致了旧的token一直可以访问(如果只验证是否token是否在缓存中)。在注销时只需要删除redis中Set的token记录就好,最后写个定时器去定时删除redis中Set里面过时的token,原因也是刷新机制失效、没有刷新机制、网络异常强行退出等事件出现导致旧的token没有被删除。

四、JWT存在的问题
jwt第一次生成token 的时候会比较慢,而且因为采用了加密算法保证安全,所以比较耗CPU,在高并发的情况下需要考虑CPU占用问题。还有一个问题,jwt生成的token比较长,可能需要考虑流量问题。

spring cloud jwt用户鉴权及服务鉴权

用户鉴权 客户端请求服务时,根据提交的token获取用户信息,看是否有用户信息及用户信息是否正确 服务鉴权 微服务中,一般有多个服务,服务与服务之间相互调用时,有的服务接口比较敏感,比如资金服务...
  • luwei42768
  • luwei42768
  • 2018-02-11 20:23:33
  • 333

一起来学SpringCloud之 - 服务认证(JWT)

上一篇已经讲了微服务组件中的 路由网关(Zuul),但是未介绍服务认证相关,本章主要讲解基于Spring Security 与 JJWT 实现 JWT(JSON Web Token)为接口做授权处理…...
  • memmsc
  • memmsc
  • 2017-09-28 14:02:25
  • 7651

JWT如何在Spring Cloud微服务系统中在服务相互调时传递

转载请标明出处: http://blog.csdn.net/forezp/article/details/78676036 本文出自方志朋的博客 在微服务系统中,为了保证微服务...
  • forezp
  • forezp
  • 2017-11-30 14:42:07
  • 12351

spring cloud放弃系列之--5-jwt

是什么干嘛用怎么用
  • chenjianandiyi
  • chenjianandiyi
  • 2017-05-16 14:00:35
  • 2219

微服务架构中的安全认证与鉴权

从单体应用架构到分布式应用架构再到微服务架构,应用的安全访问在不断的经受考验。为了适应架构的变化、需求的变化,身份认证与鉴权方案也在不断的变革。面对数十个甚至上百个微服务之间的调用,如何保证高效安全的...
  • Michael_HM
  • Michael_HM
  • 2017-08-11 17:25:25
  • 5512

JWT认证 鉴权

JWT认证 鉴权
  • gaowenhui2008
  • gaowenhui2008
  • 2017-11-01 10:31:49
  • 422

第八章 SpringCloud Oauth2认证中心-基于JWT认证

本章完整源码地址:https://github.com/kwang2003/springcloud-study-ch08.git 1.项目概要 这一章节的内容以第七章的代码为基础改造而成h...
  • CrazyCoder2010
  • CrazyCoder2010
  • 2017-11-08 17:48:13
  • 3377

Spring Cloud权限认证实战

了解Oauth2.0、Jwt鉴权原理,掌握Jwt实战开发; 掌握服务之间鉴权原理,实现服务内部鉴权; 前后端分离下Jwt认证实现(vue示例); 前后端分离用户api权限设计与实现。
  • 2017年09月08日 10:07

Spring Cloud与微服务学习总结(3)——认证鉴权与API权限控制在微服务架构中的设计与实现(一)

本文转载自(http://blueskykong.com/2017/10/19/security1/)1. 背景最近在做权限相关服务的开发,在系统微服务化后,原有的单体应用是基于session的安全权...
  • u012562943
  • u012562943
  • 2017-10-28 09:41:44
  • 1264

springcloud整合oauth2和jwt

  • 2018年04月09日 20:13
  • 241KB
  • 下载
收藏助手
不良信息举报
您举报文章:JWT对SpringCloud进行系统认证和服务鉴权
举报原因:
原因补充:

(最多只允许输入30个字)