JWT(JSON WEB TOKEN)是基于RFC 7519标准定义的一种可以安全传输的小巧和自包含的JSON对象。由于数据是使用数字签名的,所以是可信任的和安全的。JWT可以使用HMAC算法对secret进行加密或者使用RSA的公钥私钥对来进行签名。

JWT通常由头部(Header),负载(Payload),签名(Signature)三个部分组成,中间以.号分隔,其格式为Header.Payload.Signature

Header:声明令牌的类型和使用的算法

  • alg:签名的算法

  • typ:token的类型,比如JWT

Header   eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
Payload eyJpc3MiOiJnZXJyeV91c2VyIiwibmFtZSI6IueJp-eggeS6uuaVmeiCs
iIsImV4cCI6MTU5MDU4NTc1OCwidHlwZSI6IjIiLCJlbWFpbCI6IjI3MTMxNDk5OEB
xcS5jb20iLCJtYXJrIjoiZ2VycnkiLCJ0cyI6IjE1OTA0OTkzNTgifQ
Signature ZQba2qY0Q9AzdnmV850Xr1QdOFexLxRrb5qa66mOvZo

Payload:也称为JWT Claims,包含用户的一些信息

系统保留的声明(Reserved claims):

  • iss (issuer):签发人

  • exp (expiration time):过期时间

  • sub (subject):主题

  • aud (audience):受众用户

  • nbf (Not Before):在此之前不可用

  • iat (Issued At):签发时间

  • jti (JWT ID):JWT唯一标识,能用于防止JWT重复使用

公共的声明(public):见 http://www.iana.org/assignments/jwt/jwt.xhtml

私有的声明(private claims):根据业务需要自己定义的数据

ImmutableMap.of("name",
returnUser.getName(), "email", returnUser.getEmail(),
"type",returnUser.getType()+"","ts", Instant.now().getEpochSecond() + "", "mark", "gerry")

Signature:签名

签名格式: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

JWT的特点:

  • JWT默认是不加密的,不能把用户敏感类信息放在Payload部分。

  • JWT 不仅可以用于认证,也可以用于交换信息。

  • JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。

  • JWT本身包含认证信息,为了减少盗用,JWT的有效期不宜设置太长。

  • 为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。

  • 首次生成token比较慢,比较耗CPU,在高并发的情况下需要考虑CPU占用问题。

  • 生成的token比较长,可能需要考虑流量问题。

  • oauth2

认证原理:

  • 客户端向服务器申请授权,服务器认证以后,生成一个token字符串并返回给客户端,此后客户端在请求受保护的资源时携带这个token,服务端进行验证再从这个token中解析出用户的身份信息。

JWT的使用方式:一种做法是放在HTTP请求的头信息Authorization字段里面,格式如下:

Authorization: <token>

需要将服务器设置为接受来自所有域的请求,用Access-Control-Allow-Origin: *

另一种做法是,跨域的时候,JWT就放在POST请求的数据体里面。

对JWT实现token续签的做法:

1、额外生成一个refreshToken用于获取新token,refreshToken需存储于服务端,其过期时间比JWT的过期时间要稍长。

2、用户携带refreshToken参数请求token刷新接口,服务端在判断refreshToken未过期后,取出关联的用户信息和当前token。

3、使用当前用户信息重新生成token,并将旧的token置于黑名单中,返回新的token。

JWT对SpringCloud进行认证和鉴权的更多相关文章

  1. Java架构笔记:用JWT对SpringCloud进行认证和鉴权

    写在前面 喜欢的朋友可以关注下专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. image.png JWT(JSON WEB TOKEN)是基于RF ...

  2. spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法

    spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...

  3. Tomcat 容器的安全认证和鉴权

    大量的 Web 应用都有安全相关的需求,正因如此,Servlet 规范建议容器要有满足这些需求的机制和基础设施,所以容器要对以下安全特性予以支持: 身份验证:验证授权用户的用户名和密码 资源访问控制: ...

  4. 深入理解k8s中的访问控制(认证、鉴权、审计)流程

    Kubernetes自身并没有用户管理能力,无法像操作Pod一样,通过API的方式创建/删除一个用户实例,也无法在etcd中找到用户对应的存储对象. 在Kubernetes的访问控制流程中,用户模型是 ...

  5. shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃

    这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...

  6. web系统认证与鉴权中的一些问题

    认证鉴权系统的初心: 空间管理: 1.他是谁? 他登陆了没有? 2.他要做什么? 2.1 他要使用什么功能? 他是否有这个功能的权限. 2.2 他要使用这个功能做什么操作? 他是否有这个功能的这个操作 ...

  7. springcloud zuul shiro网关鉴权并向服务传递用户信息

    1.pom文件 <dependencies> <!--eureka客户端--> <dependency> <groupId>org.springfram ...

  8. 白话OAuth2用户认证及鉴权标准流程

    一.OAuth2需求场景 在说明OAuth2需求及使用场景之前,需要先介绍一下OAuth2授权流程中的各种角色: 资源拥有者(User) - 指应用的用户 认证服务器 (Authorization S ...

  9. 【Python】Django用户、认证、鉴权模块使用

    此文是总结Django官方网站里面的Document的文章 User authentication in Django http://www.djangoproject.com/documentati ...

  10. 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权

    一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ...

随机推荐

  1. golang开发_goroutine在项目中的使用姿势

    很多初级的Gopher在学习了goroutine之后,在项目中其实使用率不高,尤其一些跨语言过来的人,对并发编程理解不深入,可能很多人只知道go func(),或者掌控不够,谨慎一些,尽量少使用或者不 ...

  2. Mac根目录下无法创建文件或目录

    无法创建目录 最近小伙伴经常反馈Mac根目录下创建文件或目录一直失败,并且尝试了各种姿势. 常见错误如下: # 常见错误1, 直接创建目录 mkdir -p /test mkdir: /data: R ...

  3. 【预训练语言模型】BERT原理解析、常见问题和微调实战

    一.BERT原理 1.概述        背景:通过在大规模语料上预训练语言模型,可以显著提高其在NLP下游任务的表现.        动机:限制模型潜力的主要原因在于现有模型使用的都是单向的语言模型 ...

  4. TornadoFx中的css美化

    原文地址:TornadoFx中的css美化 - Stars-One的杂货小窝 TornadoFx中使用类重新对css进行了封装,所以可以用代码的形式来书写样式 说明 除了Text,其他的若是要修改文字 ...

  5. python学习笔记(3):模块

    模块 一个.py文件就是一个模块,模块可以包含在包(package)内.包内必须有一个__init**__**.py,包也可以多层嵌套.__init__.py也是一个模块,模块名就是包名. 当用命令行 ...

  6. C++ 调用 Python 总结(一)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  7. Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.Object.defineProperty 定义:Object.defineProperty() 方法会直接在一个对象上定义一个新属性 ...

  8. 说说你对vue的mixin的理解,有什么应用场景?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.mixin是什么 Mixin是面向对象程序设计语言中的类,提供了方法的实现.其他类可以访问mixin类的方法而不必成为其子类 Mixi ...

  9. 记录-VueJs中如何使用Teleport组件

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在DOM结构相对比较复杂,层级嵌套比较深的组件内,需要根据相对应的模块业务处理一些逻辑,该逻辑属于当前组件 但是从整个页面应用的视图上看, ...

  10. 从零开始写 Docker(九)---实现 mydocker ps 查看运行中的容器

    本文为从零开始写 Docker 系列第九篇,实现类似 docker ps 的功能,使得我们能够查询到后台运行中的所有容器. 完整代码见:https://github.com/lixd/mydocker ...