odan blog

Firebase Authentication のパフォーマンスを計測してみた

概要

Firebase Authentication はユーザー認証に関するサービスです。様々な認証方式をサポートしており、活用することで認証に関する実装を大きくサボることが可能になるものです。

一方で、パフォーマンスには難点があることが知られており、firebase auth 遅い - Twitter検索 / Twitter を見ると、いくつかの人が遅さについて言及しています。

そこで、パフォーマンスについて測定したので、その結果をまとめます。

環境

実験を行った環境は以下の通りです。ネットワークによる影響を調べるために、2つのリージョンで実験を行いました。

パフォーマンス測定の対象となる関数

以下の関数についてパフォーマンスの計測を行いました。

  • admin.auth().createUser
  • admin.auth().getUser
  • firebase.auth().onAuthStateChanged
  • firebase.User の getIdToken
  • admin.auth().verifyIdToken (checkRevoked が true)
  • admin.auth().verifyIdToken (checkRevoked が false)

測定結果

各関数を10回ずつ実行したときの、平均時間と標準偏差を結果に書いています。

ap-northeast-1

関数結果
admin.auth().createUser859.8 ms ± 65.3 ms (10 runs)
admin.auth().getUser346.2 ms ± 15.0 ms (10 runs)
firebase.auth().onAuthStateChanged0.0 ms ± 0.0 ms (10 runs)
firebase.User の getIdToken0.0 ms ± 0.0 ms (10 runs)
admin.auth().verifyIdToken (checkRevoked が true)430.8 ms ± 220.1 ms (10 runs)
admin.auth().verifyIdToken (checkRevoked が false)0.3 ms ± 0.5 ms (10 runs)

us-east-1

関数結果
admin.auth().createUser418.1 ms ± 108.4 ms (10 runs)
admin.auth().getUser124.5 ms ± 23.8 ms (10 runs)
firebase.auth().onAuthStateChanged0.0 ms ± 0.0 ms (10 runs)
firebase.User の getIdToken0.1 ms ± 0.3 ms (10 runs)
admin.auth().verifyIdToken (checkRevoked が true)121.7 ms ± 36.5 ms (10 runs)
admin.auth().verifyIdToken (checkRevoked が false)0.3 ms ± 0.5 ms (10 runs)

感想

firebase-admincreateUsergetUserverifyIdToken (checkRevoked が true) は、リージョンが異なると実行時間に倍以上の違いがあることがわかりました。Firebase Authentication のバックエンドはアメリカにあり、東京からリクエストを行うと、アメリカまでの通信 + 認証に関する処理に時間がかかっているようです。 getUser は us-east-1 だと遅くはないが速くもない程度ですが、ap-northeast-1 では遅いと感じ始めるぐらいのレスポンスタイムでしょうか。

書き方が悪かったのか onAuthStateChanged はどちらのリージョンでも実行時間を計測することが出来ませんでした。ブラウザでこの関数を待つと 500ms 程度かかる記憶がありましたが、サインイン方式や ブラウザ/NodeJS の環境の違いによるもの何でしょうか。

まとめ

Firebase Authentication の関数についてパフォーマンスの計測を行いました。

firebase-admin の参照系の関数を東京から呼ぶと、300~400 ms 程度の時間がかかることがわかりました。

ブラウザで onAuthStateChanged の計測を正しく行ったり、GCP の Identity Platform のパフォーマンスについても調べてみたいです。