2021年9月23日木曜日

突然のBad Requestの原因とその対応

ある日突然、自社の社内Webシステムにアクセスすると「Bad Request」が出るようになってしまいました。
しかもChromeユーザだけ。
私はFirefoxなので全く気づきませんでしたが、後輩が隣で悶絶しておりまして。
そこから1日がかりで解決したので(後輩が)パイセンのせめてもの務めとして記録しておきたいと思います。

<エラー内容>
ページにアクセスすると下記エラーが表示される
Bad Request
Your browser sent a request that this server could not understand.

これだけでググっても原因はブラウザのキャッシュだとかCookieだとかそんなことしか出てこないので原因究明に手間取りました。
Chromeユーザの全社員のブラウザキャッシュが飽和することはちょっとありえないので原因はサーバ側なんです。そこはわかる。

<原因>
1.Webサーバ側のApacheのリクエストヘッダー数の制限が20だった
2.Chromeバージョンアップで送信するリクエストヘッダーが増えた

<詳細>
Apacheはsecurity.confあたりにある「LimitRequestFields」という設定で
受信可能なリクエストヘッダー数を制限できます。
セキュリティ対策として使われる設定値で、これがWebサーバの納品時に20になっていたようです。ケチなのかトレンドなのか。
Chromeのバージョンアップのタイミングで自動送信するリクエストヘッダーが追加されたらしく
それにプラスして社内サイトは色々と認証だのなんだの制限をかけており、超えてしまったのが原因。

ちなみにChromeで追加されていたのは UA-CHというもので
===========
sec-ch-ua: "Google Chrome";v="93", " Not;A Brand";v="99","Chromium";v="93"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
===========
などなど将来的にUA文字列に取って代わるヘッダー情報ぽいですね。
Firefoxでエラーにならない理由もわかりました。

でも発現したタイミングが気になったのでもう少し調べてみたらそもそもChrome 89以上で既にUser Agent Client Hints(sec-ch-*関連)が送信されるようになっていたようです。
現在93なので今回サイトが超えたのはたまたまタイミングだったのかな・・・?ちょっとわかりません。
バージョンアップでExperimental Web Platform featuresの中の何かがデフォルトで有効になったのか、単にこっちのWebサーバ側で送り出すヘッダ情報を増やしたか(後輩が)
しかし何も変えてないからこそ後輩は突然殴られて悶絶したわけでうーん

そもそも明示的にクライアント側から送ってるヘッダーなんてそんなにないはずなんです。
強いて言うならCakePHPのフレームワーク関連とか。
情報が中途半端で恐縮なんですが、何かの参考になればと思います。

参考:LimitRequestFields ディレクティブ
https://httpd.apache.org/docs/2.4/ja/mod/core.html#limitrequestbody

LimitRequestBody ディレクティブは、 サーバ管理者が HTTP リクエスト中において許可するリクエストヘッダフィールド数を 指定します。(略)クライアントにより使われた要求ヘッダーフィールドの数が 20 を超えることはほとんどありませんが(略) オプションの HTTP 拡張はリクエストヘッダフィールドを使って表される場合が 多くあります。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。