Safari set-cookie 不适用于第一方 cookie

far*_*ahm 3 cookies safari spring http token

当我登录时,我返回到浏览器:

Overview
URL: https://subdomain.domain.de:8444/api/auth/login
Status: 200
Source: Network
Adresse: xxx.xxx.x.xx:8444
Initiator: 
xhr.js:177


Request
POST /api/auth/login HTTP/1.1
Accept: application/json, text/plain, */*
Content-Type: application/json;charset=utf-8
Origin: https://subdomain.domain.de
Content-Length: 62
Accept-Language: de-de
Host: subdomain.domain.de:8444
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Safari/605.1.15
Referer: https://subdomain.domain.de/login
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

Response
HTTP/1.1 200
Access-Control-Allow-Origin: https://subdomain.domain.de
Content-Type: application/json;charset=UTF-8
Pragma: no-cache
Set-Cookie: accessToken=FycxgaSUgHnBlzMqYn/qsBEm5YBcmX52/eYbm+daUHPP1Fa7edawdawdawO1EdJlz9nyP5FrlPYnh/b//SZJRDs0Am8sGF+UZ+XffvPra8awdawd9+RbHiN0WcL+9T4xLlueMxd5bNVRVKHqeTonSK02Ym0cLxfALOeHrmbdqLS95uNOlzFYbjOuGV7bhwLGk5bavNPv9IWKqNAILAbkkw+gdawdawduM+BXdGE7KFbUgxvGmDw==; Path=/; Domain=subdomain.domain.de; Max-Age=PT448343981H30M29S; Expires=Sat, 16 Apr 2072 22:57:46 GMT; Secure; HttpOnly;SameSite=Lax
Set-Cookie: refreshToken=FycxgaSUgHnBlzMqYn/qsBEm5YBawdawdadawdupnO1EdJlz9nyP5FrlPYnh/b//SZJRDs0Am8sGF+UZ+XffvPra84jWTk9+RbHiM1+aNElVA8jXewqlexh7tGKuawdawdv4pxzC/RsDoGS/Jc8Xkzg133dYMCr7mRHlkU7jijoJrPYUAayiewVIMPUh/IE8sGUqIMKbiGoqAJAawdawdawdawdawdaw03GS4XgbwFj76V2AAAw==; Path=/; Domain=subdomain.domain.de; Max-Age=PT450502981H30M31S; Expires=Fri, 15 Jul 2072 21:57:46 GMT; Secure; HttpOnly;SameSite=Lax
X-XSS-Protection: 1; mode=block
Expires: 0
Transfer-Encoding: Identity
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Date: Mon, 22 Feb 2021 22:58:53 GMT
Access-Control-Allow-Credentials: true
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
Strict-Transport-Security: max-age=31536000 ; includeSubDomains

Request data
MIME-Typ: application/json
Codierung: utf-8
Anfragedaten: 
Run Code Online (Sandbox Code Playgroud)

我还看到了响应中的 cookie:

在此输入图像描述

但 cookie 不会保存在浏览器中。这是我在 Spring 后端创建的第一方 cookie。

在 Spring Boot 中,我创建如下 cookie:

import org.springframework.http.HttpCookie;
import org.springframework.http.ResponseCookie;


@Component
public class CookieUtil {

    public HttpCookie createAccessTokenCookie(String token, Long duration) {
        return ResponseCookie.from("accessToken", token).maxAge(duration).httpOnly(true).path("/").build();
    }

    public HttpCookie createRefreshTokenCookie(String token, Long duration) {
        return ResponseCookie.from("refreshToken", token).maxAge(duration).httpOnly(true).path("/").build();
    }
}
Run Code Online (Sandbox Code Playgroud)

jcc*_*ero 6

有很多与 Safari 和 cookie 使用相关的问题,如果您查找与该问题相关的信息,您会发现多个错误和解决方案,其中一些适用于某些情况,另一些则适用于另一种情况。

虽然Lax更好(请参阅这篇精彩的文章),但您可以尝试的一件事是将 cookieSameSite属性设置为None。请注意,此更改可能相关并影响其他浏览器(尤其是 Chrome)中的应用程序行为。

您可以尝试的另一件事是将 cookie 的域设置为类似.domain.de或 的值domain.de,以避免任何可能的子域相关问题。

最后,请注意以下事实:在您的屏幕截图中,最大年龄的值似乎未正确打印。可能不是,但对于您指出的同一版本的 Safari,可能有类似的问题,在此问题中已报告:OP 通过调整 cookie 属性的值解决了问题max age。请尝试该信息的不同值,也许它有效。

根据您的评论,供将来参考,在某种程度上,问题似乎实际上与 cookie 有关max age:从 cookie 中删除max age值看起来像是该问题的临时解决方法。

  • 我遇到了这个问题,我的网站可以选择设置 MaxAge 的长期 cookie 和不设置 MaxAge 的会话 cookie。看起来 MaxAge 是我的问题,因为我可以使用单个会话选项登录 (2认同)
  • 我想添加另一个潜在的罪魁祸首。在我今天遇到的情况下,cookes 在所有 IOS 浏览器和 Safari 上都被阻止,但在桌面 Chrome/Brave/Firefox/... 中工作...问题是,如果设置了“路径”,Safari 似乎不会保存 cookie 。我认为很多人不经常使用它,所以我还没有找到任何关于此的信息,并想提及它以防其他人遇到它。当我删除路径后,两个 IOS 浏览器(如 safari)都开始工作。 (2认同)