JSON Web Token (JWT),服务端信息传输安全解决方案。

JWT介绍

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式。这些信息可以被验证和信任,因为它是数字签名的。JWTs可以使用一个密钥(HMAC算法),或使用RSA的公钥/私钥密钥对对信息进行签名。

让我们进一步解释这个定义的一些概念。

  • 紧凑

由于其较小的体积,JWTs可以通过URL、POST参数或HTTP头部参数进行传递,体积小也意味着其传输速度会相当快。

  • 独立

有效负载包含了所需要的关于用户的所有信息,避免了多次查询数据库的需要。

JWT的应用场景

  • 认证

这是使用JWT最常见的场景,一旦用户登录后,每个后续的请求都会包含JWT token,允许用户访问该token所允许的路由、服务、资源等。如单点登录是目前广泛使用JWT的一项功能,因为它的开销很小,而且在不同的域名中很容易使用。

  • 信息交换

JWT是一种在多方之间传递数据比较好的方式,因为JWT能使用签名,能确保发送者是谁,也可以验证传递过来的的信息是否被篡改。

JWT的结构

JWT由以下三部分组成:

  1. Header(头部)
  2. Payload(载荷)
  3. Signature(签名)

因此,JWT通常看起来如下。

xxxxx.yyyyy.zzzzz

Header

header通常由两个部分组成:token类型(即JWT)和正在使用的散列算法,如HMAC SHA256或RSA。

如:

{
  "alg": "HS256",
  "typ": "JWT"
}

这个JSON经过Base64编码后形成JWT的第一部分。

Payload

载荷包含了对实体的申明,用户和一些其他元信息。申明以下三种。

  1. 注册的申明
  2. 公开的申明
  3. 私有的申明

如:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

这个JSON经过Base64编码后形成JWT的第二部分。

Signature

签名用于验证JWT的发送者是谁,并确保消息在过程中不会被篡改。

创建签名部分,你需要用到编码后的header、编码后的payload、密钥、在header中指定的算法。

如下使用HMAC SHA256算法创建签名的方式:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

讲完了上面3个部门,最后就是由这3部分组成了。每个部分经过base64编码后,以.分隔。它能很容易的在HTML和HTTP环境中传递,也比像类似xml标准格式这样的更紧凑。

如果想使用JWT并将这些概念应用到实践中,您可以使用官网首页下面的调试器来解码、验证和生成JWTs。

JWT的工作原理

在身份验证中,当用户成功地使用他们的凭证登录时,将返回一个JWT的token,并且必须在本地保存(通常在本地保存,但也可以使用cookie),而不是在服务器中创建会话并返回cookie的传统方法。

当用户想要访问受保护的路由或资源时,用户代理应该发送token,通常是在使用Bearer模式的Authorization头参数中。标题的内容应该如下所示:

Authorization: Bearer <token>

这是一个无状态的身份验证机制,因为用户状态永远不会保存在服务器内存中。服务器的受保护路由将在授权头中检查有效的JWT,如果它存在,用户将被允许访问受保护的资源。由于JWTs是独立的,所以所有必要的信息都在那里,减少了多次查询数据库的需求。

这使得完全可以依赖无状态的数据api,甚至向下游服务发出请求。哪个域名api服务并不重要,因为CORS攻击不会成为一个问题,因为它不使用cookie。

工作流程如下:

JWT的优点

  • 因为JSON数据格式的通用性,所以JWT是可以跨语言的,主流语言都可以支持。
  • payload部分可以存储其他业务逻辑所必要的非敏感信息。
  • JWT构成简单,字节占用很小,所以非常便于传输的。
  • 不需要在服务端保存会话信息,易于应用的扩展和安全等。

JWT的使用注意

  1. 不要在payload存放敏感信息,因为该部分是可解密的。
  2. 保存好secret私钥十分重要。
  3. 尽量使用https协议

JWT参考网站

官网:https://jwt.io/ 官方介绍:https://jwt.io/introduction/ 支持类库:https://jwt.io/#libraries-io RFC 7519规范:https://tools.ietf.org/html/rfc7519

明天带来JWT的Java实战。

原文发布于微信公众号 - Java技术栈(javastack)

原文发表时间:2018-01-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏签桶

RFC 7519 JWT介绍

服务端要存储登陆状态,这对单机模式没什么用影响,对于集群模式是很大的挑战,为了方便横向扩展,要把这些登陆态拆出来,常见的做法是写入redis集群和持久化sess...

2550
来自专栏技术博文

PHP使用DES进行加密和解密

DES是一种标准的数据加密算法,关于这个算法的详细介绍可以参考wiki和百度百科: wiki百科 百度百科 php中有一个扩展可以支持DES的加密算法,是:ex...

3016
来自专栏云计算教程系列

如何在Ubuntu 16.04中为Apache创建自签名SSL证书

TLS或传输层安全性及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

3480
来自专栏云计算教程系列

如何在Debian 9中为Apache创建自签名SSL证书

TLS或传输层安全性及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

1932
来自专栏魏艾斯博客www.vpsss.net

腾讯云服务器创建 SSH 密钥及如何使用 提高 SSH 连接安全性

腾讯云服务器内置创建 SSH 密钥功能,创建并使用之后就是有密钥才能使用 SSH 连接服务器,相对于几位数的登陆密码来说,2048 位密钥显然更安全。

3473
来自专栏张善友的专栏

Jexus 配置ssl

第一步:登记SSL库。 首先查看“/lib”文件夹中SSL库文件名,该文件名应该是“libssl.so.版本号”,如果没有列出文件名,就证明你的系统还没有安装...

2295
来自专栏醉梦轩

NGINX部署HTTPS

1.5K5
来自专栏晨星先生的自留地

从iis认证方式的学习到一个路由器漏洞的调试

1865
来自专栏黑白安全

用aircrack-ng破解 wifi 密码

开始前,先连上无线网卡,因为虚拟机中的kali系统不用调用笔记本自带的无线网卡,所以需要一个外接无线网卡,然后接入kali系统。

3384
来自专栏醉梦轩

NGINX部署HTTPS

nginx是一款高性能的Web服务器,可以用作反向代理和负载均衡。随着HTTPS的不断推进,越来越多的网站都开始转到HTTPS方式,HTTP仅仅作为重定向到HT...

3713

扫码关注云+社区

领取腾讯云代金券