JWT 学习笔记

JWT 学习笔记

JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。JWT默认不加密,但可以加密。生成原始令牌(token)后,可以使用改令牌再次对其进行加密。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,其中token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的原则是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户,一般是将它放入HTTP请求的Header Authorization字段中。

通俗来讲,JWT是一个含签名并携带用户相关信息的加密串,页面请求校验登录接口时,请求头中携带JWT串到后端服务,后端通过签名加密串匹配校验,保证信息未被篡改。校验通过则认为是可靠的请求,将正常返回数据。

JWT用处:

授权:这是最常见的使用场景,解决单点登录问题。因为JWT使用起来轻便,开销小,服务端不用记录用户状态信息(无状态),所以使用比较广泛;

信息交换:JWT是在各个服务之间安全传输信息的好方法。因为JWT可以签名,例如,使用公钥/私钥对儿 - 可以确定请求方是合法的。此外,由于使用标头和有效负载计算签名,还可以验证内容是否未被篡改。

JWT的数据结构

在这里插入图片描述

JWT对象为一个长字串,各字串之间也没有换行符,通过"."分隔。总共有三个子串,每一个子串表示了一个功能块,JWT的三个部分为JWT头、有效载荷和签名,将它们写成一行格式如下。

xxx.yyy.zzz

1 JWT头

JWT头部分是一个描述JWT元数据的JSON对象,由两部分组成,令牌类型(即:JWT)、散列算法(HMAC、RSASSA、RSASSA-PSS等)。alg属性表示签名使用的算法,为HMAC SHA256(写为HS256);typ属性表示令牌的类型,JWT令牌统一写为JWT。

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

2 有效载荷

是 JWT 的主体,包含claims的 JSON 对象。

claims是关于实体(常用的是用户信息)和其他数据的声明,claims有三种类型: registered claims(标准注册声明), public claims(公共声明), and private claims(私有声明)。

Registered claims:
这些是一组预定义的claims,非强制性的,常用属性如下:(全部属性

iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT

Public claims 和 Private claims:
这些是自定义的claims,用于传递不同系统间可以共享的数据。
但是,默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。

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

该对象也使用Base64 URL算法转换为字符串保存。

3签名哈希

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

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

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

若使用私钥签名令牌(RSA非对称加密),公钥保存在其他系统中,它还可以验证JWT的签发身份是否是它所声明的。

在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用"."分隔,构成整个JWT对象。

Base64URL算法和常见Base64算法类似,但由于 Base64中用的三个字符是"+","/“和”=",由于在URL中有特殊含义,因此Base64URL中对他们做了替换:"=“去掉,”+“用”-“替换,”/“用”_"替换。

JWT的用法

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

此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。(默认“Beear ”开头)

Authorization: Bearer

JWT 注意事项

1、JWT默认不加密,但可以加密。生成原始令牌后,可以使用改令牌再次对其进行加密。所以在JWT没有再次加密的情况下,JWT的信息不是私密的。
2、为了减少盗用和窃取的可能,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。
3、JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是说,一旦JWT签发,在有效期内将会一直有效。
4、JWT本身包含认证信息,因此一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,JWT的有效期(expiretime)不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证。
5.token添加expiretime,决定token是否过期。当业务方访问的一个token的租约快要过期时,系统会自动给token续租。仅在token生成后,一个租约的时间内没有任何业务方访问时,该token才会失效,这样不会导致用户在使用中会突然掉线的情况。

参考:
SSO
JWT
JWT

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值