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. BZOJ 4765(分块+树状数组)

    题面 传送门 "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能计算数列区间和,而普通计算姬能计算树中子树和.更 ...

  2. 04-初始mysql语句

    本节课先对mysql的基本语法初体验. 操作文件夹(库) 增 create database db1 charset utf8; 查 # 查看当前创建的数据库 show create database ...

  3. css 图片有间隔多个Img标签之间的间隙

    今天写css时发现,图片加起来刚好是900px的三张图片,不能在一个900px宽容器放下,因为图片之间有间隔,我猜是浏览器把两个img标签之间的空格当成了空白节点. 在网上找到了几个不错的解决方法: ...

  4. Harbor私有镜像仓库(下)

    Harbor私有镜像仓库(下) 链接:https://pan.baidu.com/s/1MAb0dllUwmoOk7TeVCZOVQ 提取码:ldt5 复制这段内容后打开百度网盘手机App,操作更方便 ...

  5. go语言从例子开始之Example17.指针

    Go 支持 指针,允许在程序中通过引用传递值或者数据结构 Example: package main import "fmt" func zeroval(ival int){ iv ...

  6. 力扣 — Rotate List()

    题目描述: 中文: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = ...

  7. Debug和Release区别(转)

    地址:https://zhidao.baidu.com/question/629188090208609884.html 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题 ...

  8. SQL注入系列:SQLi Labs

    前言 关于注释 说明:在SQL中--[空格]表示注释,但是在URL中--空格在发送请求的时候会把最后的空格去掉,所以用--+代替,因为+在被URL编码后会变成空格 MYSQL有三种常用注释: --[空 ...

  9. Centos7 安装配置 SVN

    准备工作: 检查是否安装SVN:rpm -qa subversion 查看安装SVN版本信息:svnserve --version 卸载旧版本SVN: yum remove subversion 1. ...

  10. 微信小程序学习笔记(三)--框架-逻辑层

    逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈. 开发者写的所有代码最终将会打包成一份 JavaScript 文件,并在小程序启动的时候运行,直到小程序销毁.这一行为类似 Service ...