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. Linux服务器之间进行文件目录映射/挂载(总结)

    Linux服务器之间进行文件目录映射/挂载(总结) 需要实现的功能为:将192.168.10.10服务器下的 /home/要映射的目录/ ,映射为192.168.10.90服务器下的 /home/被映 ...

  2. Spring Cloud Eureka 使用 IP 地址进行服务注册

    默认情况下,Eureka 使用 hostname 进行服务注册,以及服务信息的显示,那如果我们使用 IP 地址的方式,该如何配置呢?答案就是eureka.instance.prefer-ip-addr ...

  3. 高级Java面试总结1

    一.三大框架方面问题   1.Spring 事务的隔离性,并说说每个隔离性的区别 解答:Spring事务详解 2.Spring事务的传播行为,并说说每个传播行为的区别 解答:Spring事务详解 3. ...

  4. [Swift]LeetCode707. 设计链表 | Design Linked List

    Design your implementation of the linked list. You can choose to use the singly linked list or the d ...

  5. [Swift]LeetCode934. 最短的桥 | Shortest Bridge

    In a given 2D binary array A, there are two islands.  (An island is a 4-directionally connected grou ...

  6. PHP算法之冒泡排序

    //冒泡排序 //①思路,先比较出第一次,找一个最大的值,排到最后; //②重复count遍之后,就能得到排序; //③优化,每一次循环之后不需要再次全部重复; $array = [11,5,4,58 ...

  7. Python内置函数(25)——getattr

    英文文档: getattr(object, name[, default]) Return the value of the named attribute of object. name must ...

  8. java代码之美(4)---guava之Immutable(不可变)集合

    Immutable(不可变)集合 一.概述 guava是google的一个库,弥补了java语言的很多方面的不足,很多在java8中已有实现,暂时不展开.Collections是jdk提供的一个工具类 ...

  9. EF之Code First代码优先

    1.前言 通过英文可知,表示的是代码优先,一般创建EF都是先创建数据库,创建根据数据库的EF实体模型,而code - first 则是反过来!... 2.代码实战 我们这次创建的不是原来的数据库EF设 ...

  10. PHP分页倒序时,需要注意的问题

    PHP分页倒序请求,如果有新数据加入,下一页会出现重复数据 解决方案: 第一次查询时,给前端返回一个查询时间戳,下一次请求时,把时间戳带过来,只查询比这个时间戳小的数据