前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RFC 7519 JWT介绍

RFC 7519 JWT介绍

原创
作者头像
卡拉肖克
修改2018-12-20 09:55:38
2.1K0
修改2018-12-20 09:55:38
举报
文章被收录于专栏:签桶签桶

传统的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对象转换为字符串保存。

代码语言:javascript
复制
{
   "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)根据以下公式生成签名。

代码语言:javascript
复制
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

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

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


 JWT的用法

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

How does a JSON Web Token work
How does a JSON Web Token work

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

step2:得到授权token

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

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

代码语言:javascript
复制
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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 传统的Session验证
  •  JWT定义
  • JWT应用场景 
  • JWT格式
  •  JWT的用法
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档