LoginSignup
58
48

More than 5 years have passed since last update.

[モバイルアーキテクチャ ] Cognitoにどこまで任せるべきか?研究してみた

Last updated at Posted at 2017-06-27

CognitoとはAWSサービスの一つであり、主にモバイルアプリの認証システムとして利用されている。
Cognitoには主に3つの機能があり、それぞれ以下のように自分は解釈している
(ツッコミをいただくために後悔してるので、間違ってたら是非教えてください)

Cognitoのサービス達

Cognito UserPool

概要

emailの確認、SMSによる確認、パスワードの再発行などもやってくれるメールによる認証機能。

メリット

  • ステップが複雑なメール認証機能を実装する手間がない
  • ユーザーの認証ステップの保持、Email, Passwordの暗号化など、面倒なデータを保持せずに済む(AWS管理コンソールにおいて、ユーザーの権限などいじる必要はあるけど)

デメリット

  • 既存のメール認証システムから移行する場合、name, email, phone numberなどはcsvでimportできるが、passwordだけはimportできないので、ユーザーにpasswordの再設定を依頼する必要がある。そのため、移行コストは高い
  • データを自分たちで保持していないため、トラブルシューティングの工数が増す危険がある

Cognito IdentityPool

概要

メール、Google, Facebookなどで認証されたユーザーに対して、特定のAWSサービスへのアクセスを許可する(=認可)の機能。
未認証ユーザーも取り扱い可能で、未認証ユーザーは認証ユーザーと別のrole(権限)を与えることができる

メリット

  • アクセストークンに関する実装をする必要がない
  • サーバーレスアーキテクチャーに移行しやすい(もとからサーバーレスで組むつもりならほぼ必須要件)

デメリット

  • API Gateway経由で、APIを公開する際に、Lambdaならuser情報を取得できるが、HTTPプロキシでELBやEC2を繋いだときは、ユーザー情報が取得できない(?)
  • tokenの受け渡しだけで、未認証ユーザーの照会をすることができない?(idをパラメータに含めないといけない?)

Cognito Sync

概要

Cognito IdentityPoolに存在するユーザーのユーザー設定を保持・同期できるサービス。認証認可とは関係ない。

メリット

機種変時、マルチデバイス対応時に、設定項目を同期するのに便利。

デメリット

今の所見つかってはいないが、iOSでいうUserDefaultに入れるような情報の保持、復元など用途が限定的なので、使わなくていいアプリケーションもたくさんありそう

考察

UserPool

開発コスト

[使わない場合]

  • 単純なemail認証であったとしても、rubyだとdeviseなど便利なgemがあるものの、センシティブなデータを扱うために確認工数なども膨れる可能性が高い
  • SMS認証も必須だとすると、それをサポートしてるライブラリも少ないため開発工数は爆発的に膨らみそう

[使った場合]

運用コスト

[使わない場合]

  • いつでもデータにアクセス可能なので、ユーザー固有の問題に対するトラブルシューティングが比較的容易
  • 認証の度にDBへのアクセスが走るためシステムリソースが喰われる
  • センシティブなデータにいつでもアクセス可能なため、ルール作りや社内でのアクセス制御が面倒
  • UserPoolを使いたくなった時に、ユーザーにpasswordの再設定を依頼する必要がある

[使った場合]

  • データを自分たちで保持していないため、トラブルシューティングに時間がかかることもありそう
  • AWSのユーザー権限で、アクセス制御が可能なので、そこは簡単
  • AWS Cognitoが落ちたら、機能の大半が使えなくなるというリスクを孕んでいる
  • export機能はないので、AWS Cognitoから独自の認証機能に移行する場合は、APIを叩いてデータをexportした上で、ユーザーにpasswordの再設定を依頼する必要がある

所感

まだ認証システムを独自で持ってないなら、使うと大幅に開発コストが削減できそう

Cognito IdentityPool

開発コスト

[使わない場合]

  • Facebook, Googleなどのuidに相当する情報を保持する必要がある
  • クライアントに一時的なアクセストークンを発行する必要がある
  • アクセストークンの検証機構を作る必要がある

[使った場合]

  • uidの保持をしてくれる
  • アクセストークンの発行、検証をawsがよしなにしてくれるが、ec2, elbでそれをやろうとすると、前段にAPI Gatewayをhttp proxyとして置く必要がある
  • API Gateway + Lambda ならユーザーの照会までしてくれるが、ec2, elbだとそれができない?
  • elb, ec2との相性はわるそうで、未認証ユーザーの照会ができない?
  • 上記の理由で構成が複雑化する

運用コスト

[使わない場合]

  • uidなどの情報へのアクセス制御をする必要がある
  • アクセストークン発行に際して、システムリソースを食う
  • 保守しないといけないコードが増える
  • サーバーレスアーキテクチャにする際にIdentityPoolに乗り換えるか、STSへのリクエストを独自で頑張るかする必要がある。1ユーザーに認証情報を複数持てるようにしておけば、IdentityPoolのidentityIdをuidとして紐付けできるので、移行コストはそこまで高くないと思う(?)

[使った場合]

  • 一部システムを移譲できるものの、構成が複雑になり、全員がクラウドネイティブな考えがない限り、運用が大変になりそう
  • クラウドネイティブ的な構成になると、デバッグが大変そう(慣れてないだけ?)

所感

使うことによって、構成が限定されるため初期から使う必要はなさそう。
サービスが大きくなってきて、クラウドを存分に使いたくなったら検討したい

疑問

誰か、もし知ってたらおしえてください

  • API Gateway経由で、APIを公開する際に、Lambdaならuser情報を取得できるが、HTTPプロキシでELBやEC2を繋いだときは、ユーザー情報が取得できないっぽいんですが、何か方法ないですかね?(API Gatewayにおいて、 Integration Type = AWS Service というのがあるけど、これでどうにかできないものか...)
58
48
5

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
58
48