JWT鉴权
一、HTTP基本认证
Basic Authentication——当浏览器访问使用基本认证的网站的时候, 浏览器会提示你输入用户名和密码。
http auth的过程:
客户端发送http请求
服务器发现配置了http auth,于是检查request里面有没有"Authorization"的http header
如果有,则判断Authorization里面的内容是否在用户列表里面,Authorization header的典型数据为"Authorization: Basic jdhaHY0=",其中Basic表示基础认证, jdhaHY0=是base64编码的"user:passwd"字符串。
如果没有,或者用户密码不对,则返回http code 401页面给客户端
标准的http浏览器在收到401页面之后,应该弹出一个对话框让用户输入帐号密码;并在用户点确认的时候再次发出请求,这次请求里面将带上Authorization header
一次典型的访问场景是:浏览器发送http请求(没有Authorization header)
服务器端返回401页面
浏览器弹出认证对话框
用户输入帐号密码,并点确认
浏览器再次发出http请求(带着Authorization header)
服务器端认证通过,并返回页面
浏览器显示页面
项目举例
wordpress api 创建文章,返回401.
1、安装鉴权插件Application Passwords
admin登录——工具——上传插件(.zip)
用户——详情——Application Passwords——创建用户名(即该用户的名称)生成密码,记得保存下来。
2、xshell连接服务器
输入命令
echo -n "test001:123456" | base64
3、打开jmeter
Ctrl+0:线程组(作者)
Ctrl+1:HTTP请求(创建文章)
添加配置文件——HTTP Headers Manager
添加参数
Authorization:Basic空格Authorization
运行脚本,成功。
二、JWT鉴权
JWT是一种token based auth的标准。
JWT全称JSON Web Token,是一种基于JSON的,用于在网络上声明某种主张的令牌(Token)。JWT通常由三部分组成:头信息(header)、消息体(payload)、签名(signature)。
头信息(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的可用性校验,单点登录更加便捷。
登录之后,Client保存Token信息,比如用Angular的LocalStorage来保存Token信息。之后每次请求业务接口,把Token信息放到Http请求的Head里面。
四、工作流程
-- 用户使用用户名和密码进行鉴权
服务端进行鉴权
服务端给客户端分配一个加密的token
客户端保存这个token,以后的每个请求,客户端都会发送这个token
服务端通过token判断是否是鉴权过的用户,并返回请求的响应数据
五、JWT的特点
简洁:可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快
自包含:payload中包含了所有用户所需要的信息,避免了多次查询数据库
JWT的应用场景
身份认证
安全要求的信息交换
JWT的结构
JWT包含了使用.分隔的三部分:
Header 头部:Base64Url(token类型+加密算法)
Payload 负载:Base64Url(用户信息)
Signature 签名:算法( base64UrlEncode(header) + "." + base64UrlEncode(payload), 密钥)
其结构看起来是这样的
xxxxx.yyyyy.zzzzz
签名用于验证消息的发送者以及消息是没有经过篡改的。如果黑客获取到了payload中的用户信息,并进行了篡改,那么经过Base64编码后也会发生变化,而签名是根据Header和Payload共同决定的,签名也会不一样,服务器就会判断出不一致。
下列的JWT展示了一个完整的JWT格式,它拼接了之前的Header, Payload以及秘钥签名:
JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
JWT 不加密的情况下,不能将秘密数据写入 JWT。
JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
六、如何使用JWT?
用户在客户端输入用户名和密码登录服务器;
服务器认证通过后,返回给用户一个JWT
客户端只需要本地保存该token(通常使用local storage,也可以使用cookie)即可。
当用户下次访问时,在Authorization头部使用Bearer模式添加JWT,格式Authorization: Bearer
服务端检查请求头Authorization中的JWT信息,如果合法,则允许用户的行为。
由于JWT是自包含的,因此减少了需要查询数据库的需要。
参考:
https://www.cnblogs.com/loveapple/p/10046835.html
https://blog.csdn.net/qq_26545305/article/details/88385470
JWT鉴权的更多相关文章
- HTTP基本认证和JWT鉴权
一.HTTP基本认证 Basic Authentication——当浏览器访问使用基本认证的网站的时候, 浏览器会提示你输入用户名和密码. http auth的过程: · 客户端发送http请求 · ...
- Spring Boot 鉴权之—— JWT 鉴权
第一:什么是JWT鉴权 1. JWT即JSON Web Tokens,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519),他可以用来安全的传递信息,因为传递的信息是 ...
- jwt鉴权学习 (php示例代码)
前段时间听朋友讲起 jwt鉴权,博主我是一脸懵逼,通过朋友坚持不懈的讲解,我终于听懂了,jwt就是登陆token校验嘛 然而事情并不是博主想象的那么简单,在一个艳阳高照,晴空万里的夜晚,博主手贱百度了 ...
- springboot oauth 鉴权之——password鉴权相当于jwt鉴权模式
近期一直在研究鉴权方面的各种案例,这几天有空,写一波总结及经验. 第一步:什么是 OAuth鉴权 OAuth2是工业标准的授权协议.OAuth2取代了在2006创建的原始OAuthTM协议所做的工作. ...
- 通俗化讲解JWT鉴权的使用场景及结构安全
一.基于Session的应用开发的缺陷 在我们传统的B\S应用开发方式中,都是使用session进行状态管理的,比如说:保存登录.用户.权限等状态信息.这种方式的原理大致如下: 用户登陆之后,将状态信 ...
- shiro jwt 构建无状态分布式鉴权体系
一:JWT 1.令牌构造 JWT(json web token)是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519). 一个JWT令牌的定 ...
- 密码加密与微服务鉴权JWT
博客学习目标 1.用户注册时候,对数据库中用户的密码进行加密存储(使用 SpringSecurity). 2.使用 JWT 鉴权认证. 一.BCrypt 密码加密 1.常见的加密方式 任何应用考虑到安 ...
- 5、 postman的鉴权
什么是鉴权? 鉴权(authentication)是指验证用户是否拥有访问系统的权利.常用的有两种鉴权方式,一种是session鉴权,一种是jwt鉴权,相对而言,后者居多. 实例: 比如有一个添加角色 ...
- 「快学springboot」集成Spring Security实现鉴权功能
Spring Security介绍 Spring Security是Spring全家桶中的处理身份和权限问题的一员.Spring Security可以根据使用者的需要定制相关的角色身份和身份所具有的权 ...
随机推荐
- pycharm2018.1下载激活(mac平台)
此教程实时更新,请放心使用:如果有新版本出现猪哥都会第一时间尝试激活: pycharm官网下载地址:http://www.jetbrains.com/pycharm/download/ 激活前准备工作 ...
- sql查询:部门工资前三高的员工和部门工资最高的员工
创建表:Create table If Not Exists Employee (Id int, Name varchar(255), Salary int, DepartmentId int);Cr ...
- 构建调试Linux内核网络的环境Menuos系统
一.Linux内核源码下载 下载网址为:https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz 下载完成后放入home/Menu ...
- python 微信小程序自动化
微信小程序自动化 https://www.cnblogs.com/yyoba/python27 - FautoTesthttps://www.cnblogs.com/yyoba/p/9973731.h ...
- IDEA 中项目代码修改后不自动生效,需要执行 mvn clean install 才生效
问题描述 之前项目运行好好的,代码修改完之后会自动编译,编程体验很好. 有一天发现每次修改代码后需要重新使用mvn clean install命令重新编译,异常麻烦. 检查了 IDEA 的配置,已经配 ...
- Windows2008R2+ IIS7.5+php+mysql 搭建教程
Windows2008R2+ IIS7.5+php+mysql 搭建教程 1. IIS7.5安装安装角色时候因为 Fastcgi 的需要, aspnet 和 asp 都要选装. 我为了方便,所有的除 ...
- Luogu P4105 [HEOI2014]南园满地堆轻絮
题解 传送门 其实只要找差距最大的逆序对就好了 答案就是此逆序对的差 /2 代码 (代码很短) #include<bits/stdc++.h> using namespace std; # ...
- .NET CORE 下如何使用国产数据库进行 开发
主流国产数据库 随着贸易战的升级 ,自主研发和知识产权也是一个大的趋势,达梦和人大金仓是国产数据库中比较主流的 1.达梦数据库 更接近Oracle,更偏向自主研发,对开发人员友好度不如金仓 达梦公司在 ...
- 导入tensorflow.出现importError: DLL load failed: 找不到指定的模块。
导入tensorflow.出现importError: DLL load failed: 找不到指定的模块. 原因 这是由于windows上没有相应的动态链接库导致的,tensorflow依赖很多c+ ...
- ASP.NET Core Authentication系列(四)基于Cookie实现多应用间单点登录(SSO)
前言 本系列前三篇文章分别从ASP.NET Core认证的三个重要概念,到如何实现最简单的登录.注销和认证,再到如何配置Cookie 选项,来介绍如何使用ASP.NET Core认证.感兴趣的可以了解 ...