JWT学习小结
JWT全称JSON-Web-Tokens,是一套应对Http其无状态且明文传递请求的特性的规范,保证请求的安全性。我们一般用它来在服务端和客户端之间传递用户的身份信息,实现状态保持。
1,相较于常见的session+cookie的实现方式,它有哪些优势呢?
Session: 每次用户登录认证通过后,我们的应用都要在服务端(通常为redis服务器中)存储用户的登录信息,并在响应中设置cookies中设置session的key值进行返回。这在服务器实现负载均衡时,增加负载均衡服务器的性能负担。而面对CSRF攻击时, 因为是基于cookie+session的方式来进行用户识别的, cookie一旦被截获,用户就会很容易受到跨站请求伪造的攻击。
JWT:
2,JWT的组成:
JWT是一串加密后的字符串,共由三部分组成,分别为:头部,载荷和签名信息。
头部(header)
{
"alg": "HS256", # 使用的签名算法
"typ": "JWT", # 令牌的类型
}
载荷(payloader),用于存放有效信息。
{
"id": user.id, # 接口中定义的需要返回的信息
"mobile": user.mobile # 同上
}
签名(signature),第三部分是将header和payload用base64进行转码后的字符串拼接的结果用header中指明的算法进行加密再用base64转码。
def encode(payload, signer=None, encrypter=None):
if signer and encrypter:
raise SignAndEncryptError() headers = {'typ': 'JWT', 'alg': 'none'}
if signer:
#更新你所选用的算法,一般都是hs256
headers.update(signer.headers)
if encrypter:
headers.update(encrypter.headers) #头部序列化
headers_json = json.dumps(headers, separators=(',', ':')) #消息主体序列化
payload_json = json.dumps(payload, separators=(',', ':')) #使用base64来编码
header_b64 = b64encode(headers_json)
payload_b64 = b64encode(payload_json) first_part = header_b64
second_part = payload_b64
third_part = '' if signer:
#jwt 签名的生成方式. 他会把header playload的base64url编码加密后再次base64编码.
third_part = b64encode(signer.sign(first_part + '.' +
second_part))
if encrypter:
pass # TODO #返回可用的JWT
return first_part + '.' + second_part + '.' + third_part def b64encode(data):
return base64.urlsafe_b64encode(data).rstrip('=') #使用hmac来加密 class HmacSha(JwsBase):
def sign(self, signing_input, key=None):
if not key:
key = self.key
if not key:
raise KeyRequiredException()
return hmac.new(key, signing_input, self.digestmod).digest()
3、JWT的防篡改
加密后的Token在下次请求时, 服务端通过加密生成的私钥,重新与前2部分组合再次加密,与第三部分进行对比,如果校验成功,则数据没有被修改。
4、JWT防止CSRF攻击
JWT学习小结的更多相关文章
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ExtJs学习笔记之学习小结LoginDemo
ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 点滴的积累---J2SE学习小结
点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...
- (转) Parameter estimation for text analysis 暨LDA学习小结
Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...
- dubbo学习小结
dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...
随机推荐
- tomcat8常用配置说明
链接:https://www.jianshu.com/p/8b1c75951f70 2.tomcat8运行期错误HTTP头解析错误 修改tomcat的server.xml中的中配置 设置为8k &l ...
- Async CallBack promise fetch
Callback (回调函数) 在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可 ...
- (2018 Multi-University Training Contest 3)Problem L. Visual Cube
//题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6330//题目大意:按照一定格式画出一个 a×b×c 的长方体. #include <b ...
- 非关系统型数据库-mangodb
第三十六课 非关系统型数据库-mangodb 目录 二十四 mongodb介绍 二十五 mongodb安装 二十六 连接mongodb 二十七 mongodb用户管理 二十八 mongodb创建集合. ...
- .Net Core+Angular6 学习 第二部分(创建Angular6项目)
. 创建angular6 前提: 需要安装nodejs以及angular的脚手架,Angular官网要求Angular6.0必须在node 8.x 和 npm 5.x 以上的版本才能正常使用. 我的版 ...
- 洛谷P1091 合唱队形
输入输出样例 输入样例#1: 8 186 186 150 200 160 130 197 220 输出样例#1: 4 此题意在先升后降子序列,单调递增子序列,单调递减子序列当中找到最长的一组序列. 因 ...
- h5页面使用sessionStorage滚动到上次浏览器位置《原创》
前言: 因最近移动端开发过程中遇到一个运营提出的所谓技术难点需求,对于原生APP来说轻而易举,毕竟自己的APP用户操作指哪打哪,但是H5该怎么做?H5就实现不了么?对于一个爱研究攻克这些前端棘手问题的 ...
- zsh 缺省输入设置
zsh 默认缺省方式和bash不兼容,终端输入指令带有* 并不能对所有以已经输入的部分作为开头的文件作处理,解决这个问题的方式是在.zshrc文件中加入 setopt no_match 即可
- Delphi非官方的补丁
http://git.kngstr.com/KngStr/delphi-fixes 使用方法 方法一: 1. 拷贝需要的补丁文件到你的工程目录 2. 拷贝编译的时候缺少或错误的文件到你的工程目录 优缺 ...
- 微信浏览器软键盘弹出与页面resize的问题
使用微信打开网页,弹出软键盘时遇到的兼容问题 过去开发中遇到过很多这种情况,页面底部需要固定定位一个按钮,广告栏或者菜单栏,页面中有表单项需要填写,在打开手机虚拟键盘的时候,底部固定定位的元素会处在软 ...