0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tomcat上で動いているWebアプリでCookieにSameSite=Noneを付加する方法

Posted at

解決方法をかなり検索したが、Tomcatのバージョンによって書き方が異なっているようで、結局は使用しているTomcatバージョンの公式ドキュメントを熟読することで解決した。

前提条件

  • Tomcat11を使用している
  • サーバでは、Apatchがリクエストを受け取り、Tomcatにajpする形で通信を行っている
  • アプリはSpringBoot3系を使用して作っている

問題

WEBアプリでの処理フローが自サーバ→別サーバへ遷移して処理→自サーバへ遷移という形になっているシステムで、自サーバに戻ってきたときに、別サーバ遷移に保存していたセッション情報を取得できない問題が発生した。

原因は、自サーバに戻るタイミングのリクエストの際、別サーバ遷移前に付与していたJSESSIONIDおよびCookieを使用していないからであった。

自サーバに戻る際は、別サーバからPOSTでアクセスしており、このリクエストでJSESSIONIDを使用するには、クライアントへのJSESSIONID付与時、つまりサーバレスポンスでSet-Cookieヘッダを送信するときに、Same-Site=NoneSecure属性を付与しなくてはいけないことが分かった。

解決方法

組み込みTomcatではなく、外部のTomcatの上でアプリを動かしている場合は、Tomacatの設定ファイルに追記する必要がある。

Same-Site属性とSecure属性のどちらもserver.xmlに追記することで設定ができる。

ただし、設定箇所は両者で異なったため注意。

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がどうなっているか確認するとこんな感じになった。

setCookkie.png

setCookkie_header.png

その他

application.propertiesにプロパティを記載する方法もあるようで、下記の内容を記載して試してみたが、解決しなかった。

おそらく、下記のプロパティが有効なのは、組み込みTomcatを使っている場合のみなのではないかと考えている。

# クロスサイトリクエストでもクッキーを送信
server.servlet.session.cookie.same-site=none
# HTTPSでのみクッキーを送信するようにする
server.servlet.session.cookie.secure=true

同じ事象にぶつかった人は、自分が使っているバージョンでも同じタグやオプションが有効であるか、公式ドキュメントと照らし合わせながら確認してみるとよい。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?