php7.3より前で CookieのSameSite属性に対応する
問題
2020年2月にアップデートが予定されている「Google Chrome 80」より、CookieのSameSite属性を未設定時の挙動変更がアナウンスされています。
この挙動変更により、WebサイトのCookieの使用方法によっては、外部サイトとの画面連携が正しく行えなくなる可能性があります。
外部サイトからの画面連携する処理フローにて、画面連携時(外部サイトからPOSTメソッドで遷移してくるとき)にログイン状態等の情報が取得できなくなる可能性があります。
セッションCookie発行時に、SameSite=None; Secure
を付与しないといけないらしいのですが、どうしたらよいでしょうか。
答え
php7.3以降
php7.3からは、setcooike関数、session_set_cookie_params関数で、samesite属性を設定できるようになりました。可能ならばそちらを利用しましょう。
php7.2以前、php5
samesite属性に対応していません。
推奨される対応方法ではありませんが、限られた時間で手っ取り早く対応するには以下の方法があります。
不具合というか、実装がいい加減なところを狙った以下のハックを利用すると、samesite属性を設定可能です。
<?php $_cp = session_get_cookie_params(); session_set_cookie_params($_cp['lifetime'], $_cp['path'] . '; SameSite=None', $_cp['domain'], true, true); session_start();
Cookieのpath指定の後にSameSite属性もくっつけてしまいます。
状況に応じて、None は Lax や Strict に書き換えてもよいです。
うまく設定できているかどうかは、開発者ツールで確認できます。
CookieのSameSite属性って何?
他サイトに自サイトの画像やiframeなどが埋め込まれた時、他サイトから自サイトに画面遷移したときなどに、Cookieを送るかどうかが指定できる。
Strict = SameSite 以外からの全てのリクエストで一切 Cookie を送らなくなる。他サイトから自サイトへ移動したときにも送らなくなるのでログインのあるWebサイトでは毎回ログイン画面が出ることになる。
Lax = cross-site のリクエストでは、 safeなtop-level navigation 以外は Cookie を送らない。→ GETで他サイトから遷移するときは送る。POSTで他サイトから遷移するときは送らない。
他サイトからPOSTで画面遷移してもログイン状態が維持される(セッションCookieが送信される)のを期待していると、いずれそうならなくなる。
None = 制限なし。サードパーティCookieをこれまで通りすべて許可。
samesiteでなくても制限なく今まで通りCookieを送信してほしかったら、Set-Cookieするときに SameSite=None; Secure
を付与する。そうしないと各社ブラウザが次第にSameSite属性に対応していくと、期待した通りにCookieが送信されない場合が出てくる。
メモ
Laxで外部サイトからPOSTで遷移してくる、Strictで外部サイトから遷移してくるとき、Cookieが送信されません。このときsession_start()すると、php側からSet-Cookieヘッダが送信されて、ブラウザはCookieを上書きし、新しいセッションになります。もともとログインしていたユーザーはログアウトすることになります。
メモ
Laxで外部サイトからPOSTで遷移してくる、Strictで外部サイトから遷移してくるとき、Cookieが送信されません。このあと、リダイレクトで自サイトの別ページなどに遷移すると、そのときは Cookie が送信されてきます。
用語メモ
registrable domain
ホスト名の、public suffix(.com, .jp, .co.jp など)とその左の1つまでのドメイン。
www.example.com の registrable domain は example.com
same-site
registrable domain が同じなら same-site
cross-site
registrable domain が同じでないなら cross-site
top-level navigation, top-level browsing context
子がいて親がいて…という話が
https://html.spec.whatwg.org/#windows
“Safe” HTTP methods
“GET”, “HEAD”, “OPTIONS”, and “TRACE” が含まれる。
→ POST、PUT、DELETEは違う
参考URL
https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-02
コメント