OAuth2.0のリフレッシュトークンのローテーション実装やexpire時間はIDaaS/IdP各サービスで結構違うので、調べた内容をまとめてみます。
リフレッシュトークンは漏れたらヤバいトークンなので、その扱いを見ることで各社のセキュリティの考え方が垣間見える気がします。
- トークン有効期限:無期限(6ヶ月使われなかったらexpire)
- ローテーション:なし
- 管理者が特定ユーザーのトークンを無効化できるか:Workspaceなら可能
- トークンだけ無効化はできないが、OAuth承認済みアプリを管理者が削除できる
AWS Cognito
- トークン有効期限:設定で変更可能(デフォルト30日)
- ローテーション:なし
- 管理者が特定ユーザーのトークンを無効化できるか:可能
Auth0
- トークン有効期限:設定で変更可能(デフォルト30日)
- ローテーションしても有効期限は延びない
- ローテーション:あり
- ローテート済みのトークンが使われた場合の処理:該当ユーザーの全トークンが無効化
- 同じリフレッシュトークンに関する冪等性:デフォルトなし
- 設定で猶予時間を設定できる、15秒などとすれば実用上は十分と思われる
- 管理者が特定ユーザーのトークンを無効化できるか:可能
Slack
- トークン有効期限:使われない限り無期限
- ローテーション:あり
- ローテート済みのリフレッシュトークンが使われた場合の処理:特になし
- 同じリフレッシュトークンに関する冪等性:あり
- ローテート済みトークンは初回利用から12時間後まで有効(長すぎでは?)
- 管理者が特定ユーザーのトークンを無効化できるか:?
所感など
GoogleもAWSもリフレッシュトークンのローテーションを実装していないのは意外に感じました。
そもそもリフレッシュトークンのローテーションの必要性について懐疑的な関係者も多いのか、どこかの公式ドキュメントに実装する意味がないって書いてあったような記憶があります。真偽は判断しかねますが。
実際のところ相当頑張らないと「正しい」ローテーション実装にならないので実装しない方が正解と言いたくなる気持ちもわかるんですが、Auth0のローテーション実装は完璧に近いんじゃないでしょうか。(私は素人なので、むしろ専門家の人の意見が聞きたい)