LoginSignup
21
15

More than 3 years have passed since last update.

Firebase AuthenticationとIDトークンと更新トークンとセキュリティの話

Posted at

初めに

Firebase Authenticationを使用すると簡単にアプリにユーザー認証の仕組みを実装することができます。
自前のWebサーバーでFirebase Authenticationのユーザー認証を検証したい場合、IDトークンをクライアントから送ることで実現できます。
このIDトークンとセキュリティについて記載します。

以下の記事も参考にしてください。
JWTでセッション管理してはいけない

登場する単語

  • IDトークン

ユーザーの情報が含まれたJWT。
有効期限が1時間しかない。

  • 更新トークン

IDトークンを取得するために使用するトークン。

Webサーバーでのユーザー認証の流れ

  1. クライアントはFirebase Backendから更新トークンを使ってIDトークンを取得する。
  2. クライアントはWebサーバーにIDトークンを送る。
  3. 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を使用する。

21
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
15