JWT学习文章:

第一篇:JWT原理

第二篇:JWT原理实现代码


简介

JWT全拼是JSON Web Tocken,是目前最流行的跨域身份认证解决方案,特别适合分布式系统,减少用户麻烦,保证账号安全,减少服务器负载。

有人经常将OAuth与JWT搞混,两种是用于同一场景的不同情况。同一场景是指登录场景,不同情况是指,OAuth是第三方授权登录(详情戳这里),JWT是直接登录。


产生的背景

最经典的登录实现方式是通过session:
1.用户输入用户名、密码提出登录请求;

2.服务器收到请求并验证用户名和密码,正确情况下存储在服务器的session中,并返回用户session_id;

3.用户发起新的请求并携带cookie中的session_id;

4.服务器验证session_id并验证服务器内的session,无误响应用户请求;

所有后续请求都如此进行,如果服务器对session有时间限制后自动销毁,到时间后用户将重新进行用户名、密码的登录。


存在的问题

如果用户数量过大,服务器中存储大量的session信息,严重影响服务器的性能;

服务器无法方便的进行分布式部署,因为session不能方便的实现服务器间的同步,无法实现横向扩展(不是不能实现,而是实现会变得复杂,例如创建session持久化层,此种方法修改难度大,且持久化层挂掉,所有服务都会挂掉)。

应运而生,JWT解决了以上的问题。接下来进行学习JWT的相关知识。


JWT结构

组成部分

Header

Payload

Signature

连接形式

xxxxx.yyyyy.zzzzz

让我们一步步来说:

Header

格式:JSON

包括内容是:

Token的类型,就是JWT

加密的方式,例如HMAC SHA256 or RSA,一般使用HMAC SHA256

例子:

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

接着用Base64Url编码成为JWT的第一部分。


Payload

存放有效信息的部分,有效信息主要包含三部分:

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明

标准中注册的声明:

iss: JWT签发者

sub: JWT所面向的用户

aud: 接收JWT的一方

exp: JWT的过期时间,这个过期时间必须要大于签发时间

nbf: 定义在什么时间之前,该JWT都是不可用的.

iat: JWT的签发时间

jti: JWT的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

此部分内容建议使用但不强制。

公共声明:

可以添加任何信息,一般是用户信息和业务信息。不建议添加敏感信息,因为payload部分会用Base64Url编码,可能会被反向解密。

私有声明:

可以存放前后端共同定义的声明,方便前后端进行不敏感的信息交换。同样不建议添加敏感信息,原因也是可能会被解码。

例子:

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

此部分内容同样进行Base64Url编码,组成JWT的第二部分内容。


Signature

此部分内容是Header和Payload各自经过Base64Url编码后用“.”连接,根据Header中声明的加密方法进行加密后组成的。

类似下面的方式:

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

使用方式

加在http请求或HTTPS的请求头中,样式如下:

Authorization: Bearer <token>

注意一定要在token之前加上Bearer,之间空格。

结语

掌握JWT的结构和原理是根本。

大家可以生成一个密钥,在https://JWT.io/#debugger-io上试试,方便进行理解。

此篇文章可以当做JWT的文档来看,因为结构部分的内容和JWT文档的内容并无二意。

参考文档:https://JWT.io/introduction

JWT理论知识的更多相关文章

  1. js中函数的一些理论知识

      函数的一些理论知识 1. 函数:                执行一个明确的动作并提供一个返回值的独立代码块.同时函数也是javascript中的一级公民(就是函数和其它变量一样). 2.函数的 ...

  2. 用VC进行COM编程所必须掌握的理论知识

    一.为什么要用COM 软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的COM编程,目标只有一个,就是希望软件能象积方块一样是累起来的,是组装起来的,而不是一点点编出来的.结构化编程 ...

  3. 图形学理论知识 BRDF 双向反射分布函数(Bidirectional Reflectance Distribution Function)

    图形学理论知识 BRDF 双向反射分布函数 Bidirectional Reflectance Distribution Function BRDF理论 BRDF表示的是双向反射分布函数(Bidire ...

  4. TestNG学习-001-基础理论知识

    此 文主要讲述用 TestNG 的基础理论知识,TestNG 的特定,编写测试过程三步骤,与 JUnit4+ 的差异,以此使亲对 TestNG 测试框架能够有一个简单的认知. 希望能对初学 TestN ...

  5. [转] DDD领域驱动设计(三) 之 理论知识收集汇总

    最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一谈起领域驱动设计,就一定认为国外的那个Eric ...

  6. Winsock网络编程笔记(4)----基本的理论知识

    前面的笔记记录了Winsock的入门编程,领略了Winsock编程的乐趣..但这并不能算是掌握了Winsock,加深理论知识的理解才会让后续学习更加得心应手..因此,这篇笔记将记录一些有关Winsoc ...

  7. Android初级教程对大量数据的做分页处理理论知识

    有时候要加载的数据上千条时,页面加载数据就会很慢(数据加载也属于耗时操作).因此就要考虑分页甚至分批显示.先介绍一些分页的理论知识.对于具体用在哪里,会在后续博客中更新. 分页信息 1,一共多少条数据 ...

  8. Android初级教程理论知识(第四章内容提供器)

    之前第三章理论知识写到过数据库.数据库是在程序内部自己访问自己.而内容提供器是访问别的程序数据的,即跨程序共享数据.对访问的数据也无非就是CRUD. 内容提供者 应用的数据库是不允许其他应用访问的 内 ...

  9. 关于mpi的理论知识以及编写程序来实现数据积分中的梯形积分法。

    几乎所有人的第一个程序是从“hello,world”程序开始学习的 #include "mpi.h" #include <stdio.h> int main(int a ...

随机推荐

  1. CRM客户关系管理系统有哪些优缺点?

    CRM系统不仅仅是一种技术,也是面向企业的客户管理系统.客户关系管理软件可以帮助销售员快速地找到客户信息,帮助销售员跟踪客户直到完成订单.为提高企业销售效率,CRM被越来越多的企业所采用. 那么,作为 ...

  2. [网络编程之客户端/服务器架构,互联网通信协议,TCP协议]

    [网络编程之客户端/服务器架构,互联网通信协议,TCP协议] 引子 网络编程 客户端/服务器架构 互联网通信协议 互联网的本质就是一系列的网络协议 OSI七层协议 tcp/ip五层模型 客户端/服务器 ...

  3. vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

    vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 打开编辑,修改如下内容: BOOTPROTO=static #默认dhcp,改为static,表示启用静态 ...

  4. Ubuntu 配置本地源

    Ubuntu 配置本地源 操作系统 Ubuntu 20.04.2 LTS 一.挂载 iso 到本地 mount -t iso9660 -o loop /dev/sr0 /media/cdrom //- ...

  5. 基于多端口的Web服务

    [Centos7.4版本] !!!测试环境我们首关闭防火墙和selinux [root@localhost ~]# systemctl stop firewalld [root@localhost ~ ...

  6. Linux服务之nginx服务篇五(静态/动态文件缓存)

    一.nginx实现静态文件缓存实战 1.nginx静态文件缓存 如果要熟练使用nginx来实现文件的缓存,那下面的几个指令你必须要牢记于心 (1)指令1:proxy_cache_path 作用:设置缓 ...

  7. 使用nuget包下载Entity Framework6.0无法使用模型类与数据库上下文自动生成controller与view

    解决方法:卸载掉原有的6.0版本EF,从控制台安装5.0版本的. >工具>库程序包管理器>程序包管理器控制台.在PM>后面输入安装命令. 命令如下 Install-Packag ...

  8. Windows上能看朋友圈的微信来了 | 附下载地址

    昨天的时候,电脑端的微信提示更新就顺手更新了一下,更新完成后习惯性的点了下设置,纳尼,居然被灰到了测试版本? 带着好奇,赶快看了下更新了什么内容: 支持浏览朋友圈 "搜一搜"支持搜 ...

  9. CSS的起步

    初学CSS CSS语法规范 选择器{样式} 给谁改样式{改什么样式} 写在style标签里 健值对形式,分号结尾 color:red; <style> p { color:red; fon ...

  10. .NET Core Web API使用HttpClient提交文件的二进制流(multipart/form-data内容类型)

    需求背景: 在需要通过服务端请求传递文件二进制文件流数据到相关的服务端保存时,如对接第三方接口很多情况下都会提供一个上传文件的接口,但是当你直接通过前端Ajax的方式将文件流上传到对方提供的接口的时候 ...