转自:http://www.leftso.com/blog/220.html

一、什么是JWT?了解JWT,认知JWT

首先jwt其实是三个英语单词JSON Web Token的缩写。通过全名你可能就有一个基本的认知了。token一般都是用来认证的,比如我们系统中常用的用户登录token可以用来认证该用户是否登录。jwt也是经常作为一种安全的token使用。

JWT的定义:
  JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。
JWT特点:

  • 简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快

  • 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库

二、JWT构成或者说JWT是什么样的?

2.1.JWT结构
JWT主要包含三个部分之间用英语句号'.'隔开

  1. Header 头部
  2. Payload 负载
  3. Signature 签名

注意,顺序是 header.payload.signature
最终的结构有点像这样:

leftso.com.blog

当然真实的jwt不可能是这么简单的明文

2.2.JWT的头部(Header)
在header中通常包含了两部分:token类型和采用的加密算法。如下:

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

上面的JSON内容指定了当前采用的加密方式为HS256,token的类型为jwt

将上面的内容进行base64编码,可以得到我们JWT的头部,编码后如下:
(本站提供了在线的base64编码/解码的工具,可供读者测试)

ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9ICA=

2.3.JWT的负载(Payload)
负载(Payload)为JWT的第二部分。JWT的标准所定义了一下几个基本字段

  1. iss: 该JWT的签发者
  2. sub: 该JWT所面向的用户
  3. aud: 接收该JWT的一方
  4. exp(expires): 什么时候过期,这里是一个Unix时间戳
  5. iat(issued at): 在什么时候签发的

除了标准定义的字段外,我们还要定义一些我们在业务处理中需要用到的字段,例如用户token一般可以包含用户登录的token或者用户的id,一个简单的例子如下:

{"iss": "Lefto.com","iat": 1500218077,"exp": 1500218077,"aud": "www.leftso.com","sub": "leftso@qq.com","user_id": "dc2c4eefe2d141490b6ca612e252f92e","user_token": "09f7f25cdb003699cee05759e7934fb2"
}

上面的user_id、user_token都是我们自己定义的字段

现在我们需要将负载这整个部分进行base64编码,编码后结果如下:

ewogICAgImlzcyI6ICJMZWZ0by5jb20iLAogICAgImlhdCI6IDE1MDAyMTgwNzcsCiAgICAiZXhwIjogMTUwMDIxODA3NywKICAgICJhdWQiOiAid3d3LmxlZnRzby5jb20iLAogICAgInN1YiI6ICJsZWZ0c29AcXEuY29tIiwKICAgICJ1c2VyX2lkIjogImRjMmM0ZWVmZTJkMTQxNDkwYjZjYTYxMmUyNTJmOTJlIiwKICAgICJ1c2VyX3Rva2VuIjogIjA5ZjdmMjVjZGIwMDM2OTljZWUwNTc1OWU3OTM0ZmIyIgp9

2.4. Signature(签名)
签名其实是对JWT的头部和负载整合的一个签名验证
首先需要将头部和负载通过.链接起来就像这样:header.Payload,上述的例子链接起来之后就是这样的:

ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9ICA=.ewogICAgImlzcyI6ICJMZWZ0by5jb20iLAogICAgImlhdCI6IDE1MDAyMTgwNzcsCiAgICAiZXhwIjogMTUwMDIxODA3NywKICAgICJhdWQiOiAid3d3LmxlZnRzby5jb20iLAogICAgInN1YiI6ICJsZWZ0c29AcXEuY29tIiwKICAgICJ1c2VyX2lkIjogImRjMmM0ZWVmZTJkMTQxNDkwYjZjYTYxMmUyNTJmOTJlIiwKICAgICJ1c2VyX3Rva2VuIjogIjA5ZjdmMjVjZGIwMDM2OTljZWUwNTc1OWU3OTM0ZmIyIgp9

由于HMacSHA256加密算法需要一个key,我们这里key暂时用leftso吧

加密后的内容为:

686855c578362e762248f22e2cc1213dc7a6aff8ebda52247780eb6b5ae91877

其实加密的内容也就是JWT的签名,类似我们对某个文件进行MD5加密然后接收到文件进行md5对比一样.只是这里的HMacSHA256算法需要一个key,当然这个key应该是使用者和接收者都知道的。

对上面的签名内容进行base64编码得到最终的签名

Njg2ODU1YzU3ODM2MmU3NjIyNDhmMjJlMmNjMTIxM2RjN2E2YWZmOGViZGE1MjI0Nzc4MGViNmI1YWU5MTg3Nw==

2.5最终的JWT

ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9ICA=.ewogICAgImlzcyI6ICJMZWZ0by5jb20iLAogICAgImlhdCI6IDE1MDAyMTgwNzcsCiAgICAiZXhwIjogMTUwMDIxODA3NywKICAgICJhdWQiOiAid3d3LmxlZnRzby5jb20iLAogICAgInN1YiI6ICJsZWZ0c29AcXEuY29tIiwKICAgICJ1c2VyX2lkIjogImRjMmM0ZWVmZTJkMTQxNDkwYjZjYTYxMmUyNTJmOTJlIiwKICAgICJ1c2VyX3Rva2VuIjogIjA5ZjdmMjVjZGIwMDM2OTljZWUwNTc1OWU3OTM0ZmIyIgp9.Njg2ODU1YzU3ODM2MmU3NjIyNDhmMjJlMmNjMTIxM2RjN2E2YWZmOGViZGE1MjI0Nzc4MGViNmI1YWU5MTg3Nw==

通过上面的一个简单的说明您是否对JWT有一个简单额认知了呢?接下来我将讲解JWT在Java编程中的使用

未完待续中...

java编程之java jwt token什么是JWT?(一)相关推荐

  1. Java编程之URI

    http://www.cnblogs.com/keis/archive/2011/03/19/1989071.html Java编程之URI 一旦拥有了URI对象,你就可以通过调用getAuthori ...

  2. 白话说编程之java线程

    白话说编程之java线程 线程和进程: 进程: 线程: 线程和进程的区别: 详解多线程: 并发 为什么使用并发 并发的执行原理 并行 线程的五种状态: 创建状态: 就绪状态: 运行状态: 阻塞状态: ...

  3. 并发编程之Java内存模型

    在介绍Java内存模型之前,先来了解一下为什么要有内存模型,以及内存模型是什么.然后我们基于对内存模型的了解,学习Java内存模型以及并发编程的三大特性. 为什么要有内存模型 在计算机中,所有的运算操 ...

  4. 小汤学编程之JAVA番外篇——Properties工具类

    一.编写 通过Java基础的学习,我们了解了Properties这种文本格式,Java程序通过专门的API可以很方便的与之进行交互.但是我们每次对Properties进行写入或读取时都要创建I/O流来 ...

  5. 小汤学编程之JAVA基础day01——JAVA基本概念、第一个JAVA程序

    一.JAVA的概念 1.名字的由来      2.java之父     3.java的分类     4.虚拟机跨平台原理 二.第一个JAVA程序 1.编译环境      2.环境变量     3.用黑 ...

  6. 网络编程之java简易聊天室实现

    最近浅学习了一些关于网络编程方面的知识,视频是跟着狂神学习的,可能学习的不是很深 说到网络,相信大家都对TCP.UDP和HTTP协议这些都不是很陌生,学习这部分应该先对端口.Ip地址这些基础知识有一定 ...

  7. 并发编程之 Java 内存模型 + volatile 关键字 + Happen-Before 规则

    前言 楼主这个标题其实有一种作死的味道,为什么呢,这三个东西其实可以分开为三篇文章来写,但是,楼主认为这三个东西又都是高度相关的,应当在一个知识点中.在一次学习中去理解这些东西.才能更好的理解 Jav ...

  8. java声明变量简单程序_零基础学编程之java变量

    01使用变量的意义 变量相当于自然语言中的代词,代词具有代替.指示作用,比如每个人的姓名,代表的就是真实的一个个体.如果没有名字,我们在交流的时候,讨论某一个人就需要说:身高1米75,单眼皮,双下巴的 ...

  9. 小汤学编程之JAVA基础day15——枚举、注解和Properties

    一.枚举 1.枚举的来由     2.枚举的作用     3.枚举的特点     4.扩展:switch里可以传入哪些类型的值 二.注解 1.作用     2.注解的种类     3.自定义注解    ...

最新文章

  1. android ui秘笈,看图说话 – Android UI 设计秘笈 :Part I
  2. mybatis和ibatis的一点区别
  3. go项目部署到linux服务器
  4. mysql中engine=innodb和engine=myisam的区别
  5. mysql创建文章表_创建表--文章表article
  6. 【php】 php 的注释和结束符号之间的关系
  7. 第9月第6天 push pop动画 生成器模式(BUILDER)
  8. hp1015驱动64位_惠普1015打印机驱动下载
  9. Mac:如何配置java和maven环境变量
  10. 485串口和计算机通信,485串口通信 485通讯与串口通讯区别
  11. uniapp路线规划
  12. CANVAS LMS开源系统
  13. 运行阶段及面向对象技巧
  14. DDD学习(一)——通用语言
  15. Java 输出全部的希腊字母
  16. P2918 [USACO08NOV]Buying Hay S(买干草)(ssl 2895)
  17. 局域网内简易网站的发布
  18. 怎么主动发起话题_怎么跟喜欢的人聊天找话题?这8个技巧让你侃侃而谈
  19. 最炙手可热的行业——大数据就业方向和学习路线图详解
  20. 最优控制理论 六、拉格朗日乘子法和KKT条件

热门文章

  1. 【新解法】华为OD机试 - 关联子串 | 备考思路,刷题要点,答疑,od Base 提供
  2. Vue中如何进行滚动加载与无限滚动?
  3. Stata:正则表达式教程
  4. 12.Java- Maven 教程
  5. 注解和反射12.动态创建对象执行方法
  6. 国家反诈中心实名认证教程
  7. 2020第十一届蓝桥杯国赛(决赛)C/C++ B组F题皮亚诺曲线距离题解
  8. 招聘程序员为啥大多要本科生?就算不是本专业也行?
  9. UI一揽子计划 12 (模态ViewController、单例、通讯录实战、)
  10. Node-RED教程(八):Node-RED网络节点的使用