Safari 13以降のiframeがCORS Cookieをブロックする


9

Safariのフラットアウトでは、親ドメインとは異なるドメインのiframeにcookieを設定できません。サーバー側のCORSヘッダーは抑制されます。

明確にするために:ユーザーはdomainA.comにいます。domainB.comのiframeが開いていて、iframe内のdomainB.comのユーザーを認証しようとします。Set-Cookieヘッダーは、必要なすべてのヘッダーとともに、domainB.com iframe内のサーバーから返されますが、Safariは後続の呼び出しでそれを送り返しません。

以前の回避策は、iframeからフォームを送信し、応答にCookieを設定することでした。ユーザーがフォームをクリックして何かを送信するのが好きだったのではないでしょうか。フォームの送信にはコールバックがないため、Cookieをポーリングして応答がいつ返されたかを確認する必要があります。また、HttpOnly Cookieの場合はできませんでしたが、うまくいきました。それがなかったまで。

次に、より最近の回避策は、ユーザーを真新しいウィンドウ/タブでiframeドメインにリダイレクトし、そこにランダムなCookieを設定し、その瞬間から、そのサブドメインがiframe内で「信頼」されたことです。ここでも、新しいウィンドウ/タブを開くにはクリックが必要で、新しいタブが開いていることを視覚的に示すこともありました。多くのセキュリティ、そのような標準。

そして今、Safari 13以降-回避策はありません。安全なiframe Cookie設定はもうありません 🤬

その他の認証スキームは、私たちには適していません(例:Auth-Xヘッダー)。HttpOnlyセキュアCookieを使用する必要があります。これは、そのトークンがJavaScriptクライアント側からアクセスできないようにするためです。

明確にするために、すべてが他のブラウザでうまく機能します。

関連する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応答で受信したCookieは、APIへの後続の呼び出しで送信されません:(


これは、onclickなどのiframeとの明示的な相互作用でのみトリガーされることを確認してください。
tomschmidt

1
ええ、それが私がやった方法です。私がリンクしたwebkit bugzillaの問題を確認してください。これはSafari側の実際のバグだと思います:/
Tom Teman

問題は、Cookieが送信されないことではありません。ストレージアクセスをリクエストすると、既存のCookieがサーバーに送信されます。問題は、新しいCookieがまったく保存されないため、送信する必要がないということです。
Matt Cosentino

@MattCosentinoそうです、つまり、「/ login API応答で受信されたCookie」は、Set-Cookieヘッダー応答でiframeドメインに返送される新しいcookieですが、iframeドメインからの次の呼び出しには含まれていませんリクエスト内のCookie。ですから、はい、問題の根本は、このシナリオではブラウザーに新しいCookieが保存されていないということです。
トムテマン

回答:



0

そのため、新しいウィンドウに保存したいCookieが保存されている限り、回避策はまだ機能します。それでもiframeは独自のCookieを保存できません。私の場合、必要なのはセッションID Cookieだけでした。そのため、ユーザーがストレージアクセスを許可すると、小さなポップアップウィンドウが開きます。セッションID Cookieを取得して保存し、iframeを閉じてリロードします。次に、iframeはセッションID Cookieにアクセスし、それを後続のリクエストで送信します。これは一時的なものだと思いますが、将来的にはポップアップウィンドウからストレージアクセスを削除する予定です。おそらく、それまでにiframeがCookieを保存できなくなる問題を修正するでしょう。


Matt、私はポップアップで同様のソリューションを使用しましたが、これはデスクトップSafari 13.1で機能しますが、iPad Safari 13.4でテストすると機能しません。iPadでこれを機能させることができましたか?Thnx
teamdane
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.