JWT (一):认识 JSON Web Token
JWT(一):认识 JSON WebToken
JWT(二):使用 Java 实现 JWT
什么是 JWT?
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,作为 JSON 对象在各方之间安全的传递信息。这个信息可以通过数字签名进行验证并信任。JWTs 可以使用密钥(结合 HMAC 算法)或者 使用 RSA 、 ECDSA 加密的公钥私钥对进行签名。
尽管 JWTs 能够在各方之间也提供安全加密,但是仍**专注于签名 Token **。当其他方隐藏了加密 Token 的某些声明时,签名 Token 可以验证声明的完整性。当Token使用公钥私钥对进行签名时,这个签名还能证明只有拥有私钥的一方才是签发它的一方。
什么时候使用 JWT ?
- 授权:这是 JWT 最普遍的使用场景。当用户登录之后,每次请求中都包含 JWT ,服务端允许用户访问那些只有携带 token 才能访问的路由、服务、资源。目前在单点登录中广泛使用到 JWT ,因为它体积小,且能够在不同域名之间使用。
- 信息交换: JWT 是一种能够在各方之间安全传输信息的好方式。因为 JWTs 能够签名,比如使用公钥私钥对,你能够确定发送者的身份。另外,签名是使用 Header 和 Payload 通过特定算法计算而来,所以你也可以验证内容是否被篡改。
JWT的结构
JWT 包含三部分,之间以点(.)连接
- Header(头部)
- Payload(负载)
- Signature(签名)
一个典型的 JWT 如同下面这样:
xxxxx.yyyyy.zzzzz
一个真实的 JWT 例子:

Header
Header部分 是一个 JSON 对象,典型的header包含两部分:
alg:使用的签名算法,比如 HMAC SHA256 或 RSAtyp:token的类型,比如 JWT
{
"alg": "HS256",
"typ": "JWT"
}
最后,用 Base64Url 将这个 JSON 对象编码后,作为 JWT 的第一部分
Payload
Payload 部分也是 JSON 对象,用来存放数据。JWT 有7个官方字段:
- iss (issuer):签发人
- exp (expiration time):过期时间,以秒为单位
- iat (Issued At):签发时间,能够算出JWT的存在时间
- nbf (Not Before):生效时间
- jti (JWT ID):JWT 的唯一标识。用来防止 JWT 重复。
- sub (subject):主题(很少使用)
- aud (audience):token的受众(很少被使用)
除了上面这些字段,还可以自定义私有字段,比如
{
"userId": "1101",
"userName": "张三",
"age": "23"
}
最后,用 Base64Url 将这个 JSON 对象编码后,作为 JWT 的第二部分
Tip: JWT 默认不加密,任何人都可以读取,所以不要把敏感信息存放在这个部分,除非加密过。
Signature
使用 Header 指定的算法对 Header、Payload、密钥三部分进行签名,生成的字符串作为 JWT 的第三部分。
比如使用 HMAC SHA256 算法进行签名:
HMACSHA256(
Base64Url.encode(header) + "." + Base64Url.encode(payload),
secret
)
签名可以用来验证数据是否被篡改,而且如果 token 使用私钥进行了签名,那么该签名还可以验证 JWT 发送者的身份。
怎么使用 JWT ?
客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次请求服务器,都要带上这个 JWT。所以可以把它放在 Cookie 里面自动发送,但是这样并不能跨域,所以更好的做法是放在 HTTP 请求的头信息 Authorization 字段里面。
Authorization: Bearer <token>
另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。
JWT 的特点
- JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次
- JWT 不加密的情况下,不能将敏感数据写入 JWT
- JWT 不仅可以用于认证,也可以用于交换信息
- JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦签发了 JWT ,在到期之前就会始终有效
- JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
- 为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
和 Session-Cookie 相比
Session-Cookie 方式:客户端每次请求都使用 cookie 携带 session_id ,服务器根据 session_id 区分不同的会话
JWT 方式:客户端每次请求都使用请求头携带 token,服务器根据 token 区分不同的用户
JWT (一):认识 JSON Web Token的更多相关文章
- gitlab无法push或clone的错误:JWT::DecodeError (Nil JSON web token): lib/gitlab/workhorse.rb:120:in `verify_api_request!'
使用源码安装的方式升级gitlib7.14到gitlab-8.13.5中文版,然后push的时候报错: 错误信息如下: Started GET "/gitlab/hushizhi/gitla ...
- 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)
我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...
- JWT详解-(JSON Web Token教程)
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法. 一.跨域认证的问题 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和密 ...
- Hacking JWT(JSON Web Token)
0x01 JWT工作流程 JSON Web Token(JWT)是一个非常轻巧的规范. 这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. JWT常被用于前后端分离,可以和Restful ...
- JSON Web Token (JWT) 简介
JSON Web Token (JWT) 是一种基于 token 的认证方案. JSON Web Token 的结构 一个 JWT token 看起来是这样的: eyJhbGciOiJIUzI1NiI ...
- JSON Web Token (JWT) 实现与使用方法
1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...
- Python 生成 JWT(json web token) 及 解析方式
一.关于 jwt 的原理及概念可以自行在网络上搜索了解一下,这里推荐一篇写的比较好的博客 深入了解Json Web Token之概念篇 另附 JWT 的官方文档: https://jwt.io/int ...
- [转] JSON Web Token in ASP.NET Web API 2 using Owin
本文转自:http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/ ...
- JSON Web Token in ASP.NET Web API 2 using Owin
In the previous post Decouple OWIN Authorization Server from Resource Server we saw how we can separ ...
- JSON Web Token 使用详解
JWT 是什么? JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案.它是有三部分组成,示例如下,具体的讲解如下(jwt 是不会有空行的,下面只是为了显示,便使用了换行看着比较 ...
随机推荐
- 使用属性position:fixed的时候如何才能让div居中
css: .aa{ position: fixed; top: 200px; left: 0px; right: 0px; width: 200px; height: 200px; margin-le ...
- codeforces 609B
#include<bits/stdc++.h> using namespace std; ]; int main() { memset(num,,sizeof(num)); int n,m ...
- ios9.3.3版本下 document.execCommand("copy") 失败
copyText()安卓,ios11,ios12都可用 ,并且不弹起输入键盘 // 复制copyText function copyText(text) { var input = document. ...
- Vue打包文件放在服务器,浏览器存在缓存问题的解决
在入口文件index.html添加 <meta http-equiv="pragram" content="no-cache"> <meta ...
- P1096 4个数的全排列
题目描述 输入4个有序的个位数.按照字典序输出它们的全排列. 输入格式 输入四个数字a,b,c,d.(0<=a,b,c,d<10) 输出格式 输出它们的全排列.每个排列占一行.而且每个排列 ...
- java 布局管理器
容器中的组件的排放方式,就是布局. 常见的布局管理器: FlowLayout(流式布局管理器)//目前最常用的 从左到右的顺序排列. Panel默认的布局管理器. BorderLayout(边界布局管 ...
- 基于串口调试助手的WIFI模块调试-FPGA简单联网(点灯)
根据正点原子的<ATK-ESP8266 WIFI用户手册>,使用XCOM V2.2串口调试助手测试WIFI模块[26].在本系统中运用到的功能主要是TCP/IP模式中的TCP Client ...
- Apache ServiceMix介绍
Apache ServiceMix介绍 Apache ServiceMix 是一个广泛使用的开源ESB,适合SOA项目的集成,它提供类似商业ESB产品一样的功能呢,它的核心是基于开放标准和规范. Se ...
- nodejs + webpack4 + babel6 结合写Chrome浏览器插件记录(2)
上来先来看下当前实现的效果吧. 前言 首先感谢第一篇留言鼓励的同学,最近各种繁杂的事,时间占用较多,但是也总抽空继续改造这个项目,期间遇到了各种Vue渲染的问题,常规的字符串渲染会在Chrome插件中 ...
- 一目了然 | 数据库实例性能调优利器:Performance Insights
Performance Insights是什么 阿里云RDS Performance Insights是RDS CloudDBA产品一项专注于用户数据库实例性能调优.负载监控和关联分析的利器,以简单直 ...