基于 cookie 的会话管理的改进

Improvements on cookie based session management

"服务器操作员可能不使用 cookie 进行授权,而是 希望通过处理纠缠指定和授权 URL 作为功能。这不是将秘密存储在 cookie 中,而是 方法将秘密存储在 URL 中,要求远程实体 提供秘密本身。这种方法虽然不是万能的, 这些原则的明智应用可以导致更强大的 安全。” A. Barth https://www.rfc-editor.org/rfc/rfc6265

在 URL 中存储秘密是什么意思?这在实践中将如何完成?

我认为符合此描述的一种技术是要求客户请求 URLs that are signed with HMAC。 Amazon Web Services 为某些操作提供了这种技术,我也看到它在网络公司的内部 API 中得到了实施。可以使用这种或类似技术对 URL 的服务器端进行签名,并将它们安全地传递给嵌入在 HTML 中的客户端(通过 HTTPS)或响应针对 API 的 XMLHttpRequests .

作为会话 cookie 的替代方法,我不确定这种技术会提供什么优势。但是,在某些情况下,这是解决问题的方便方法或通常是最好的方法。例如,我在以下情况下使用了类似的技术:

跨域

您需要授予浏览器访问另一个域a URL 的权限,因此 cookie 没有用,您可以签署 [= =60=] 服务器端授予访问权限,无论是通过重定向还是具有足够长的到期时间,以便浏览器有时间加载 URL.

示例:从 S3 下载文件。从 CloudFront 渐进式播放视频。

闭源限制

除了 URL 之外,您无法控制浏览器或其他客户端发送的内容,因为您使用的是某种 闭源插件 并且不能改变它的行为。您再次在 URL 服务器端签名,这样客户端所要做的就是获取 URL.

示例:通过 WEBVTT 将视频字幕 and/or 精灵文件加载到闭源 Flash 视频播放器中。当您需要确保负载在传输过程中无法更改时,发送负载以及联合单点登录回调 URL。

无凭证任务工作者

您正在将 URL 发送到浏览器以外的其他东西,并且某些东西需要访问那个 URL 的资源,除此之外 你不需要不想给它实际凭据

示例:您是 运行 队列消费者或基于任务的工作程序守护程序,或者可能是 AWS Lambda 函数,它需要下载一个文件,处理它,然后发送电子邮件。只需预先签署它将使用的所有 URLs,并设置合理的到期时间,这样它就可以执行所有需要的请求,而无需任何额外的凭据。