我正在开发的 Web 应用程序的一部分与另一个我无法控制的 Web 应用程序集成。由于最近强制实施 SameSite cookie 属性,此集成已停止工作。要使此集成重新开始工作,我的会话IDcookie 需要有SameSite=无属性集,以及安全的(原因很明显)。
我和我的团队决定让 Apache 服务器来处理这种情况,这在部分时间内是有效的。
顺便提一下,我们还决定设置SameSite=Strict对于所有 cookie,但应设置为SameSite=无。
这是我的cookies配置文件,包括在我的apache2.conf(名称用占位符替换):
Header edit Set-Cookie ^(.*)$ $1;Secure;SameSite=Strict;
<If "%{THE_REQUEST} =~ m#.*\/application-instance\/subset-of-app.*#">
Header edit Set-Cookie (JSESSIONID.*) $1;Secure;SameSite=None;
</If>
第一个 Header 指令行可以完美运行,If 语句中的行也可以,但它在 If 语句之外。不起作用的是表达式。
我在这里做错了什么? 有可能这样做吗,还是我误解了什么? 希望有足够的信息,并且我在正确的页面上。
编辑:
我可能应该提到,我可以成功地将应用程序整个实例的 cookie 设置为“SameSite = None”,如下所示:
<If "%{THE_REQUEST} =~ m#.*\/application-instance.*#">
Header edit Set-Cookie (JSESSIONID.*) $1;Secure;SameSite=None;
</If>
此外,我知道应用程序子集的正则表达式有效,因为这些行实际上创建了一个具有相同名称和值的新 JSESSIONID-cookie,但 SameSite=None,仅适用于指定的路径:
<If "%{THE_REQUEST} =~ m#.*\/application-instance\/subset-of-app.*#">
SetEnvIf Cookie "(^|;\ *)JSESSIONID=([^;\ ]+)" JSESSIONID_VALUE=$2
Header always set Set-Cookie JSESSIONID=%{JSESSIONID_VALUE}e;Secure;SameSite=None;Path=/application-instance/subset-of-app.page;
</If>
我不是很确定这是解决这个问题的正确方法,因为两个 JSESSIONID-cookie 可能会在第三方应用程序中产生不一致的结果。
答案1
在我看来,好像在/application-instance/subset-of-app,两个规则都应该触发,所以你设置了 cookie:
JSESSIONID=...;Secure;SameSite=Strict;Secure;SameSite=None;
由于 SameSite 被设置为不同的值两次,这会让客户端感到困惑吗?所以也许你想要:
Header edit Set-Cookie ^(.*)$ $1;Secure;SameSite=Strict;
<If "%{THE_REQUEST} =~ m#.*\/application-instance\/subset-of-app.*#">
Header edit Set-Cookie (JSESSIONID.*);SameSite=Strict; $1;SameSite=None;
</If>
您可以Set-Cookie
使用curl -sv
或浏览器的开发工具检查响应标头值,这可能有助于您弄清楚发生了什么。