JWT介绍

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式。这些信息可以被验证和信任,因为它是数字签名的。JWTs可以使用一个密钥(HMAC算法),或使用RSA的公钥/私钥密钥对对信息进行签名。

让我们进一步解释这个定义的一些概念。

  • 紧凑

由于其较小的体积,JWTs可以通过URL、POST参数或HTTP头部参数进行传递,体积小也意味着其传输速度会相当快。

  • 独立

有效负载包含了所需要的关于用户的所有信息,避免了多次查询数据库的需要。

JWT的应用场景

  • 认证

这是使用JWT最常见的场景,一旦用户登录后,每个后续的请求都会包含JWT token,允许用户访问该token所允许的路由、服务、资源等。如单点登录是目前广泛使用JWT的一项功能,因为它的开销很小,而且在不同的域名中很容易使用。

  • 信息交换

JWT是一种在多方之间传递数据比较好的方式,因为JWT能使用签名,能确保发送者是谁,也可以验证传递过来的的信息是否被篡改。

JWT的结构

JWT由以下三部分组成:

  1. Header(头部)
  2. Payload(载荷)
  3. Signature(签名)

因此,JWT通常看起来如下。

xxxxx.yyyyy.zzzzz

Header

header通常由两个部分组成:token类型(即JWT)和正在使用的散列算法,如HMAC SHA256或RSA。

如:

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

这个JSON经过Base64编码后形成JWT的第一部分。

Payload

载荷包含了对实体的申明,用户和一些其他元信息。申明以下三种。

  1. 注册的申明
  2. 公开的申明
  3. 私有的申明

如:

{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}

这个JSON经过Base64编码后形成JWT的第二部分。

Signature

签名用于验证JWT的发送者是谁,并确保消息在过程中不会被篡改。

创建签名部分,你需要用到编码后的header、编码后的payload、密钥、在header中指定的算法。

如下使用HMAC SHA256算法创建签名的方式:

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

讲完了上面3个部门,最后就是由这3部分组成了。每个部分经过base64编码后,以.分隔。它能很容易的在HTML和HTTP环境中传递,也比像类似xml标准格式这样的更紧凑。

如果想使用JWT并将这些概念应用到实践中,您可以使用官网首页下面的调试器来解码、验证和生成JWTs。

JWT的工作原理

在身份验证中,当用户成功地使用他们的凭证登录时,将返回一个JWT的token,并且必须在本地保存(通常在本地保存,但也可以使用cookie),而不是在服务器中创建会话并返回cookie的传统方法。

当用户想要访问受保护的路由或资源时,用户代理应该发送token,通常是在使用Bearer模式的Authorization头参数中。标题的内容应该如下所示:

Authorization: Bearer <token>

这是一个无状态的身份验证机制,因为用户状态永远不会保存在服务器内存中。服务器的受保护路由将在授权头中检查有效的JWT,如果它存在,用户将被允许访问受保护的资源。由于JWTs是独立的,所以所有必要的信息都在那里,减少了多次查询数据库的需求。

这使得完全可以依赖无状态的数据api,甚至向下游服务发出请求。哪个域名api服务并不重要,因为CORS攻击不会成为一个问题,因为它不使用cookie。

工作流程如下:

JWT的优点

  • 因为JSON数据格式的通用性,所以JWT是可以跨语言的,主流语言都可以支持。
  • payload部分可以存储其他业务逻辑所必要的非敏感信息。
  • JWT构成简单,字节占用很小,所以非常便于传输的。
  • 不需要在服务端保存会话信息,易于应用的扩展和安全等。

JWT的使用注意

  1. 不要在payload存放敏感信息,因为该部分是可解密的。
  2. 保存好secret私钥十分重要。
  3. 尽量使用https协议

JWT参考网站

官网:https://jwt.io/

官方介绍:https://jwt.io/introduction/

支持类库:https://jwt.io/#libraries-io

RFC 7519规范:https://tools.ietf.org/html/rfc7519

明天带来JWT的Java实战。

推荐阅读

干货:免费领取2TB架构师四阶段视频教程

面经:史上最全Java多线程面试题及答案

工具:推荐一款在线创作流程图、思维导图软件

分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。

JSON Web Token (JWT),服务端信息传输安全解决方案。的更多相关文章

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

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

  2. Json Web Token(JWT)详解

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

  3. JSON WEB Token(JWT)

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

  4. JSON Web Token (JWT) 简介

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

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

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

  6. 漫谈JSON Web Token(JWT)

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

  7. JSON Web Token (JWT) - Introduction

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

  8. JSON Web Token (JWT)生成Token及解密实战。

    昨天讲解了JWT的介绍.应用场景.优点及注意事项等,今天来个JWT具体的使用实践吧. 从JWT官网支持的类库来看,jjwt是Java支持的算法中最全的,推荐使用,网址如下. https://githu ...

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

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

随机推荐

  1. mysql FROM_UNIXTIME 时间不准确

    mysql 使用 FROM_UNIXTIME 函数计算出来的时间少了6个小时或者8个小时 解决办法: 添加 default-time_zone = '+8:00' 这个再配置文件中 vi /etc/m ...

  2. Oracle学习笔记<4>

    多表查询 1.什么是多表查询? 一次select语句需要查询的内容来自于不止一张表. 同时从多张表中查询数据. 单表查询: select id,last_name,salary from s_emp ...

  3. C#获取文件夹/文件的大小以及占用空间 转摘自:http://www.cnblogs.com/chenpeng-dota/articles/2176470.html

    C#获取文件夹/文件的大小以及占用空间 今天,头给了个任务:写个方法,我会给你个路径,计算这个路径所占用的磁盘空间 . 然后,找了很多资料.但大部分都是获取文件夹/文件的大小的.对于占用空间的没有成品 ...

  4. webpack4入门到进阶案例实战课程

    愿景:"让编程不在难学,让技术与生活更加有趣" 更多教程请访问xdclass.net 第一章 webpack4前言 第一集 webpack4入门到进阶案例实战课程介绍 简介:讲述w ...

  5. LOGO有哪几种常规设计思路?

    Logo设计的思路多种多样,但是我个人从Logo设计的历史上,大致可以归纳出五种常规思路,思路的名称是自己编的,仅供大家参考.而列举的这些思路背后,都是有着各自的时代背景的. 先从历史最悠久的一种设计 ...

  6. Java compiler level does not match the version of the installed Java project facet错误

    出现问题情景:从其他地方导入一个项目的时候报错:Java compiler level does not match the version of the installed Java project ...

  7. setlocale - 设置当前的区域选项

    总览 (SYNOPSIS) #include <locale.h> char *setlocale(int category, const char * locale); 描述 (DESC ...

  8. ThreadLocal的使用和理解

    ThreadLocal是个threadlocalvariable(线程局部变量),其实就是为每一个使用该变量的线程都提供一个变量值的副本,从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引 ...

  9. 使用intellij的idea集成开发工具中的git插件(转)

    转自:https://blog.csdn.net/u012225679/article/details/71123171 注意:这里并没有介绍git客户端的安装,如果要安装客户端,大家可以参考如下的链 ...

  10. json书写格式

    1.数组方式 [ ] [{ "id" : 1 , "name" : "xiaoming" },{ "id" : 2 , ...