什么是 JWT (Json Web Token)

用户认证是计算机安全领域一个永恒的热点话题.

JWT 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。

该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。

JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,该token也可直接被用于认证,也可被加密。

传统的session认证

我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。

传统的session认证方式对于单机单端应用非常方便。

但是这种基于session的认证使应用本身很难得到扩展,随着手机、电视等多种客户端(多端)的出现,独立的服务器已无法承载更多的用户,而这时候基于session认证应用的问题就会暴露出来

session的缺点

  1. 如果是分布式应用前后端分离,那么原来的cookies或者session在使用上就会有很大的问题

cookie和session认证需要在同一主域名下才可以进行认证

  1. 如果用户量很大,服务器需要不停的跟新会话,会造成服务器响应变慢

针对以上两种问题,目前可以把session存储在redis内进行解决 ,但并不是最终的解决办法

什么Token(令牌)

我们需要一种机制,每个请求中,可以在请求header头中带上一串密钥,这个密钥就是通行证

而这个密钥的合法性和有效性有服务端来控制,那么我们的服务端只需鉴定这个密钥是不是授权的真实密钥

无需保存session文件信息,这个密钥就是token,翻译过来叫令牌 。

JWT就是这样一种机制

流程上是这样的:

  • 用户使用用户名密码来请求服务器

  • 服务器进行验证用户的信息

  • 服务器通过验证发送给用户一个token

  • 客户端存储token,并在每次请求时附送上这个token值

  • 服务端验证token值,并返回数据

这个token必须要在每次请求时传递给服务端,它应该保存在请求头里

另外,服务端要支持CORS(跨域源资源共享)策略

一般我们在服务端这么做就可以了Access-Control-Allow-Origin: *

JWT的结构

一个jwt字符串由三部分组成,用.号分隔。

第一部分:头部(header)

{
"alg": "HS256", //加密类型
"typ": "JWT"
}

然后,这个json被Base64Url编码,成为第一部分

第二部分:载荷(payload)

{
"sub": "1234567890",
"name": "John Doe",
"admin": true //这部分是消息内容
}

然后,将有效载荷Base64Url进行编码,成为第二部分

第三部分:签证(signature)

使用编码后的第一部分,编码后的第二部分,然后一个用于加密的密钥secret。

采用第一部分里的加密算法进行签名

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

最后生成一个这样的字符串

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.wqt1_0iXaZCLjlpivjacftb4O1xRo8QE08Z2x1jziMw

JWT的缺点

1. 无法作废已颁布的令牌(对token刷新使用期限)
2. 不易应对过期数据(支持 token 失效)
3. 如果密钥过于简单,很可能会造成cookie伪造漏洞

所以如果你使用了 token ,那么如果 token 被捕获到,那么就可以进行伪造进行冒充。所以如果安全比较高的话,还是建议使用oauth2

参考链接

有关JWT(Json Web Token)的那些事

JWT实战:使用axios+PHP实现登录认证

什么是JWT(Json Web Token)的更多相关文章

  1. Java JWT: JSON Web Token

    Java JWT: JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand libr ...

  2. 如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  3. JWT(JSON Web Token) 【转载】

    JWT(JSON Web Token) 什么叫JWTJSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. 一般来说,互联网用户认证是这样子的. 1.用户向服务器发送用户名和密码. ...

  4. [更新]一份包含: 采用RSA JWT(Json Web Token, RSA加密)的OAUTH2.0,HTTP BASIC,本地数据库验证,Windows域验证,单点登录的Spring Security配置文件

    没有任何注释,表怪我(¬_¬) 更新: 2016.05.29: 将AuthorizationServer和ResourceServer分开配置 2016.05.29: Token获取采用Http Ba ...

  5. ( 转 ) 什么是 JWT -- JSON WEB TOKEN

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  6. 关于JWT(Json Web Token)的思考及使用心得

    什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(php 后端实现JWT认证方法一般用来做轻量级的API鉴权.由于许多API接口设计是遵循无状态的(比如 ...

  7. API安全验证之JWT(JSON WEB TOKEN) OLCMS

    假如www.olcms.com/getUserInfo获取用户信息,你怎么知道当前用户是谁?有人说登陆时候我把他UID写入session了,如果是API接口,没有session怎么办,那么就需要把UI ...

  8. 5分钟搞懂:JWT(Json Web Token)

    https://www.qikegu.com/easy-understanding/892 JWT 基于token的用户认证原理:让用户输入账号和密码,认证通过后获得一个token(令牌),在toke ...

  9. JWT(Json Web Token)认证

    目录 JWT(Json Web Token) JWT的数据结构 JWT的用法 JWT验证流程

随机推荐

  1. Solution: The process cannot access the file [filename] because it is being used by another process.

    http://www.brianstevenson.com/blog/solution-the-process-cannot-access-the-file-filename-because-it-i ...

  2. pat 甲级 1045 ( Favorite Color Stripe ) (动态规划 )

    1045 Favorite Color Stripe (30 分) Eva is trying to make her own color stripe out of a given one. She ...

  3. 使用WinDbg内核调试[转]

    Technorati 标签: windbg,内核调试 WINDOWS调试工具很强大,但是学习使用它们并不容易.特别对于驱动开发者使用的WinDbg和KD这两个内核调试器(CDB和NTSD是用户态调试器 ...

  4. 使用已有的jmeter测试结果日志文件生成html报告

    当并发数较大的时候,经常会出现测试结束后没有生成html报告的情况 解决办法: 测试结束后,使用生成的jmeter测试结果日志文件.jtl生成html报告 基本命令格式: jmeter -g < ...

  5. HDU 1024 Max Sum Plus Plus ——(M段区间的最大和)

    感觉有点奇怪的是这题明明是n^2的复杂度,n=1e6竟然能过= =.应该是数据水了. dp[i][j]表示前j个数,分成i段,且最后一段的最后一个为a[j]的答案.那么转移式是:dp[i][j] = ...

  6. yolo image.c

    void draw_detections(image im, detection *dets, int num, float thresh, char **names, image **alphabe ...

  7. CISCO实验记录二:路由器基本操作

    一.路由器基本操作要求 1.设置路由器本地时间 2.启用光标跟随 3.设置路由器标语信息和描述信息 4.为接口配置描述信息 5.快速恢复接口到出厂设置 二.路由器基本操作命令 1.设置路由器本地时间 ...

  8. 初始html5

    一.html5的发展历史: 2004年提出构想:2008年发布第一份草案:2012年前后位推广阶段:2020年最终测试:2022年正式发布. 二.html5新特性: (1)html5 语义化更好: 新 ...

  9. 解决vue中使用laydate.js选择日期后再修改其他model时日期会被清空问题

    首先描述一下问题,下图中均绑定v-model,例如先选择出生开始时间,然后当再选择地区或其他选项时该时间就会被清空 首先看一下我这边开始的默认值,开始我设置都为空 当我选择如下图的生日开始时间与结束时 ...

  10. ArcGIS Python获得一个图层所有线长

    import arcpy # Create an empty Geometry object # g = arcpy.Geometry() # Run the CopyFeatures tool, s ...