如何设置 SameSite 属性?

Posted

技术标签:

【中文标题】如何设置 SameSite 属性?【英文标题】:How to set SameSite attribute? 【发布时间】:2018-11-13 02:28:29 【问题描述】:

我在 Cookie 中设置 SameSite 属性时遇到问题。我想设置这个属性,但是javax.servlet.http.Cookiejava.net.HttpCookie 都没有提供处理它的方法。因此,我有一个想法来创建一个响应javax.servlet.Filter 来捕获“Set-Cookie”标头并添加“SameSite=Strict”属性。

response.setHeader("Set-Cookie", response.getHeader("Set-Cookie") + "; SameSite=strict");

它工作正常,但是当我在一个响应中有多个“Set-Cookie”标头时会出现问题。 javax.servlet.http.HttpServletResponse 不提供删除或覆盖多个同名 heder 的方法(迭代它们并使用 setHeader() 不起作用,因为它总是设置最后一个)。您知道如何将 SameSite 属性设置为 cookie 或如何覆盖响应过滤器中的标头吗?

提前致谢。

【问题讨论】:

请看我对此案的详细回答HERE。 检查这个使用 GenericFilterBean / 临时重定向请求来解决同类问题***.com/questions/63939078/… 【参考方案1】:

事实证明,使用setHeader() 方法删除所有以前的同名标头,所以我只是在doFilter() 方法中创建简单的for 循环。它将SameSite=Strict 属性添加到每个设置的cookie。

boolean firstHeader = true;
for (String header : cookiesHeaders) 
    if (firstHeader) 
        httpResponse.setHeader("Set-Cookie",
                String.format("%s; %s", header, "SameSite=Strict"));
        firstHeader = false;
        continue;
    
    httpResponse.addHeader("Set-Cookie",
            String.format("%s; %s", header, "SameSite=Strict"));

【讨论】:

它对我不起作用,我使用的是 jetty 6.1 和 servlet API 2.5,这可能是原因吗? SameSite=Strict 属性在控制台上可见,但在浏览器上不可见。【参考方案2】:

在 etc/apache2/httpd.conf 中

标题编辑 Set-Cookie ^(.*)$ $1;SameSite=Strict


为我工作.....

【讨论】:

【参考方案3】:

新 Tomcat 通过TomcatContextCustomizer 支持 SameSite cookie。

对于 Spring Boot in 可以在 @Configuration 中完成,请参阅 https://***.com/a/60860531/548473 对于 Tomcat 应用程序 - 在 context.xml 中,请参阅 https://***.com/a/57622508/548473

【讨论】:

以上是关于如何设置 SameSite 属性?的主要内容,如果未能解决你的问题,请参考以下文章

<URL> 处的跨站点资源设置为没有 `SameSite` 属性 .NET

Springboot应用中设置Cookie的SameSite属性

使用 SameSite 和 Secure 属性设置 Google Tag Manager cookie

设置了没有“SameSite”属性的 cookie。 ......但我做到了

为啥我在尝试实施 Gmail Oauth 时将“SameSite”属性设置为“无”或无效值,而没有“安全”错误

dajngo设置cookie的samesite属性