Safariでサブドメイン間でCookieが保存できない原因はドメイン名だった


環境

Safari 13.1.1
macOS Catalina

背景

ITPの仕様により、Safariでは、JavaScriptで生成するCookieが7日間しか保存されなくなりました。

私が参加しているプロジェクトでは、JavaScriptで生成しているCookieの保存期間を伸ばすために、サーバーサイドでCookieを発行することになりました。

実装としては、Nuxtのクライアント(hoge.co.jp)から、LaravelのAPIサーバー(api.hoge.co.jp)を叩いて、setcookieします(domainの指定はhoge.co.jp)。

開発環境では、クライアント(hoge.development)とAPIサーバー(api.hoge.development)のホスト名を設定して、サブドメインが異なる環境を再現しました(本番環境と全く同じにすると、本番環境に保存されていたcookieが共有されて不具合が生じたため)。

問題

上記の開発環境で試してみると、ChromeやFirefoxでは正常にCookieが保存されましたが、何故かSafariでだけ保存されませんでした。

(クライアントとAPIサーバーのドメインをどちらも hoge.development に合わせると、正常に保存されます。)

調べてみると、同じようにSafariでだけ、サブドメインから、ベースドメインに対してCookieを保存できないという問題が発生しているようでした。

解決法

この問題の発生例は、いずれも .test のような、開発用のドメインで起きているようでした。

そこで、開発環境のドメインを、 hoge.development ではなく hoge.co.jp に変えたところ、Safariでも正常にCookieが保存されるようになりました。

試しに色々なドメインに変えてみると、 .xyz.monster などマイナーなドメインでも保存できたので、Safariはトップレベルドメインが実在する場合だけ、サブドメイン間のCookieの保存を許可するのではないかと思われます。

学び

本番環境を再現する時は、細かい部分まで出来る限り再現しなければいけないという教訓が得られました。