为什么OAuth v2具有访问权限和刷新令牌?
OAuth 2.0协议草案的第4.2节指出,授权服务器可以返回一个access_token
(用于验证资源)和refresh_token
,纯粹用于创建一个新的access_token
:
https://tools.ietf.org/html/rfc6749#section-4.2
为什么都有? 为什么不只是使access_token
最后只要refresh_token
并没有refresh_token
?
刷新令牌的想法是,如果访问令牌受到攻击,因为攻击者寿命短,攻击者可以利用有限的窗口来滥用访问令牌。
刷新令牌(如果受到攻击)无用,因为除了刷新令牌外,攻击者还需要客户端ID和密钥才能获得访问令牌。
话虽如此 ,因为每次对授权服务器和资源服务器的调用都是通过SSL完成的 - 包括原始客户端ID和秘密,当他们请求访问/刷新令牌时 - 我不确定访问令牌是如何“妥协“,而不是长期存在的刷新令牌和密码/密码组合。
这当然与您不控制授权和资源服务器的实现有所不同。
以下是一个关于刷新令牌使用的好主意:OAuth Archives。
上面的引用,谈到刷新令牌的安全目的:
刷新令牌......缓解长期存在的access_token泄漏的风险(在不安全的资源服务器上的日志文件中查询参数,测试版或编码不良的资源服务器应用程序,非https网站上的JS SDK客户端,将access_token放入cookie等)
由Catchdave提供的讨论链接还有另一个由Dick Hardt提出的有效论点,除了上面所写的内容外,我认为这里值得在此提及:
我回忆起刷新令牌是为了安全和撤销。 <...>
撤销:如果访问令牌是自包含的,则可以通过不颁发新的访问令牌来吊销授权。 资源不需要查询授权服务器以查看访问令牌是否有效。这简化了访问令牌验证并使其更容易扩展和支持多个授权服务器。 访问令牌有效时有一段时间,但授权被撤销。
事实上,在资源服务器和授权服务器是相同的实体并且用户与他们中的任何一个之间的连接(通常)同样安全的情况下,保持刷新令牌与访问令牌分离没有多大意义。
虽然正如引言中提到的那样,刷新令牌的另一个作用是确保访问令牌随时可以由用户撤销(例如,通过其配置文件中的Web界面),同时保持系统在同一时间的可扩展性。
通常,令牌既可以是指向服务器数据库中特定记录的随机标识符,也可以包含所有信息(当然,这些信息必须用MAC来签名,例如)。
具有长期存取令牌的系统应该如何工作
服务器允许客户通过发布令牌访问预定义范围内的用户数据。 因为我们想要保持令牌可撤销,所以我们必须在数据库中存储令牌以及设置或取消设置的标志“撤销”(否则,您将如何使用自包含的令牌执行此操作)?数据库可以包含与len(users) x len(registered clients) x len(scopes combination)
记录。 每个API请求都必须打到数据库。 虽然查询这样的数据库执行O(1)是非常简单的,但单点故障本身可能会对系统的可伸缩性和性能产生负面影响。
具有长寿命刷新令牌和短期访问令牌的系统应该如何工作
在这里,我们发出两个密钥:随机刷新令牌和数据库中的相应记录,以及签名的自包含访问令牌,其中包含过期时间戳字段。
由于访问令牌是独立的,我们根本不必访问数据库来检查其有效性。 我们所要做的就是解码令牌并验证签名和时间戳。
尽管如此,我们仍然需要保持刷新令牌的数据库,但是对这个数据库的请求数量一般由访问令牌的生命周期(寿命越长,访问速率越低)定义。
为了撤销特定用户对客户端的访问,我们应该将相应的刷新标记标记为“已撤销”(或完全移除)并停止发布新的访问标记。 很明显,虽然存在一个窗口,刷新令牌已被撤销,但其访问令牌可能仍然有效。
权衡
刷新令牌部分消除了Access令牌数据库的SPoF(单点故障),但它们有一些明显的缺点。
窗户”。 事件之间的时间间隔“用户撤销访问”和“访问保证被撤销”。
客户端逻辑的复杂性。
没有刷新标记
与刷新令牌
我希望这个答案确实有意义,并帮助某人作出更深思熟虑的决定。 我还想指出一些着名的OAuth2提供者,包括github和foursquare,都采用没有刷新令牌的协议,并且看起来很开心。
尽管上述所有伟大的答案,我作为一个安全大师的学生,谁曾在eBay的工作时,我接过来一看变成买家的保护和欺诈程序员,可以说分离访问令牌和刷新令牌有频繁的用户名骚扰用户之间的最佳平衡点 /密码输入并保持权限,以撤销访问可能的滥用您的服务的权限。
想想这样的情景。 您发出3600秒的访问令牌的用户并刷新令牌的时间更长,为时一天。
用户是一个很好的用户,他在家里,通过他的iPhone在网上购物和搜索。 他的IP地址不会更改,并且服务器负载很低。 每3-5分钟请求一次。 当他在访问令牌上的3600秒结束时,他需要一个新的令牌。 我们在服务器端检查他的活动历史和IP地址,认为他是一个人,并且表现自己。 我们授予他一个新的访问令牌以继续使用我们的服务。 用户不需要再次输入用户名/密码,直到刷新令牌本身的寿命达到一天。
用户是粗心的用户。 他住在美国纽约,病毒程序被关闭,并被波兰的一名黑客入侵。 当黑客获得访问令牌和刷新令牌时,他会尝试冒充用户并使用我们的服务。 但是,在短期访问令牌过期后,当黑客试图刷新访问令牌时,我们在服务器上注意到用户行为历史记录中出现了戏剧性的IP更改(嘿,这家伙登录美国,现在刷新访问波兰在3600s后)。 我们终止刷新过程,使刷新令牌本身无效并提示再次输入用户名/密码。
用户是恶意用户。 他打算通过使用机器人每分钟拨打1000次我们的API来滥用我们的服务。 他可以这么做,直到3600秒后,当他试图刷新访问令牌时,我们注意到他的行为并认为他可能不是人。 我们拒绝并终止刷新过程,并要求他再次输入用户名/密码。 这可能会破坏他的机器人的自动流程。 至少让他感到不舒服。
当我们试图平衡我们的工作,用户体验以及被盗取令牌的潜在风险时,您可以看到刷新令牌已经完美行事。 服务器端的看门狗可以检查IP更改,api调用的频率以确定用户是否是好用户。
另一个词是你也可以尝试通过在每个API调用基本的IP看门狗或任何其他措施实施来限制对被盗的令牌/服务滥用的损害控制。 但是,这是昂贵的,因为你必须读取和写入有关用户的记录,并且会降低服务器的响应速度。
链接地址: http://www.djcxy.com/p/1305.html