1.JWT以什么样的形式存在?

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

2.JWT的构成?

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).

3.JWT的头部header

jwt的头部承载两部分信息:

  • 声明类型,这里是jwt
  • 声明加密的算法 通常直接使用 HMAC SHA256

如下列例子:然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.

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

4.base64编解码

echo 'abc' | base64  编码

echo 'sdfsd==' | base64  -D  解码

5.载荷(payload)就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分,将其进行base64位编码,然后形成第二部分。

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}

6.签证(signature)由三部分组成,经过base64位编码后的(header,payload,secret加密方式)

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload); var signature = HMACSHA256(encodedString, 'secret'); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。

7.应用JWT

一般是在请求头里加入Authorization,并加上Bearer

fetch('api/user/1', {
headers: {
'Authorization': 'Bearer ' + token
}
})

8.JWT验证流程

(1)浏览器端(客户端)post/user/login + username and password 浏览器在登录表单中输入用户名密码进行登录操作。

(2)服务器接收到了用户名密码后,利用secret加密方式生成一个JWT,

(3)将该JWT返回给浏览器browser

(4)浏览器接收到JWT之后,将JWT放在自己的请求头中,想服务器端请求数据

(5)服务器端检查JWT的签证,获取到JWT中的payload中的声明信息

(6)然后将请求的数据响应给浏览器

9.JWT的优点

  • 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
  • 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
  • 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
  • 它不需要在服务端保存会话信息, 所以它易于应用的扩展

10.JWT的注意事项

  • 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
  • 保护好secret私钥,该私钥非常重要。
  • 如果可以,请使用https协议

最新文章

  1. 【C语言入门教程】5.5 实现问题(效率)
  2. 《BI项目笔记》创建时间维度(2)
  3. Unity4.5版本DLL库名字问题
  4. 【matlab】读写文件
  5. Java中使用验证码和二维码
  6. 在oracle中where 子句和having子句中的区别
  7. POJ 2001 字典树(入门题)
  8. JVM内存管理和JVM垃圾回收机制
  9. poj 3176 Cow Bowling(dp基础)
  10. 多种下载文件方式 Response.BinaryWrite(byte[] DocContent);Response.WriteFile(System.IO.FileInfo DownloadFile .FullName);Response.Write(string html2Excel);
  11. Struts2--默认Action
  12. 队列(FIFO)—循环队列、队列的链式存储
  13. Lock详解
  14. 通过dbutil操作数据库
  15. xml文件里 用js语句获取 当前时间
  16. mongodb索引--1亿条记录的查询从55.7秒到毫秒级别<补充版>
  17. Golang 并发Groutine实例解读(一)
  18. Angular动态表单生成(六)
  19. js 的filter()方法
  20. ios逆向工程-内部钩子(Method Swizzling)

热门文章

  1. WebApi笔记
  2. Unity3d 拖拽脚本报错 Can’t add script
  3. day07 分支,循环
  4. jenkins 展示报告
  5. Codeforces Round #506 (Div. 3) A-C
  6. My97 DatePicker获取自定义日期的前一天
  7. BZOJ 1878 HH的项链 (树状数组+离线)
  8. [读书笔记] R语言实战 (二) 创建数据集
  9. ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)
  10. 【2018 Multi-University Training Contest 2 1007】Naive Operations