SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

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

https://html.spec.whatwg.org/#windows

関連するメモ

コメント