初めに
Firebase Authenticationを使用すると簡単にアプリにユーザー認証の仕組みを実装することができます。
自前のWebサーバーでFirebase Authenticationのユーザー認証を検証したい場合、IDトークンをクライアントから送ることで実現できます。
このIDトークンとセキュリティについて記載します。
以下の記事も参考にしてください。
JWTでセッション管理してはいけない
登場する単語
- IDトークン
ユーザーの情報が含まれたJWT。
有効期限が1時間しかない。
- 更新トークン
IDトークンを取得するために使用するトークン。
Webサーバーでのユーザー認証の流れ
- クライアントはFirebase Backendから更新トークンを使ってIDトークンを取得する。
- クライアントはWebサーバーにIDトークンを送る。
- WebサーバーはIDトークンを検証し、ユーザーを認証する。
IDトークンが漏洩した場合
漏洩したトークンが1時間以上前のものなら期限が切れているのでユーザー認証には使用できません。
1時間以内のものならユーザー認証に使用できてしまうので無効にする必要があります。
更新トークンを無効にすることで間接的にIDトークンも無効になります。
注意が必要なのはIDトークンをWebサーバー側でVerifyIDToken
を使用して検証している場合です。
この場合はIDトークンが無効であっても検証に成功してしまいます。
無効かどうかも含めて判別するためにはVerifyIDTokenAndCheckRevoked
を使用する必要があります。
両者の違いはIDトークンの無効状態をチェックするかどうかですが、無効状態のチェックにはコストがかかります。
(この関数はgoのものですがほかの言語ではチェックするかどうかをフラグで制御します。)
// This function uses
VerifyIDToken()
internally to verify the ID token JWT. However, unlike
//VerifyIDToken()
this function must make an RPC call to perform the revocation check.
// Developers are advised to take this additional overhead into consideration when including this
// function in an authorization flow that gets executed often.-- firebase-admin-go のauth.go VerifyIDTokenAndCheckRevokedのコメントより引用
更新トークンが漏洩した場合
更新トークンは有効期限がほぼないのですぐに無効にする必要があります。
RevokeRefreshTokens
を使用することでユーザー単位で更新トークンを無効にすることができます。
更新トークンを無効にした場合でも前述の通りVerifyIDToken
でIDトークンを検証していると成功してしまう点には注意してください。
まとめ
IDトークンは期限が1時間ととても短い。
更新トークンを無効にすることでIDトークンも無効にできる。
無効にした場合でもVerifyIDToken
で検証している場合は成功してしまう。
無効状態もチェックする場合はVerifyIDTokenAndCheckRevoked
を使用する。