JWT的介绍解析

1、什么是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):负载中包含了全部用户所须要的信息,避免了屡次查询数据库

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

2.1.JWT结构

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

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

注意,顺序是 header.payload.signature安全

最终的结构有点像这样:bash

leftso.com.blog
复制代码

固然真实的jwt不多是这么简单的明文编码

2.2.JWT的头部(Header)加密

在header中一般包含了两部分:token类型和采用的加密算法。以下:spa

{
  "alg": "HS256",
  "typ": "JWT"
}  
复制代码

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

将上面的内容进行base64编码,能够获得咱们JWT的头部,编码后以下:code

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==
复制代码
相关文章
相关标签/搜索