漫谈JWT

一、JWT简介【对于了解JWT的童鞋,可以直接跳到最后】

咱们就不弄那些乱七八糟的概念,就简单点说一下JWT是什么、有什么和能干什么

1、 JWT概念和作用

JWT全称为json web token,说白了是什么呢? 就仅仅只是一个字符串而已,例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6dHJ1ZX0.OLvs36KmqB9cmsUrMpUutfhV52_iSz4bQMYJjkI_TLQ 这样。

O(∩_∩)O 是不是特别长,特别丑?没关系,现在给大家解释一下这个东东到底是什么

2、JWT组成【对于JWT有基本了解的人可以忽略这一部分】

JWT包含了三个主要部分: Header.Payload.Signature,以" . "来进行分割,以上式举例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6dHJ1ZX0.
OLvs36KmqB9cmsUrMpUutfhV52_iSz4bQMYJjkI_TLQ

注意尾巴上的两个点哦。

2.1 Header作用

Header部分主要存储关于签名算法的信息,通常不包含两个部分:token类型和采用的加密算法,大致源内容如下:
{ "alg": "HS256", "typ": "JWT"} ,然后使用Base64Url编码组成了Header部分,结果大致如:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。

2.2 Payload作用

Payload翻译过来就是负载嘛,就是装东西嘛对不对,所以这一部分其实是用来存储一些信息的,至于是什么信息呢,重点来了 ----> 无所谓,惊不惊喜,意不意外?

其实Payload是一个比较重要的部分,这个东西其实就是一个数据实体,俗称Claim,JWT并不强制使用,它默认这一部分数据为业务数据,是系统业务需要的数据,可有可无,可多可少。一般在不特殊修改的情况下,主要包含几个部分: iss(签发者),exp(过期时间戳), sub(面向的用户), aud(接收方), iat(签发时间),大致的源样式是这样:
{ "sub": "1234567890", "name": "John Doe", "admin": true},经过Base64Url 编码以后,会变成JWT的第二部分字符串:eyJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6dHJ1ZX0。

2.3 Signature作用

创建签名需要使用编码后的header和payload以及一个秘钥,组成的公式:编码后的header、编码后的payload、一个secret进行加密HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

以上就是JWT的几个主要组成部分。

3、JWT的主要作用

JWT最开始的初衷是为了实现授权和身份认证作用的,可以实现无状态、分布式的Web应用授权,大致实现的流程如下:

图中内容可见,JWT的使用流程大致有几步:

1、客户端需要携带用户名/密码等可证明身份的内容去授权服务器获取JWT信息;

2、每次服务都携带该Token内容与Web服务器进行交互,由业务服务器来来验证Token是否是授权系统发放的有效Token,来验证当前业务是否请求是否合法。

注意:这里很多刚接触JWT的童鞋经常会问一个问题,是不是每次请求都申请一次Token,这里需要注意,如果不是对于安全性要求非常高的情况,不建议每次请求都申请,因为会增加业务耗时,大部分时候我个人喜欢在登陆时申请,然后使用JWT的过期时间或其他手段来保障JWT的有效性

后来随着JWT使用的场景的成熟,逐渐引申的意义也可以抵御跨站请求伪造攻击【就不解释这是什么了,可以百度一下】和签名验签的流程。

以下是福利环节,也是重点答疑环节。

a)如何保证JWT的安全呢?

注意,这里经常会有一个误区,JWT本身和安全没关系,它就仅仅只是一个字符串,使用它来做安全远不如类似于RSA2这样的非对称加密的形式来的实在,由于客户端的程序对用户几乎完全透明,验签的过程对于他们来讲也是透明的,所以安全性肯定不会靠这个来实现,如果实在怕JWT的被盗取,可以考虑在Payload部分加入一些客户端独有的非敏感信息,用于在服务端来进行核验,比如使用MAC-Message Authentication Code、或者公钥之类的等等; 或者干脆就把生效时间设置的短一些,也可以减少暴漏的风险。

b)要不要将用户信息存入Payload呢

其实是一个道理,由于JWT本身没有安全性可言,所以存储用户信息,尤其是敏感数据是一件很可怕的事情,建议不要存放这一类信息;而且将太多的信息存入Payload以后,就增加了网络传输以及签名和验签的复杂度,也会造成时间的浪费;

c)如果想上传视频,如何使用JWT进行签名呢

这件事要分两头说,JWT签名对我个人而言,并不是所有数据都要签名,因为会增加业务耗时和复杂度,所以我一般都是对一些敏感数据才会进行签名。基于以上基点,不难分析出这个问题的答案:
1、如果视频并不算敏感数据,那么自然就不存在签名问题
2、如果确实认为视频是敏感数据,可以通过nodejs之类的东东获取到上传文件的对象,然后进行操作,当然,这是一个非常复杂的工作,要有心理准备哦。
3、这个问题其实仅仅只是一个例子,所有类似的问题处理方法差不多,只要意识到什么数据应该签名,什么数据可以不签名,其他都是一些技术细节,这里就不讨论了。

原文地址:https://www.cnblogs.com/kkdn/p/9328266.html

时间: 2024-10-13 06:46:51

漫谈JWT的相关文章

漫谈认证与授权

原文:漫谈认证与授权 漫谈认证与授权 Intro# 认证与授权一直以来都是很多人在讨论的话题,之所以想这次谈一谈认证和授权,主要是因为最近看到许多文章都把认证和授权混为一谈,把认证方式当作是授权方式.所以想写篇文章谈谈我眼中的认证与授权 Authentication# 什么是认证?认证是一个尝试解决我是谁的问题的过程. 以一个 HTTP 请求为例,认证就是 尝试 从请求信息中获取用户信息的过程, 有一点需要特别注意:认证并不等于一定有用户信息,有些文章直接把认证等同于有用户信息,再次强调,认证就

beego应用做纯API后端如何使用jwt实现无状态权限验证

jwt是什么,可以百度下其它文章,我原来看到一个讲的详细的,现在找不到了.先简单介绍下我个人的理解,就是一个token,只不过通过加密解密的手段,能让这一串字符带有一些简单的信息.这样解密jwt后不用查数据库,最常用的例子,保存用户权限,再多层的权限,其实只用一个数字,转换成二进制,每一位代表一种权限.类似这样的使用,还有保存session的key,通过该值查session就能获取更丰富的资料,用来保存用户状态也是可以的. 下面介绍下我的一个golang项目中使用beego框架做纯API接口使用

基于Token的身份验证——JWT(转)

本文转自:http://www.cnblogs.com/zjutzz/p/5790180.html 感谢作者 初次了解JWT,很基础,高手勿喷.基于Token的身份验证用来替代传统的cookie+session身份验证方法中的session. JWT是啥? JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为: A.B.C A由JWT头部信息header加密得到B由JWT用到的身份验证信息json数据加密得到C由A和B加密得到,是校验部分 怎样生成A? header格式为: { "typ

asp.net core 2.0 web api基于JWT自定义策略授权

JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端验证通过即可能获取想要访问的资源.关于JWT的技术,可参考网络上文章,这里不作详细说明, 这篇博文,主要说明在asp.net core 2.0中,基于jwt的web api的权限设置,即在asp.net core中怎么用JWT,再次就是不同用户或角色因为权限问题,即使援用Token,也不能访问不该访

#51CTO学院四周年#详解JWT的结构与应用

1. JWT是什么? JWT,全称JSON WEB TOKEN, 是WEB客户端与服务器之间相互进行安全通信的规范.通信双方的对象本身通过JSON传递数据是不安全的,但是由于有了数字签名的存在,这些信息变的可信的. 2. JWT特点 简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库 3. JWT的应用场景 身份认证:当用户在客户端完成

spring security oauth2 jwt 认证和资源分离的配置文件(java类配置版)

最近再学习spring security oauth2.下载了官方的例子sparklr2和tonr2进行学习.但是例子里包含的东西太多,不知道最简单最主要的配置有哪些.所以决定自己尝试搭建简单版本的例子.学习的过程中搭建了认证和资源在一个工程的例子,将token存储在数据库的例子等等 .最后做了这个认证和资源分离的jwt tokens版本.网上找了一些可用的代码然后做了一个整理, 同时测试了哪些代码是必须的.可能仍有一些不必要的代码在,欢迎大家赐教. 一.创建三个spring boot 工程,分

REST API-- spring boot jwt

原文  https://juejin.im/post/58c29e0b1b69e6006bce02f4 通常情况下,把API直接暴露出去是风险很大的,不说别的,直接被机器攻击就喝一壶的.那么一般来说,对API要划分出一定的权限级别,然后做一个用户的鉴权,依据鉴权结果给予用户开放对应的API.目前,比较主流的方案有几种: 用户名和密码鉴权,使用Session保存用户鉴权结果. 使用OAuth进行鉴权(其实OAuth也是一种基于Token的鉴权,只是没有规定Token的生成方式) 自行采用Token

认证 协议 JWT OAuth Session Cookie

本文翻译自Auth-Boss. 如果有翻译的不恰当或不对的地方, 欢迎指出. 成为一个认证老司机, 了解网络上不同的身份认证方法. 本文档的目的是记录和编目Web上的身份验证方法.认证指的是创建一个系统的过程,用户可以通过该系统"登录"在线服务,并授予对受保护资源的访问权限.以下引用可能更好地总结我想要解释的内容: 客户端认证涉及向Web上的服务器证明客户端(或用户)的身份.[1] How 我写作风格简洁,会用到一些技术词. 免责声明:本文档不作为包含所有认证方法的网络的目录;本文档也

使用JWT的OAuth2的SSO分析

参考:https://github.com/spring-guides/tut-spring-security-and-angular-js/blob/master/oauth2/README.adoc http://jwt.io/introduction/ 本文在<使用OAuth2的SSO分析>文章的基础上扩展,使用jwt可减少了向认证服务器的请求,但jwt比swt(Simple Web Tokens)要长不少,还要依赖公钥解密. 1.浏览器向UI服务器点击触发要求安全认证 2.跳转到授权服