解決方法をかなり検索したが、Tomcatのバージョンによって書き方が異なっているようで、結局は使用しているTomcatバージョンの公式ドキュメントを熟読することで解決した。
前提条件
- Tomcat11を使用している
- サーバでは、Apatchがリクエストを受け取り、Tomcatにajpする形で通信を行っている
- アプリはSpringBoot3系を使用して作っている
問題
WEBアプリでの処理フローが自サーバ→別サーバへ遷移して処理→自サーバへ遷移という形になっているシステムで、自サーバに戻ってきたときに、別サーバ遷移に保存していたセッション情報を取得できない問題が発生した。
原因は、自サーバに戻るタイミングのリクエストの際、別サーバ遷移前に付与していたJSESSIONID
およびCookieを使用していないからであった。
自サーバに戻る際は、別サーバからPOSTでアクセスしており、このリクエストでJSESSIONID
を使用するには、クライアントへのJSESSIONID
付与時、つまりサーバレスポンスでSet-Cookie
ヘッダを送信するときに、Same-Site=None
とSecure
属性を付与しなくてはいけないことが分かった。
解決方法
組み込みTomcatではなく、外部のTomcatの上でアプリを動かしている場合は、Tomacatの設定ファイルに追記する必要がある。
Same-Site
属性とSecure
属性のどちらもserver.xml
に追記することで設定ができる。
ただし、設定箇所は両者で異なったため注意。
server.xml
の記述内容の結論は以下の通り。
<Connector protocol="AJP/1.3"
address="0.0.0.0"
port="8009"
redirectPort="8443"
secure="true"/>
<!--中略-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="false" deployOnStartup="false">
<Context path="/app" docBase="app">
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="none" />
</Context>
<!--中略-->
</Host>
Same-Site属性の設定箇所
Same-Site
属性は、server.xml
のコンテストタグ内にCookieProcessor
タグを記述することで設定できた。
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="none" />
- 公式ドキュメントの参考ページ(CookieProcessorについて解説している)
Secure属性の設定箇所
Secure
属性は、ajp通信の定義部分に、secure="true"
を付与することで設定できた。
<Connector protocol="AJP/1.3"
address="0.0.0.0"
port="8009"
redirectPort="8443"
secure="true"/>
- 公式ドキュメントの参考ページ(Connectorについて解説している)
開発者ツールで確認
デベロッパーツールでCookieがどうなっているか確認するとこんな感じになった。
その他
application.properties
にプロパティを記載する方法もあるようで、下記の内容を記載して試してみたが、解決しなかった。
おそらく、下記のプロパティが有効なのは、組み込みTomcatを使っている場合のみなのではないかと考えている。
# クロスサイトリクエストでもクッキーを送信
server.servlet.session.cookie.same-site=none
# HTTPSでのみクッキーを送信するようにする
server.servlet.session.cookie.secure=true
同じ事象にぶつかった人は、自分が使っているバージョンでも同じタグやオプションが有効であるか、公式ドキュメントと照らし合わせながら確認してみるとよい。