課題
この問題は、POSTメソッドを使って別のドメインの別のポータルからデータを受信するときに発生します。リクエストヘッダがSameSite=LAXのときに安全でないとみなされますが、このヘッダが(私たちのポータルのように)宣言されていない場合、デフォルトでブラウザがその値をLAXとして設定するためです。
このため、クッキーは拒否されます。コンソールの警告メッセージ「Indicate whether to send a cookie in a cross-site request by specifying its SameSite attribute」を見ると、JSESSIONIDがそのうちの一つであることがわかります。
Lax Cookieをサイト間で送信できる状況は、次の両方を満たす必要があります:
1. リクエストは、トップレベルのナビゲーションである必要があります。 これは、ユーザーがリンクをクリックして別のサイトに移動するなど、URLバーに表示されるURLが変更された場合に相当すると考えることができます。
2. リクエスト・メソッドは安全なものでなければなりません(例:GETまたはHEAD、ただしPOSTは不可)。
例:
- ユーザーが site-a.com にいて、 site-b.comに行くためのリンクをクリックしたとします。 これはクロスサイトリクエストです。 これはトップレベルのナビゲーションであり、GETリクエストであるため、Laxクッキーはsite-b.comに送信されます。 しかし、結局のところクロスサイト リクエストなので、Strict Cookie は送信されません。
- ユーザーは site-a.com にいて、 site-b.com がロードされている iframe があります。 これはクロスサイトリクエストですが、トップレベルのナビゲーションではありません(ユーザーはまだsite-a.comにいます、つまりiframeが読み込まれてもURLバーは変わりません)。 したがって、LaxクッキーもStrictクッキーもsite-b.comには送られません。
- ユーザーは site-a.com 上にいて、フォームを site-b.comに POST しています。 これはクロスサイトリクエストですが、メソッド(POST)が安全ではありません。 Laxクッキーがクロスサイトに行く基準を満たしていないので、LaxクッキーもStrictクッキーも site-b.comには送られません。
環境
- DXP 7.0以上
解決
もし、GETメソッドを使用できない場合は、ポータルで行われているように、独自ドメインへのre-POSTを、このフィルタクラス SamlSameSiteLaxCookiesFilter.java で行い、このコンポーネントプロパティを使用するようにしてください。
"before-filter=Session Id Filter"
これにより、フィルターが「HttpServletRequest.getSession(true)」の呼び出しよりも先に処理されることが保証されます。セルフリダイレクトが行われない場合、新しいセッションが作成されないことが重要であるため、cookieの設定は避けるべきです。
追加情報
私たちのポータルに新しいフィルタを追加するには、このページを使用することができます:Servlet Filters