关于JWT的使用
首先,为了消除歧义,解释一下JWT。JSON WEB Token,是一种基于JSON的、用于在网络上声明某种主张的令牌(token)。JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。
我在开发中想通过使用JWT鉴权来缓解一下服务器压力。思路是服务器不存储或缓存sessionId或是token,不用频繁的进行数据库查询或缓存查询。
百度了一下JWT,很多文章是不推荐使用JWT的。如https://www.jianshu.com/p/af8360b83a9f等等。
原因大概有以下几个:
1.更多的空间占用
作者“主张“”将用户相关信息存入token中以方便后续操作。由此产生两个问题。
- 1.JWT占用的空间变大,无法存储到Cookie
- 2.存放在LocalStorage中如果受到XSS攻击会产生巨大的安全隐患
乍一看很有道理,看了评论区之后恍然大悟。针对这一条评价我的观点是。首先,JWT是一个鉴权标准,目的是为了鉴别来访请求的身份,并没有要存储过多的用户信息到JWT串中,由此也不会产生JWT占用空间过大,无法存储到Cookie中利用HttpOnly的属性来防止XSS攻击,从而不得不使用LocalStorage等方法存储JWT串。另外,即使存放在LocalStorage中,产生安全隐患的前提也是作者假定程序中没有做XSS攻击的防护。在此前提下,即使不使用JWT,使用简单的服务器端缓存token和cookie-session也存在着相同的安全隐患。这是一个由偷懒产生问题,并不是JWT的一个缺点。
2.更不安全
作者“主张”将敏感信息保存到客户端(浏览器,移动端)。这条评价的前提同样是建立在程序没有做XSS防护。退一步讲,假设现在还没有XSS防护这个概念,安全性上来说,敏感信息不应该保存到客户端中。按这种说法来讲,即使程序安全系统做的滴水不漏,用户电脑中病毒导致个人信息泄露,也是JWT的缺点,因为JWT没能“防止用户电脑中病毒”。我认为这应该归为设计缺陷 。
3.token发出后无法更改
Oauth的定义是:
Because the token can be verified without doing a database lookup, there is no way to invalidate a token until it expires. You’ll need to take additional steps to invalidate tokens that are self-encoded
翻译为:
因为可以在不进行数据库查找的情况下验证令牌,所以在令牌过期之前无法使令牌无效。 您需要采取其他步骤来使自编码的令牌无效。
对此oauth提供了Refresh token,也不能称之为一个问题吧。
总的来说,我认为JWT是一个安全性比较强的鉴权标准/方式。
原文地址:https://www.cnblogs.com/DaMoGu/p/11393395.html
- IDEA入门级使用教程
- 掌握Docker命令-Docker for Web Developers(4)
- InfoPath中repeating section中赋值操作
- 百布(baibu.la)完成1.65亿B+轮融资
- 八大排序算法总结与java实现
- Angular企业级开发(5)-项目框架搭建
- 如何让nginx显示文件夹目录
- Facebook Graph API(2)--读取数据之picture
- 使用Dockerfile构建镜像-Docker for Web Developers(5)
- 2018年程序员的出路有哪些
- CSS魔法堂:不得不说的Containing Block
- Facebook Graph API(1)—介绍
- MongoDB学习系列(1)--入门介绍
- 2018年人工智能行业市场预测:市场规模有望突破200亿元大关
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法