JSON WEB TOKEN(JWT)的分析

一般情况下,客户的会话数据会存在文件中,或者引入redis来存储,实现session的管理,但是这样操作会存在一些问题,使用文件来存储的时候,在多台机器上,比较难实现共享,使用redis来存储的时候,则需要引入多一个集群,这样会增加管理的工作量,也不方便。有一个直观的办法,就是将session数据,存储在客户端中,使用签名校验数据是否有篡改,客户请求的时候,把session数据带上,获取里面的数据,通过校验,然后进行身份认证。

数据存储在客户端中,会存在一些挑战:

  • 数据安全问题
  • 数据量不能太大
  • 续签的问题
  • 注销的问题

为了实现客户端存储会话数据的解决方案,制定了JSON Web Token的协议,详细的协议可以在:RFC7529查看。下面我们看看jwt协议是怎样解决上面的挑战的。

JWT的结构:

JWT加密后,使用的格式,分为三部分,header,payload和signature,使用.号连接起来:

Header.Payload.Signature

JWT的header:

JWT的header,定义了存储的算法和协议名称:

{
"alg": "HS256",
"typ": "JWT"
}

JWT的Payload:

下面这些负载字段,是JWT协议提供选用,一般情况下,payload的数据是不加密存储在客户端中的,所以要注意不要存储敏感信息:

iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

payload除了这些字段,还可以扩展一些数据,更加符合我们的需求:

{
"iss": "foo",
"extend_data": "hell"
}

JWT的Signature

服务端,有一个秘钥,通过秘钥对header和payload进行签名,使用header中指定的签名算法类型,一般有HMAC,RSA和ECDSA,下面是签名的格式:

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

JWT的通讯方式

JWT一般会将token数据存储在http请求的header中,通过Bearer来分隔:

headers: {
'Authorization': 'Bearer ' + token
}

定义好数据结构和通讯方式,下面看看如何处理一些问题:

续签问题

每一个token产生,都应该限制好过期时间,确保只能在一段时间内有效,保证安全。当达到过期时间时,需要对token进行续签,可以定时想服务器提交请求,重新获取token来实现。

注销问题

当客户登录的时候,需要注销登录会话,由于token是没有状态的,只能在客户端把token删除,伪造一个注销的状态,真正的注销只能等待token过期。

也可以有种办法,就是把token的信息记录在redis中,当客户退出时,讲redis中的token删除,而一般请求时,会通过redis对数据进行校验,这样可以实现真的注销效果,但要引入多一个组件,把token变为有状态,如果用这种办法,也就不符合token存储在客户端的模式了

总结

如果能够支持,会话用的数据量较小,对注销可以等待超时的长效的场景,使用jwt作为会话数据存储是会比较方便的。而对于会话数据量大的场景,还是使用一般的方式比较好点。

参考资料

RFC7529

JSON WEB TOKEN(JWT)的分析的更多相关文章

  1. JSON WEB Token(JWT)

    最近面试被问及单点登陆怎么解决?自己的项目前后端分离,自己实现token认证,token有失效时间,token中包含用户基本的信息.且一个当用户重新登陆后,原来的token就会失效,这么安全的一个to ...

  2. JSON Web Token (JWT) 简介

    JSON Web Token (JWT) 是一种基于 token 的认证方案. JSON Web Token 的结构 一个 JWT token 看起来是这样的: eyJhbGciOiJIUzI1NiI ...

  3. JSON Web Token (JWT) 实现与使用方法

    1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...

  4. Json Web Token(JWT)详解

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

  5. JSON Web Token (JWT),服务端信息传输安全解决方案。

    JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式.这些信息可以被验证和信任,因为它是数字签名的 ...

  6. 漫谈JSON Web Token(JWT)

    一.背景 传统的单体应用基于cookie-session的身份验证流程一般是这样的: 用户向服务器发送账户和密码. 服务器验证账号密码成功后,相关数据(用户角色.登录时间等)都保存到当前会话中. 服务 ...

  7. 基于 Token 的身份验证:JSON Web Token(JWT)

    1.传统身份验证和JWT的身份验证 传统身份验证:       HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过 ...

  8. JSON Web Token (JWT) - Introduction

    To validate the challenge, connect as admin.------------以admin登陆 https://jwt.io/introduction/        ...

  9. json web token JWT实现TP5创建和验证

    根据博客进行jwt初始化配置 https://blog.csdn.net/weixin_43389208/article/details/117442266?spm=1001.2014.3001.55 ...

  10. JSON Web Token (JWT) - Weak secret

    This API with its /hello endpoint (accessible with GET) seems rather welcoming at first glance but i ...

随机推荐

  1. Centos7-驱动小米WIFI做AP

    参考文章: http://blog.csdn.net/sumang_87/article/details/38168877 http://blog.csdn.net/hktkfly6/article/ ...

  2. Dubbo+zookeeper构建高可用分布式集群(二)-集群部署

    在Dubbo+zookeeper构建高可用分布式集群(一)-单机部署中我们讲了如何单机部署.但没有将如何配置微服务.下面分别介绍单机与集群微服务如何配置注册中心. Zookeeper单机配置:方式一. ...

  3. Python的变量声明

    Python 与大多数其它语言一样有局部变量和全局变量之分,但是它没有明显的变量声明.变量通过首次赋值产生,当超出作用范围时自动消亡. Example 1. 定义 myParams 变量 if __n ...

  4. JDK 和 OpenJDK 的区别

    历史上的原因是,openjdk是jdk的开放原始码版本,以GPL协议的形式放出.在JDK7的时候,openjdk已经成为jdk7的主干开发,sun jdk7是在openjdk7的基础上发布的,其大部分 ...

  5. Data - Tools

    数据工具汇总 史上最全的大数据分析和制作工具 全球100款大数据工具汇总 SQL 数据分析常用语句 01 - NumPy HomePage:http://www.numpy.org/ NumPy(数值 ...

  6. ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.

    在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写 ...

  7. 免费SSL证书(支持1.0、1.1、1.2)

    由于公司要开发微信小程序,而微信小程序的接口需要https协议的,并且要支持TLS1.0.TLS1.1.TLS1.2.如果仅仅是为了开发小程序,安全等级又不用太高,可以选择免费的SSL证书 在这里选择 ...

  8. solr之环境配置一

    安装Java JDK solr运行需要java serverlet 容器,默认使用jetty,或者tomcat,jboss等等. 下载一个jdk,我的jdk是jdk1.7.0_65. 安装JDK的步骤 ...

  9. Android中颜色透明度对应16进制值

    透明度百分比对应的十六进制: (说明:百分比计算出来会有小数,按照常规的四舍五入处理,详情请往下查看) 百分比:0% HEX: 00 百分比:1% HEX: 30 百分比:2% HEX: 50 百分比 ...

  10. 基础才是重中之重~Dictionary<K,V>里V的设计决定的性能

    回到目录 字典对象Dictionary<K,V>我们经常会用到,而在大数据环境下,字典使用不当可能引起性能问题,严重的可能引起内在的溢出! 字典的值建议为简单类型,反正使用Tuple< ...