kevinsmith/laravel-samesite-none-compat

为使用 Laravel 5.8+ 中的 SameSite=None cookies 时提供对旧客户端的支持

v1.0.0 2020-02-19 00:32 UTC

This package is auto-updated.

Last update: 2024-08-25 10:33:00 UTC


README

为 Laravel 5.8+ 中标记为 SameSite=None; Secure 的 cookies 提供对旧客户端的支持

本包实现了在 这篇精彩的 web.dev 文章 中提出的第一个建议,该文章由 Rowan Merewood 编写。如果你不确定为什么这一切很重要,或者当前浏览器处理 cookies 的 SameSite 属性发生了什么变化,请鼓励你阅读 Rowan 的详尽 SameSite 解释

它如何工作

在过去,没有明确 SameSite 值的 cookie 可以在没有浏览器限制的情况下在第三方上下文中写入和读取(例如,你应用在另一个域页面的 iframe 中)。出于安全原因,最流行的浏览器(Chrome、Firefox、Safari、Edge)现在正在限制它们的默认 cookie 行为,以便只有标记为 SameSite=None; Secure 的 cookie 才能在第三方上下文中读取。

好的,我们只需要更新设置这些 cookie 的方式,对吧?等等。遗憾的是,以这种方式标记 cookie 可能会使它们与旧浏览器 不兼容。而且,根据你的受众,很多人 仍在使用旧浏览器。

此包采用一种解决方案,允许你升级你的应用 cookie 以符合当前建议,同时通过为所有标记为 SameSite=None; Secure 的出站 cookie 包含回退来保持与旧浏览器的兼容性。所以如果你的应用设置了这样的 cookie

appcookie=value; SameSite=None; Secure

此包将在响应中添加此回退 cookie,并将其发送回浏览器

appcookie__ssn-fallback=value; Secure

当你的应用收到入站请求时,此包将检查 cookie,并提升任何尚未标记为 SameSite=None; Secure 的主要对应回退 cookie。

安装

将中间件添加到 Laravel 的 全局中间件属性 的顶部,以便这是每个进入应用请求的第一个中间件

protected $middleware = [
    \KevinSmith\SameSiteNoneCompat\Laravel\SameSiteNoneMiddleware::class,
    // all other middleware...
];

然后更新 config/session.php 以启用安全 cookie 并将 same_site 配置设置为 'none'。请注意,这两个属性都设置正确很重要。没有指定 Secure 的标记为 SameSite=None 的 cookie 将不会工作。

要检查它是否按预期工作,请使用 Chrome 检查你的 cookie 并查找所有添加了后缀 __ssn-fallback 的 cookie 复制品。当然,你希望在所有受众使用的浏览器中测试这一点,以访问你的应用程序。

许可证

版权所有 2020 Kevin Smith

根据 Apache 许可证 2.0 版(“许可证”);除非遵守许可证,否则您不得使用此文件。您可以在以下位置获得许可证副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则在许可证下分发的软件是以“现状”为基础分发的,不提供任何形式(无论是明确还是暗示)的保证或条件。有关许可证的权限和限制的具体语言,请参阅许可证。