業務で遭遇した現象でエビデンスも何もないし雑だが、自分用の備忘録として残しておく。
事象
AWS上に乗っけているオンラインアプリケーションに不具合があるとお客様から問い合わせがあった。事象は下記。
・アプリにログインしようとするとログインできずエラー画面が表示される
・エラー画面からログイン画面に戻り、再びログイン試行すると正常にログインできる
・ブラウザにはChrome、Edge(Chroniumu版)を使用。
環境
・ALB-EC2(webサーバ)-EC2(Apサーバ)-RDS‥という構成
・EC2とRDSはマルチAZ配置
・EC2(Apサーバ)にTomcatを導入しており、Javaアプリケーションが乗っている
・ALBにはアプリケーションベースのスティッキーセッションを設定しており、Tomcatが発行するCookie「JSESSIONID」に紐付けてCookie「AWSALBAPP-0」〜「AWSALBAPP-4」を発行するようになっている
原因
・ログを調査したところ、ログイン時にセッション切れが発生していたことが確認できた
・更にwiresharkを用いてパケットの中身を見たところ、ログイン画面アクセス時のfavicon.ico取得後に「AWSALBAPP-0」の値が空になっていることが確認できた
・「AWSALBAPP-0」の値が空になったことで、ログインボタンを押下した時のリクエストにてTomcatが初めて来たリクエストと認識し、新しいJSESSIONIDを発行
・その後の処理にて、JSESSIONIDが一致しないことでアプリ側のセッション有効性チェックに抵触してエラーとなっていた
なぜfavicon.ico取得後に「AWSALBAPP-0」の値が空になったのか?
・クライアントからサーバ側にfavicon.ico取得リクエストを送る際にJSESSIONIDが付与されていなかった
・JSESSIONIDに依存するAWSALBAPP-0の値も空になった
なぜfavicon.ico取得時にJSESSIONIDが付与されていなかったのか
・HTMLにfavicon.icoへのリンクが記載されていなかったことが原因。
・リンクが記載されていないとブラウザのデフォルト挙動でfavicon.icoを取得しようとするが、その際JSESSIONIDが付与されないらしい。(Chromeのセッションがリクエストされないときはfavicon.icoがないからかもを参考にした推測)
なお、2回目以降にログインエラーが発生しなかった理由は、favicon.icoの取得リクエストが送られていなかったからだった。(おそらく「favicon.icoがない」という情報がブラウザにキャッシュされるから?)
解決策
アプリのjspに、favicon.icoへのリンクを明示的に設定してあげたら、取得時のリクエストにJSESSIONIDが付与されるようになり、AWSALBAPP-0の値も空にならなくなり、セッションエラーも発生しなくなった。