EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

http/httpsが混在する環境でのセキュアCookieの取り扱い

WEBサービスhttpsで提供するのが当たり前になりました。 イートスマートのWEBサービスhttpsへの移行を完了しています。

www.eatsmart.jp

mognavi.jp

cookingschool.jp

そうした中で、社内向けツールで不具合が報告されました。 社内向けツールなので、スタッフが社内からのみ利用します。このため、httpsへの移行を行うことなく利用していました。 ドメインは社内向けツールが共通で利用するもの(仮にeatsmart.officeとします)となっていて、以下のようなURLでアクセスして利用しています。

http://eatsmart.office/backend/

不具合の内容から、どうやらセッションが維持出来ていないことが原因のようです。 アプリケーションはTomcatで稼働しています。セッションは HttpServletRequest#getSession で参照します。 セッションIDをログに出力して確認したところ、セッションは正しく維持されており、問題なく操作が行なえます。 再現することが出来なかったこともあり、報告のあったスタッフには一旦Chromeのシークレットウィンドウで作業をしてもらうことで対応しました。

その後、社内ツールの機能追加を行い動作を確認していたところ、報告のあった不具合が発生しました。 アクセスするたびにセッションIDが新しくなります。Tomcatでセッションの管理にはCookieを利用しています。 Cookieの内容を確認するためChromeでJSESSIONIDを調べたところ、セッションIDが書き込まれていませんでした。 不思議に思い、何度もリロードしたり、明示的にJSESSIONIDを書き出しても、Cookieには書き込まれません。

次にレスポンスヘッダに問題が無いかChromeのNetworkタブを見たところ、以下のような警告が表示されていました

f:id:eatsmart:20200710174623p:plain
screenshot

既にセキュアCookieが存在するため上書き出来ないというエラーです。 上にも書いたように社内向けツールはhttpsへ移行していないためセキュアCookieを利用していません。 そこで調査をしたところ、もぐナビの社内向け環境が同一ドメインで稼働していました。

https://eatsmart.office/

もぐナビはhttpsへ移行しているため、もぐナビの社内向け環境もhttpsとなっており、かつセキュアCookieを利用していました。 このため、先にもぐナビの社内向け環境にアクセスしてセキュアCookieが書き込まれてしまうと、社内向けツールでCookieに書き込めない状態になっていました。

セキュアCookieのこのような挙動は理解していましたが、社内からのみ利用する環境だったこともあり、発見するまで時間がかかってしました。 http/httpsが混在する環境かつどちらでも書き込み・参照が必要なものにかんしては、アプリケーションサーバがセキュアCookieを書き出さないか確認が必要です。