夫天地者,万物之逆旅;光阴者,百代之过客。而浮生若梦,为欢几何?
IdentityServer4实战:Token 过期时间

前言

在 IdentityServer4 中我们使用的 Token 更多的是 JWT 格式的,这种格式的 Token 有其优点和缺点,适不适合项目,要看你的使用场景。

JWT的优点:

  1. 可扩展性好:应用程序分布式部署的情况下,session需要做多机数据共享,通常可以存在数据库或者redis里面。而jwt不需要。 

  2. 无状态:jwt不在服务端存储任何状态。RESTful API的原则之一是无状态,发出请求时,总会返回带有参数的响应,不会产生附加影响。用户的认证状态引入这种附加影响,这破坏了这一原则。另外jwt的载荷中可以存储一些常用信息,用于交换信息,有效地使用 JWT,可以降低服务器查询数据库的次数。

JWT的缺点:

  1. 安全性:由于jwt的payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据。而session的信息是存在服务端的,相对来说更安全。 

  2. 性能: jwt太长。由于是无状态使用JWT,所有的数据都被放到JWT里,如果还要进行一些数据交换,那载荷会更大,经过编码之后导致jwt非常长,cookie的限制大小一般是4k,cookie很可能放不下,所以jwt一般放在local storage里面。并且用户在系统中的每一次http请求都会把jwt携带在Header里面,http请求的Header可能比Body还要大。而sessionId只是很短的一个字符串,因此使用jwt的http请求比使用session的开销大得多。 

  3. 一次性:无状态是jwt的特点,但也导致了这个问题,jwt是一次性的。想修改里面的内容,就必须签发一个新的jwt。

适合使用JWT的场景

  1. 凭证有效期短 

  2. 只希望被使用一次

配置过期时间

Token 的过期时间需要配置 Client 的 AccessTokenLifetime 属性,该属性默认是 3600s,即一个小时。

new Client
                    {
                        ClientId = "client2",

                        //  用户名 密码 模式
                        AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,

                        // 设置 Token 过期时间 60S
                        AccessTokenLifetime = 60,

                        // 用于认证的密码
                        ClientSecrets =
                        {
                            new Secret("secret".Sha256())
                        },
                        // 客户端有权访问的范围(Scopes)
                        AllowedScopes = {
                            "openid", 
                            "profile" ,
                            "article.list" ,
                            "article.delete" ,
                            "user.list" ,
                            "user.delete"
                        },
                    }

生成的 Token 如下:

在测试中我们发现,当过了 60s 的设置期后Token仍然能用。这是因为资源端在校验 Token 的时候会有一个默认的时间偏移量,在偏移量范围的Token会被认为没过期,详细的介绍请看文尾的参考资料。

参考资料

关于 Token 生命周期的介绍笔友可以看博客园 晓晨Master 大牛写的 《IdentityServer4实战 - AccessToken 生命周期分析》一文,该文对 Token 过期时间有深入的分析。

作者:暗夜余晖

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

0

支持

0

反对

posted @2021-4-10  拜读(1323)

评论列表

评论内容:



喜欢请打赏

支付宝 微信

请放心支付