Safari 13+ iframe, CORS 쿠키 차단


9

Safari 플랫 아웃을 사용하면 부모 도메인과 다른 도메인의 iframe에서 쿠키를 설정할 수 없으므로 서버 측 CORS 헤더가 손상됩니다.

명확히하기 위해 : 사용자는 domainA.com에 있습니다. domainB.com 용 iframe이 열려 있고 iframe 내의 domainB.com에서 사용자를 인증하려고합니다. Set-Cookie 헤더는 필요한 모든 헤더와 함께 domainB.com iframe 내의 서버에서 반환되지만 Safari는 후속 호출에서 헤더를 다시 보내지 않습니다.

오래된 해결 방법은 iframe에서 양식 제출을 수행하고 응답에 쿠키를 설정했습니다. 그들은 사용자가 양식을 제출하기 위해 무언가를 클릭하고 있다는 사실을 좋아했다고 생각합니다. 양식 제출에는 콜백이 없으므로 HttpOnly 쿠키의 경우에는 할 수 없었지만 쿠키가 작동하지 않았기 때문에 응답이 언제 왔는지 확인하기 위해 쿠키를 폴링해야합니다. 그렇지 않을 때까지.

그런 다음 최신 해결 방법은 새로운 창 / 탭에서 사용자를 iframe 도메인으로 리디렉션하여 거기에 임의 쿠키를 설정 한 후 해당 하위 도메인이 iframe 내부에서 "신뢰"되었습니다. 다시 한 번 클릭하여 새 창 / 탭을 열어야했으며 새 탭 열기를 시각적으로 표시하기까지했습니다. 많은 보안, 표준.

이제 Safari 13부터는 더 이상 해결 방법이 없습니다. 더 이상 안전한 iframe 쿠키 설정이 없습니다

다른 인증 체계는 우리에게 좋지 않습니다 (예 : Auth-X 헤더). 자바 스크립트 클라이언트 측에서 토큰에 액세스 할 수 없도록하기 위해 HttpOnly 보안 쿠키를 사용해야합니다.

분명히 모든 것이 다른 브라우저에서 훌륭하게 작동합니다.

관련 WebKit Bugzilla

누구든지 제안이 있습니까?

편집하다:

@tomschmidt 링크에 감사드립니다. 올바른 방향으로 보입니다. Apple의 Storage Access API를 사용해 보았지만 불행히도 API로 로그인 논리를 초기화하기 전에 액세스를 요청하고 있지만 :

requestStorageAccess = async() => {
    return new Promise(resolve => {
      //@ts-ignore
      document.requestStorageAccess().then(
        function () {
          console.log('Storage access was granted');
          resolve(true);
        },
        function () {
          console.log('Storage access was denied');
          resolve(false);
        }
      );    
    });
  }


const storageAccessGranted = await requestStorageAccess();
console.log(storageAccessGranted) // prints 'true'
await login();

여전히 / login API 응답에서 수신 된 쿠키는 후속 호출에서 API에 전송되지 않습니다.


onclick과 같이 iframe과의 명시 적 상호 작용에서만 트리거되도록하십시오.
tomschmidt

1
네, 그렇게 했어요 내가 연결 한 웹킷 bugzilla 문제를 확인하십시오. 이것이 Safari의 마지막 버그 인 것 같습니다 : /
Tom Teman

문제는 쿠키가 전송되지 않는다는 것이 아닙니다. 스토리지 액세스를 요청하면 기존 쿠키가 서버로 전송됩니다. 문제는 새로운 쿠키가 전혀 저장되지 않기 때문에 쿠키가 전송되지 않는다는 것입니다.
Matt Cosentino

@MattCosentino 그렇습니다. "/ login API 응답에 수신 된 쿠키"는 Set-Cookie 헤더 응답으로 iframe 도메인으로 다시 전송되는 새로운 쿠키이지만 iframe 도메인의 다음 호출에는 해당 쿠키가 포함되지 않습니다. 요청에 쿠키. 문제의 근본 원인은이 시나리오에서 브라우저에 새 쿠키가 저장되어 있지 않다는 것입니다.
Tom Teman

답변:



0

따라서 새 창에서 저장하려는 쿠키를 저장하는 한 해결 방법이 여전히 작동합니다. iframe은 여전히 ​​자체 쿠키를 저장할 수 없습니다. 필자의 경우 세션 ID 쿠키 만 있으면됩니다. 따라서 사용자가 스토리지 액세스 권한을 부여하면 작은 팝업 창을 엽니 다. 세션 ID 쿠키를 가져오고 저장하고 iframe을 닫았다가 다시로드합니다. 그런 다음 iframe은 세션 ID 쿠키에 액세스하여 후속 요청으로 보냅니다. 나는 이것이 일시적인 것이라고 생각하지만 나중에 언젠가 팝업 창에서 스토리지 액세스를 제거 할 것으로 보입니다. 아마도 그들은 그때까지 iframe이 쿠키를 저장할 수 없도록 수정 할 것입니다.


매트, 나는 팝업과 함께 비슷한 솔루션을 사용했는데 데스크탑 Safari 13.1에서 작동하지만 iPad Safari 13.4에서는 테스트가 작동하지 않습니다. 이 작업을 iPad에서 수행 할 수 있었습니까? Thnx
팀 데인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.