【web】JWT(Json web token)的原理、签发、验证

作者:神秘网友 发布时间:2020-10-31 20:24:41

【web】JWT(Json web token)的原理、签发、验证

【web】JWT(Json web token)的原理、签发、验证

1.JWT

JWT(Json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景

http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证。后来出现了cookie和session,传统的session认证虽然安全,但是本身很难得到扩展,不方便在多台服务器认证,一般会增大开销,而且还可能会造成CSRF攻击

而token认证机制不需要考虑用户在哪一台服务器登录,只要携带可以被认证的token即可访问多台服务器

流程如下:
1)用户使用用户名密码来请求服务器
2)服务器进行验证用户的信息
3)服务器通过验证发送给用户一个token
4)客户端存储token,并在每次请求时附送上这个token值
5)服务端验证token值,并返回数据

优点
1)JWT是可以进行跨语言支持的,大多数语言都能实现
2)JWT可以存储一些其他业务逻辑所必要的非敏感信息
3)JWT构成非常简单,字节占用很小,所以非常便于传输
4)它不需要在服务端保存会话信息, 所以它易于应用的扩展

注意点
1)因为payload部分可解密,所以不要放敏感信息
2)一定要保护好秘钥,有了秘钥就能自由签发JWT

2.JWT的组成

【web】JWT(Json web token)的原理、签发、验证

jwt是由三段文本通过点连接组成的,例如

eyJ0eXAiOiJXXXXXXX.eyJzdWIiOjXXXXXXX.TJVA95OrMcBXXXXXXXX

由两个小数点分隔开的三个部分分别叫做header、payload、signature

2.1 header

头部(header)又包含类型和算法两个键值,再经过base64加密即可

header = {
    'typ': 'JWT',
    'alg': 'HS256'
}
header = json.dumps(header)  # 把字典dump成一个字符串json
header = base64.b64encode(header.encode()).decode()
print("header", header)
# 打印:header eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJIUzI1NiJ9
2.2 payload

载荷(payload)一般用来存储用户信息,但是注意,这个是base64编码,所以可以解码,不要存储敏感信息

payload = {
    'user_id': 25,
    'username': 'pan'
}
payload = json.dumps(payload)
payload = base64.b64encode(payload.encode()).decode()
print("payload:", payload)
# 打印:payload: eyJ1c2VyX2lkIjogMjUsICJ1c2VybmFtZSI6ICJwYW4ifQ==
2.3 signature

签名(signature)是根据前面经过base64编码的header、payload经过哈希算法加密得到的。注意,秘钥非常重要,不能泄露,泄露了,就意味着客户端可以自我签发jwt了

SECRET_KEY = 'sfjoprenpxgyher245asdfdsa'
message = header + "." + payload
h_obj = hmac.new(
    key=SECRET_KEY.encode(),
    msg=message.encode(),
    digestmod=hashlib.sha256
)
signature = h_obj.hexdigest()
print("signature", signature)

3.JWT验证

jwt的签发和和验证都是由服务器完成的,所以秘钥保存在服务器端。验证步骤与签发步骤相反,一定要使用同一个秘钥

token = 前端传来的jwt
SECRET_KEY = 'sfjoprenpxgyher245asdfdsa'
old_header = token.split(".")[0]
old_payload = token.split(".")[1]
old_signature = token.split(".")[2]

message = old_header + "." + old_payload
h_obj = hmac.new(
    key=SECRET_KEY.encode(),
    msg=message.encode(),
    digestmod=hashlib.sha256
)
signature = h_obj.hexdigest()
if signature != old_signature:
    print("验证失败")
else:
    print("验证成功")
    user_json = base64.b64decode(old_payload.encode()).decode()
    print(json.loads(user_json))

以上的演示是用python代码写的,实际上不管哪种语言都能实现。而且,一般框架都会集成JWT模块,不需要手动实现

【web】JWT(Json web token)的原理、签发、验证相关教程

  1. JavaWeb - 【Filter】表单显示

    JavaWeb - 【Filter】表单显示 需求分析 程序设计 MyFilter index.jsp product_input.jsp table product_details.jsp 效果测试 一:需求分析 二:程序设计 1 MyFilter package xyz.xx.filter;import org.apache.commons.beanutils.BeanUtils;import xyz.xx.po

  2. 记一次FastJson,json转map出的问题com.alibaba.fastjson.JSONEx

    记一次FastJson,json转map出的问题com.alibaba.fastjson.JSONException: parse number key errorpos 15 在一次json转map的代码上报出了这个的异常。 com.alibaba.fastjson.JSONException: parse number key errorpos 15 1.通过看日志文件,和报错信息,能确

  3. Fisco Bcos区块链浏览器(WeBase)环境搭建

    Fisco Bcos区块链浏览器(WeBase)环境搭建 安装 mysql sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install libmysqlclient-dev 检查是否按照成功 sudo netstat -tap | grep mysql 安装MySQL-python sudo apt-get in

  4. springboot项目里面,关于jQuery的webjars依赖的导入,前端的引

    springboot项目里面,关于jQuery的webjars依赖的导入,前端的引入格式是什么 1 导入jQuery的webjars依赖 dependency groupIdorg.webjars/groupId artifactIdjquery/artifactId version3.5.0/version /dependency 2 前端的HTML里面导入jQuery script src=webja

  5. JSONPath表达式

    JSONPath表达式 JSONPath是一种简单的方法来提取给定JSON文档的部分内容。JSONPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。 1、操作符 ?:问号,标记表达式的开头。使用的语法 [?(表达)] 例如:[

  6. 攻防世界 web新手练习区题解 下

    攻防世界 web新手练习区题解 下 攻防世界 web新手练习区题解 下 simple_php get_post xff_referer webshell command_execution simple_js simple_php 题目直接给出了源码,我们直接来分析一下,首先题目是要求我们通过get方式传递一个名为a和一个名为b的参数

  7. 【超详细】C++Json:VS2015的jsoncpp库配置及简单使用

    【超详细】C++Json:VS2015的jsoncpp库配置及简单使用 Json Json是一种数据格式,本来是用于JavaScript的,但是因为他易读,格式明朗等原因,也被用于其他语言中。 JsonCpp是一个C++的Json库,利用他我们可以进行数据传输,状态同步。 可以从官网下载,也可以

  8. webstorm编译less 自动压缩生成的css

    webstorm编译less 自动压缩生成的css webstorm自带less,不过要编译的话需要nodejs环境。 1.首先去node的主页下载对应版本的nodejs然后安装,下载地址:http://nodejs.org/ 2.安装完之后打开命令提示符(win+r),分别输入node -v以及npm -v如果返回版本号说明