私が直面したもの
JavaでWebアプリケーションを開発している際、RestTemplateを使用して外部のAPIへリクエストを送信するコードがありました。そのプロセス中、次のような警告メッセージがログに表示されました。
WARN 100 --- o.a.h.c.protocol.ResponseProcessCookies
Cookie rejected Illegal 'domain' attribute "〇〇.co.jp". Domain of origin: "xx.co.jp"
このメッセージは、レスポンスで返されたクッキーのdomain属性が、リクエストを送信したオリジンのドメインと異なるために拒否されたことを示しています。
この問題に対処しようと、RestTemplate および背後にある Apache HttpClient に関する公式ドキュメントやオンラインリソースを探しましたが、この特定の警告メッセージや、それに伴うクッキーの扱いについて明確に解説している資料は見つかりませんでした。
唯一見つかった参考資料は、こちらのQiitaの記事 だけでした。そこで、この問題に直面する可能性がある他の開発者を助け、私のケースについての情報を共有するために、本記事を執筆することにしました。
環境
- OS:Windows 10
- Javaのバージョン:Oracle JDK 17
- フレームワーク:Spring Boot 2.6
問題の HttpClient
- org.apache.httpcomponents:httpclient:4.5
背景
サーバーが外部APIにリクエストを送信し、そのレスポンスを受け取るプロセス中に、レスポンスヘッダーから特定の値を抽出するロジックを実装しています。このプロセスを通じて、Spring.log に次のような警告ログが記録されることに気づきました。
WARN 100 --- o.a.h.c.protocol.ResponseProcessCookies
Cookie rejected Illegal 'domain' attribute "〇〇.co.jp". Domain of origin: "xx.co.jp"
このログは、レスポンスで返されたCookieが不正なdomain属性を持っており、それが原因でクッキーが拒否されたことを示しています。
原因
RestTemplate が内部的に使用している Apache HttpClient の挙動が重要な役割を果たしていることが分かりました。
Apache HttpClient は、デフォルト設定で特定の動作をします。
この HttpClient、デフォルトの挙動では、通信先から Set-Cookie されたものを次のリクエスト時に Cookie ヘッダにセットして送ろうとします。(参考資料より抜粋)
このケースでは、RestTemplateがApache HttpClientを利用していることが、予期しない動作の原因となっていました。Apache HttpClientの特定の仕様が、この問題を引き起こしていたのです。
解決策
今回の箇所では、クライアントからのリクエストがサーバーに送信され、サーバーはこれを外部APIに転送しています。その際、外部APIからのレスポンスヘッダーがクライアントにCookieとして送り返されます。
このプロセスにおいて、サーバーは外部APIに対してCookieを送信する必要がありません。
したがって以下記載のように、ヘッダーにCookieを自動的に追加しない設定にすることで、問題を解決することができました。
HttpClientBuilder httpClientBuilder = HttpClients.custom().disableCookieManagement()
参考資料