什么是 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. openstack使用

    管理员登陆: 身份管理--->创建项目 身份管理--->创建用户(角色:_member_)(管理指定项目) 管理员--->云主机类型--->创建云主机 管理员--->镜像 ...

  2. pssh

    步骤一:准备工作 )安装软件包 [root@proxy ~]# rpm -ivh pssh--.el7.noarch.rpm )修改/etc/hosts本地解析文件 [root@proxy ~]# c ...

  3. 虚拟机里的nginx启动不了的问题

    问题:  之前使用虚拟机nginx一直都是正常的, 就在昨天重新配置了一下nginx(其实只注释了反向代理,别的都没动), 重启nginx, 却报错pid为空. 无法启动nginx.   而且重启之前 ...

  4. JavaScript实现 简易 堆

    有两个原始操作用于保证插入或删除节点以后堆是一个有效的最大堆或者最小堆: shiftUp(): 如果一个节点比它的父节点大(最大堆)或者小(最小堆),那么需要将它同父节点交换位置.这样是这个节点在数组 ...

  5. js实现OSS上传图片,STS临时授权访问OSS

    1. 引入aliyun-oss-sdk.min.js <script type="text/javascript" src="/static/js/common/a ...

  6. 【强化学习】1-1-2 “探索”(Exploration)还是“ 利用”(Exploitation)都要“面向目标”(Goal-Direct)

    title: [强化学习]1-1-2 "探索"(Exploration)还是" 利用"(Exploitation)都要"面向目标"(Goal ...

  7. python 字符串模板

    from string import Template print(type(Template)) mystr = Template("hi,$name 你是$baby") pri ...

  8. JavaWeb_(Spring框架)Spring整合Hibernate

    Dao层类要继承HibernateDaoSupport.java父类 原先使用Hibernate框架hibernate.cfg.xml配置数据库 <hibernate-configuration ...

  9. jupyter login

    anaconda2/lib/python2.7/site-packages/notebook/auth/login.py """Tornado handlers for ...

  10. ADB命令指令控制Android系统的WIFI连接开启/关闭状态

    Android系统的usb调试已开启,连接电脑(有ADB环境) 1.在cmd中,进入shell指令模式 adb shell 2.进入ROOT指令模式 su 3. 打开WIFI指令 svc wifi e ...