環境
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の保存を許可するのではないかと思われます。
学び
本番環境を再現する時は、細かい部分まで出来る限り再現しなければいけないという教訓が得られました。