JavaScript
CORS

Safariだと3rd party cookieの制約(ITS)で、別ドメインへのAJAXコールでCookieが付与されないお話

概要

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として扱われるっぽいです)