由于与应用层协议消息(排序、语法、数据单元保护——或缺乏),而不是仅由使用特定加密算法、模式和/或密钥大小产生的保护。但是,如果 API 密钥字符串生成器比 OAuth 访问令牌字符串生成器更可预测,我不会感到惊讶。API 密钥通常在 HTTP 请求的第一行中作为 HTTP GET查询参数发送,如下面的 Google Maps JavaScript API 所示:
<script async defer src="https://maps.googleapis.com/maps/api/js key=YOUR_API_KEY&callback=initMap" type="text/javascript"></script>
由于 API 密钥字符串作为 HTTP GET查询参数传递,因此中间 Web 服务器(包括代理)和使用 JavaScript 或 ActionScript 等客户端脚本语言的浏览器更容易读取和/或对 API 密钥的写入权限。将此与其他类型的 HTTP 操作(例如PUT或POST )进行比较,其中查询参数对上述技术的隐藏程度更高。几乎所有的 web 服务器软件都会将上面script标签中的src属性值写入access_log和/或error_log包括 API 密钥的文件,因为查询参数变量值是 CGI(通用网关接口)环境变量的一部分:SCRIPT_PATH和QUERY_STRING。有关详细信息,请参阅CWE-598。
另一方面,OAuth 访问令牌是按会话生成的。在提供者收到请求用户有权获得请求权限的证明之前,不会发生由安全身份验证提供者授予访问令牌的情况;这种证明可以通过对凭据的了解(即相应的用户名和密码对)来建立。其他时候,访问控制可能更具限制性,访问令牌仅提供给特定应用程序/站点/API 中的一小部分权限子集子组件、操作区域、控制范围等。最终授予最终用户的权限可以像系统管理员希望的那样细化。
例如,访问令牌通常在 HTTP 请求标头的授权字段中传输到 URL 之外。有时,自定义身份验证框架实现将导致令牌在启用了HttpOnly、Secure和SameSite标志的 cookie 中传输 - 或作为自定义 HTTP 请求标头(如Oracle 云存储 SaaS 公开记录的X-Auth-Token ) :Oracle 的云存储服务 API:
Web 浏览器/服务器软件记录 HTTP 请求标头和 cookie 值的情况极为罕见;由于 CORS(跨源资源共享),它们也更难以以编程方式访问。相比之下,作为 HTTP GET 参数传递的 API 密钥可以使用客户端 JavaScript 从 DOM(文档对象模型)中提取。
由于这些原因,从 OAuth 等身份验证框架获取访问令牌所需的复杂性远高于记录 API 密钥使用所需的复杂性。此外,身份验证和授权框架的健壮性允许将访问令牌封装在 HTTP 协议中,从而很难查看或篡改令牌。