隐式流与授权码流:为什么隐式流已死?
为什么在我们已经有 "隐式流" 的情况下,OAuth 2.0 中还存在 "授权码流"?让我们深入了解这两种授权类型的细节,并找出为什么你应该避免使用隐式流。
为什么在我们已经有 "隐式流" 的情况下,OAuth 2.0 中还存在 "授权码流"?让我们深入了解这两种授权类型的细节,并找出为什么你应该避免使用隐式流。
授权码流和隐式流是 OAuth 2.0 中最常用的两种授权类型,使得 Web 应用程序可以实现安全高效的用户授权。两种流都实现了一种授权过程,允许用户在不直接暴露其凭证的情况下授予应用程序访问权限。隐式流最初是为了解决浏览器限制而开发的,但随着现代 Web 技术的出现,授权码流因其增强的安全功能已成为许多开发者的首选。
在本文中,我们将探究这两种授权类型的区别,并解释为什么你应该避免使用隐式流而选择授权码流。
在我们深入了解这两种授权类型的细节之前,让我们先来了解什么是 OAuth 2.0 及其对现代 Web 应用程序的重要性。
当人们谈论 OAuth 时,我们通常指的是 OAuth 2.0,即“开放授权”,这是一种公认的协议,允许网站或应用程序在用户的授权下使用其他 Web 服务的资源。它于 2012 年继承了 OAuth 1.0,从此成为数码授权的广泛接受标准。OAuth 2.0 的设计目的是为用户提供受控访问,允许客户端应用程序获得特定权限与代表用户的资源互动,而无需透露用户的登录详情。
虽然主要用于 Web 环境中,OAuth 2.0 的框架也扩展到各种客户端形式。这包括基于浏览器的应用程序、服务器端 Web 应用程序、原生或移动应用程序,甚至是互联设备,详细描述了在这些平台上管理委托访问的方法。它引入了“授权类型”的概念,以定义客户端应用程序、用户和授权服务器之间的授权过程。这些授权类型用于确定客户端应用程序如何获得访问令牌以访问用户的资源。在 OAuth 2.0 中,最常见的授权类型有:
隐式流是一种简化的 OAuth 2.0 流程,访问令牌在重定向 URI 中直接返回给客户端,不需要额外步骤来通过授权码交换令牌。最初设计用于因浏览器限制而无法对令牌端点进行服务器端请求的 Web 应用程序。
隐式流存在若干安全漏洞:
由于这些安全问题,不再建议在现代 Web 应用程序中使用隐式流。相反,带有 PKCE(代码验证密钥)的授权码流是首选的安全用户授权方式。
另一方面,授权码流是更安全的 OAuth 2.0 流程,将授权过程分为两步:客户端应用程序首先从授权服务器获取授权码,然后将该代码交换为访问令牌。此过程最初为能够安全存储客户端凭证和管理访问令牌的服务器端 Web 应用程序而设计。随着 PKCE 扩展的引入,授权码流现在也可用于基于浏览器的应用程序。
了解更多关于 PKCE 流程的信息。
| 方面 | 授权码流 | 隐式流 |
|---|---|---|
| 令牌交付 | 通过安全请求将访问令牌交付给客户端 | 访问令牌直接在 URL 片段中交付给客户端 |
| 安全级别 | 高(令牌不会在浏览器中暴露) | 低(令牌在浏览器中暴露) |
| 使用场景 | 服务器端 Web 应用程序和基于浏览器的应用程序(带 PKCE) | 仅限于基于浏览器的应用程序 |
| 现代使用 | 推荐用于所有类型的应用程序 | 不推荐,应避免使用 |
答案是肯定的:
授权码流引入了一个额外步骤,用于将授权码交换为访问令牌,这显著降低了令牌暴露的风险。
如果你目前在业务中使用隐式流,切换到带有 PKCE 的授权码流可以为你和你的用户提供更好的安全性。我们理解迁移和管理身份系统可能既麻烦又昂贵,但增强的安全性和合规性的好处是值得付出的努力。