RFC 7519 JWT介绍

传统的Session验证

1.用户名密码登陆

2.验证通过,server会存储登陆状态,并返回session ID给cliet

3.后续请求带着session ID,服务器根据已存储的session进行校验

4.返回请求结果。

服务端要存储登陆状态,这对单机模式没什么用影响,对于集群模式是很大的挑战,为了方便横向扩展,要把这些登陆态拆出来,常见的做法是写入redis集群和持久化session数据,有了redis程序员就可以大展身手了,可以把很多信息放入redis不在局限于session ID,经常把用户信息也放入进去,这就会照成很多未知风险,虽然技术规范可以规避一些风险,但是单点风险还是存在的。

就跟0和1一样,登陆状态可以有客户端保存,服务端做校验,只要保证是自己签发的且在有效期内就可以了。JWT就是这样思路产生的一种验证机制。


 JWT定义

JSON Web令牌(JWT)是一个紧凑的采用URL安全表示方法的声明,用于在两方之间传输。JWT的声明被编码为一个JSON对象,作为一个JSON Web Signature(JWS)结构的有效载荷或作为一个JSON Web Encryption(JWE)结构的明码文本,允许声明被数字签名和进行完整性检查,通过消息认证码(MAC)或者加解密。


JWT应用场景 

  1. 授权:这是使用JWT的最常见使用方式。一旦用户登录,每个后续请求将包括JWT,允许用户访问该令牌允许的路由,服务和资源。Single Sign On是一种现在广泛使用JWT的功能,因为它的开销很小,并且能够在不同的域中轻松使用。
  2. 信息交换:JWT是在各方之间安全传输信息的好方法。因为JWT可以签名 - 例如,使用公钥/私钥对可以确定发件人是特定的人。此外,由于使用标头和有效负载计算签名,还可以验证内容是否未被篡改。

JWT格式

xxxxx.yyyyy.zzzzz

jwt格式采用紧凑型,使用“.”作为分隔符,有header,payload,signature三部分组成

Header

header所表示的JSON对象通常由2个部分组成:token的类型,即”JWT”; token所采用的hash算法,例如HMAC SHA256或者RSA。最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。

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

 Payload

payload包括三部分注册声明,公开声明,私有声明

注册声明的字段有7个

  1. iss     (issuer) 签发人
  2. sub (subject)主题
  3. aud   (audience):受众
  4. exp (expiration time)过期时间
  5. nbf (not before) 生效时间
  6. iat  (issued at) 签发时间
  7. jti   (jwt id) 编号

公开声明,私有声明可以自己定义

使用Base64 URL算法将上述JSON对象转换为字符串保存。

Signature

签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。

首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。

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

签名用于验证消息在此过程中未被更改,并且,在使用私钥签名的令牌的情况下,它还可以验证JWT的发件人是否是它所声称的人

默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。


 JWT的用法

下图显示了如何获取JWT并用于访问API或资源

step1:向授权服务器发送请求

step2:得到授权token

step3:使用获取到的token去访问资源

客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。

access-control-allow-origin →*
cache-control →no-cache, no-store, max-age=0, must-revalidate
content-length →0
date →Mon, 17 Dec 2018 14:15:14 GMT
expires →0
pragma →no-cache
token →Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZXN0MyIsImV4cCI6MTU0NTA1OTcxNCwiaWF0IjoxNTQ1MDU2MTE0LCJyb2wiOiJST0xFX0FETUlOIn0.LXVr9n_haQwguZgL6zjGKTYg4p8vWI3zBCjsgVdzOiwHUH5BtkbhVf3hN5ZLqTMn7AK9tUOdtbqENfPRpMSzww
vary →Origin, Access-Control-Request-Method, Access-Control-Request-Headers
x-content-type-options →nosniff
x-frame-options →DENY
x-xss-protection →1; mode=block

此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。当跨域时,也可以将JWT被放置于POST请求的数据主体中。

Authorization: Bearer 


 参考资料:

  1. 官方文档https://jwt.io/introduction/
  2. JSON Web Token 入门教程 http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
  3. 10分钟了解JSON Web令牌 http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

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

补充记录腾讯云 DNSPod 域名 API 申请 Let’s Encrypt 泛域名 SSL 证书需要注意的几点

2094
来自专栏FreeBuf

CVE-2017-3085:Adobe Flash泄漏Windows用户凭证

早前我写了一篇文章讲述Flash沙盒逃逸漏洞最终导致Flash Player使用了十年之久的本地安全沙盒项目破产。从之前爆出的这个漏洞就可以看出输入验证的重要性...

3076
来自专栏黑白安全

用aircrack-ng破解 wifi 密码

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

3354
来自专栏张善友的专栏

Jexus 配置ssl

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

2295
来自专栏信安之路

无线渗透(下)—企业级WPA破解

1730
来自专栏码神联盟

http和https是什么?有什么区别?

HTTPS是什么意思? HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,中文含义为“超...

3495
来自专栏Java技术栈

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

JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式。这些...

46110
来自专栏尾尾部落

让网站成为 HTTPS 安全站点

之前用过阿里云的 SSL 免费证书,但是期限只有一年,昨天过期了,看了其他收费的 SSL 证书,还是很贵的,在读小硕实在买不起,只能找找免费的 SSL 证书了。

2581
来自专栏FreeBuf

如何在macOS上监听单个应用HTTPS流量

写在前面的话 如果你准备对网络协议进行逆向分析或进行任何与网络安全有关的活动时,可能是为了了解协议运行机制,也有可能是为了查找敏感信息,你或多或少都需要收集一定...

2645
来自专栏醉梦轩

NGINX部署HTTPS

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

3663

扫码关注云+社区

领取腾讯云代金券