5分钟搞懂:JWT(Json Web Token)
https://www.qikegu.com/easy-understanding/892
JWT
基于token的用户认证原理:让用户输入账号和密码,认证通过后获得一个token(令牌),在token有效期里用户可以带着token访问特定资源。
开始token并没有一个统一标准,大家都各自使用自己的方案。后来出现了JWT(Json Web Token)这个标准。
JWT本质上是一个对JSON对象加密后的字符串。当服务器认证用户通过后,一个包含用户信息的json对象被加密后返回给用户,json对象:
{
"UserName": "老王",
"Role": "admin",
"Expire": "2019-01-10 20:10:00"
}
之后,用户访问服务器时,都要返回这个json对象。服务器只靠这个对象就可以识别用户身份,不需要再去查数据库。为了防止用户篡改数据,服务器在生成对象时将添加一个签名。
服务器不保存任何会话数据,也就是说,服务器变得无状态,从而更容易扩展。
JWT的结构
典型的JWT由三个部分组成,每个部分由一个点(.)分隔。
- Header
- Payload
- Signature
header.payload.signature
Header
头部包含所使用的签名算法和令牌的类型(即JWT),这部分会被编码为Base64URL格式。
{
"alg": "HS256",
"typ": "JWT"
}
Base64URL的格式:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Base64URL
Base64编码后可能出现字符+和/,在URL中不能直接作为参数,Base64URL就是把字符+和/分别变成-和_。JWT有可能放在url中,所以要用Base64URL编码。
Payload
Playload包含实际要传输的信息,附带一些其他信息如过期时间、发行时间等。JWT指定了一些官方字段(claims)备用:
- iss: 签发人
- exp: 过期时间
- iat: 签发时间
- nbf: 生效时间
- jti: 编号
- sub: 主题
- aud: 受众
除了官方字段,在这个部分还可以添加私有字段,例如:
{
"sub": "1234567890",
"name": "隔壁老王",
"iat": 1516239022
}
这部分也是Base64URL编码的:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IumalOWjgeiAgeeOiyIsImlhdCI6MTUxNjIzOTAyMn0
Signature
Signature部分是对前两部分的防篡改签名。将Header和Payload用Base64URL编码后,再用点(.)连接起来。然后使用签名算法和密钥对这个字符串进行签名:
signature = hmac_sha256(base64encode(header) + '.' + base64encode(payload), 'MY_SUPER_SECRET_KEY')
这个密钥(MY_SUPER_SECRET_KEY)只有服务器才知道,不能泄露给用户。
签名信息:
huj1R4oYsSxbIpecRwGcDBzqFkL9dXA88P2ouM5xhT8
组合在一起
3部分组合在一起,构成了完整的jwt:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IumalOWjgeiAgeeOiyIsImlhdCI6MTUxNjIzOTAyMn0.huj1R4oYsSxbIpecRwGcDBzqFkL9dXA88P2ouM5xhT8
JWT怎么用
浏览器接收到服务器发过来的jwt后,可以存储在Cookie或localStorage中。
之后,浏览器每次与服务器通信时都会带上JWT。可以将JWT放在Cookie中,会自动发送(不跨域),或将JWT放在HTTP请求头的授权字段中。
Authorization: Bearer <token>
也可放在url中,或POST请求的数据体中。
注意
- JWT默认是不加密的,但也可以加密,不加密时不宜在jwt中存放敏感信息
- 不要泄露签名密钥(MY_SUPER_SECRET_KEY)
- jwt签发后无法撤回,有效期不宜太长
- JWT泄露会被人冒用身份,为防止盗用,JWT应尽量使用https协议传输
5分钟搞懂:JWT(Json Web Token)的更多相关文章
- 如何在SpringBoot中集成JWT(JSON Web Token)鉴权
这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...
- Java JWT: JSON Web Token
Java JWT: JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand libr ...
- JWT(JSON Web Token) 【转载】
JWT(JSON Web Token) 什么叫JWTJSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. 一般来说,互联网用户认证是这样子的. 1.用户向服务器发送用户名和密码. ...
- [更新]一份包含: 采用RSA JWT(Json Web Token, RSA加密)的OAUTH2.0,HTTP BASIC,本地数据库验证,Windows域验证,单点登录的Spring Security配置文件
没有任何注释,表怪我(¬_¬) 更新: 2016.05.29: 将AuthorizationServer和ResourceServer分开配置 2016.05.29: Token获取采用Http Ba ...
- ( 转 ) 什么是 JWT -- JSON WEB TOKEN
什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...
- 关于JWT(Json Web Token)的思考及使用心得
什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(php 后端实现JWT认证方法一般用来做轻量级的API鉴权.由于许多API接口设计是遵循无状态的(比如 ...
- 什么是JWT(Json Web Token)
什么是 JWT (Json Web Token) 用户认证是计算机安全领域一个永恒的热点话题. JWT 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该to ...
- API安全验证之JWT(JSON WEB TOKEN) OLCMS
假如www.olcms.com/getUserInfo获取用户信息,你怎么知道当前用户是谁?有人说登陆时候我把他UID写入session了,如果是API接口,没有session怎么办,那么就需要把UI ...
- JWT(Json Web Token)认证
目录 JWT(Json Web Token) JWT的数据结构 JWT的用法 JWT验证流程
随机推荐
- js判断数组中是否包含某个元素
参考:http://www.runoob.com/jquery/misc-inarray.html js判断数组中是否包含某个元素 $.inArray( value, array [, fromInd ...
- myeclipse汉化
MyEclipse默认安装在计算机用户目录下面,安装完成后对MyEclipse快捷方式使用鼠标右键属性---打开文件位置--进入安装的目录下面即可看到 zh_CN.7z解压缩将zh_CN目录文件放到 ...
- Ajax--数据格式
1.从服务端接收数据的时候,那些数据必须以浏览器能够理解的格式来发送,服务器端的编程语言智能以如下三种格式返回数据:1)XML; 2)JSON; 3)HTML; 2.解析HTML: --HTML由一些 ...
- SpringBoot 入门demo
创建SpringBoot项目方式一 (1)新建maven项目,不使用骨架. 使用maven管理依赖就行了,不必使用骨架(模板). (2)在pom.xml中添加 <!--springboot核心. ...
- 077、Java数组之分步实现数组操作
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 1-3SpringBoot之Controller使用
Controller的使用 @Controller 处理http请求 @RestController Spring4之后新加的注解,原来返回json需要@ResponseBody配合@Controll ...
- Java图形与文本(18)
实例018 旋转图形 实例说明 本实例演示在Java中绘制图形时,如何对图形进行旋转.运行程序,单击窗体上的“顺时针”按钮,可以将图形顺时针旋转,效果如图1.18所示,用户还可以通过单击“逆时针”和 ...
- 吴裕雄--天生自然JAVA数据库编程:JDBC2.0操作
import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import j ...
- uni app中关于图片的分包加载
因为在项目中使用了大量的静态资源图片,使得主包体积过大, 而把这些图片全部放到服务器又有点麻烦,就想能不能把图片也分包,但是直接放在分包下的话导致图片资源找不到了, 在社区中看到大佬分享的十分有用,特 ...
- 【pwnable.tw】 starbound
此题的代码量很大,看了一整天的逻辑代码,没发现什么问题... 整个函数的逻辑主要是红框中两个指针的循环赋值和调用,其中第一个指针是主功能函数,第二个数组是子功能函数. 函数的漏洞主要在main函数中, ...