Apache HTTP Serverのサポート対応事例
stateタイムアウト時のエラー画面が正しく表示されない問題を解消
mod_auth_openidcでは、認証リクエストでmod_auth_openidcが発行するstateにタイムアウト(デフォルトは5分)を設定することができます。OPでの認証の際にログイン画面表示後にすぐにログインせずに放置したケースなどで、認証レスポンスで送信されきたstateが上記タイムアウト時間を超過することがあります。その場合、mod_auth_openidcはstateのタイムアウトを検知して、タイムアウトエラー画面を表示します。
ある顧客環境で、このstateタイムアウトエラーが発生した際に、エラー画面が適切に表示されないという問い合わせがあり、調査を行いました。
再現確認および調査
顧客環境では、ELB + Apache(2.4.43) + mod_auth_openidc(2.4.0.3)が利用されていました。Apacheとmod_auth_openidcだけを使ったシンプルな構成では問題が再現しなかったため、ブラウザやELBの経由の有無を変えながら調査を行っていたところ、ELB経由かつIEもしくはChromeを使っている場合に問題が再現することが特定できました。
ELB経由\ブラウザ |
IE |
Chrome |
FireFox |
---|---|---|---|
ELB経由なし |
再現せず |
再現せず |
再現せず |
ELB経由あり |
★再現★ |
★再現★ |
再現せず |
なぜこのような動作の違いが生じているのか確認するため、ネットワークキャプチャを取得してレスポンスの中身を確認したところ、下記のようにエラー画面のレスポンスが想定外な状態になっていることが分かりました。

「本来のエラー画面レスポンス」の下に、本来は出力されるべきでない「重複したエラー画面レスポンス + Apacheのエラー画面レスポンス」が出力されてしまっており、Content-Lengthに一致したレスポンスサイズになっていないことが分かりました(Content-Lengthは、「本来のエラー画面レスポンス」のサイズだけになっています)。
リバースプロキシとしてApacheだけを使っている場合は、実際のレスポンスボディサイズとContent-Lengthが一致していない場合でも、何事もなかったように処理されてしまうため、顧客環境の問題は再現しませんでした。一方で、 ELBを経由している場合には、実際のレスポンスサイズとContent-Lengthが一致していないと、IEやChromeを使っている場合には、ブラウザが正しくレスポンスを受け取ることができなくなります(ブラウザ自身のエラー画面や真っ白い画面になる)。
まとめ
上記のような調査結果から、以下の4つの条件を満たした場合に、問題の事象が再現することが判明しました。
- mod_auth_openidcが2.4.1以下である
- OIDCStateTimeoutを超過してタイムアウトエラーが発生する
- ロードバランサにELBを利用している
- ブラウザとして、IEもしくはChromeを使用している
直接の原因は、stateタイムアウト発生時のエラー画面レスポンスが不正な状態で出力されていることです。
当該問題に関しては、mod_auth_openidcのコミュニティに報告を行い、バグとして修正されました。 実際のやりとりは以下の通りです。
mod_auth_openidc 2.4.2以降でこの問題は修正されています。