概要
Javascriptで別ドメインへのAJAXコールを行う処理を実装していたところ、ChromeやFireFoxでは問題なく動作したが、SafariではCookieが送信されていないことに気づいたというお話(その際特にエラーも出ず、ただ単にCookieが送信されない)。
原因
safariのITS対応 なるものがあったらしく、
Safari11.0からはデフォルトで3rd party cookie(別ドメインに対し付与されるCookie)は禁止されるようです。
ひでぇ…あんまりだ…
(Chrome等別のブラウザでも、3rd party cookieは広告での利用が多くユーザへの利便性がないため禁止する方向に向かっているようで、例えばChromeでは設定を変更すれば禁止できるようです。今後は原則考慮に入れる必要がありそうです。)
参考: Safariの新機能ITPと広告、Cookieについてのおさらい
構成
※ ドメイン等一部の値は仮の値を入れています
HTMLを返すWebサーバと、AJAXコールで呼び出す用のAPIサーバが別サーバになっており、ドメインも完全に別のものになっていた
- HTMLを返すWebサーバの中身はWordpress (ドメイン:www.service.com)
- APIサーバはHerokuでNodeJsのExpress (ドメイン:api.heroku.app)
つまりwww.service.comから取得したJavascript上で、api.heroku.appへリクエストを送信する。
対策
最終的にはAPIサーバのドメインを、api.service.com にすることで回避しました。
(挙動的を見る限りは、レジストラから取得したドメインservice.comのサブドメイン同士であれば、1st party cookieとして扱われるっぽいです)