CognitoのメールOTPを独自ドメインから送信するためのSES設定とSandbox解除
目次
はじめに
こんにちは、エンジニアチームのこむたです。
社内ツール向けのログイン機能として、AWS Cognitoを使ったパスワードレス認証を導入しました。
パスワードレス認証にはSMSや認証アプリなど複数の選択肢がありますが、今回はPCだけでも認証を完結でき、特定のデバイスに依存しないメールOTP(ワンタイムパスワード)を採用しました。
Cognitoでは標準でメールによるOTP認証を利用できますが、そのまま利用すると送信元メールアドレスを自由に設定できません。
実運用では独自ドメインのメールアドレスから送信したいケースも多く、その場合はAmazon SESとの連携が必要になります。
しかし実際に設定を進めてみると、
- SESのIdentity設定
- Sandbox環境による送信制限
- 本番利用申請
など、事前に知っておきたいポイントがいくつかありました。
本記事では、CognitoのメールOTPを独自ドメインから送信するために行った設定と、その過程で確認した仕様や注意点をまとめます。
メールによるOTP認証について
Cognitoでは、パスワードレス認証としてOTPを利用することができます。
認証方法としては、SMS、認証アプリ、そしてメールによる手段が用意されています。
今回は、デバイスへの依存が少ないメールによる認証方法を採用しました。
これにより、ユーザーはメールアドレスを入力し、送信された認証コードを入力するだけでログインできます。
メールによるOTPには以下のような制約があります。
- パスワードの桁数は8桁固定
- 有効期限は認証フローのセッション時間に依存(3〜15分で設定可能)
- メールの件名および本文はカスタマイズ不可
しかし今回は社内ツールでの利用ということもあり、これらの制約は許容できる範囲でした。
メール送信元の制約
Cognitoにはデフォルトのメール送信機能がありますが、そのまま利用すると送信元は固定アドレス(no-reply@verificationemail.com)になります。
このままでも動作はしますが、運用する上ではいくつかの制約があります。
- サービスのメールとして不自然
- メールの到達性(迷惑メールの回避など)をコントロールできない
- メールの配信状況を確認する手段が提供されていない
そのため、実運用では送信元や配信状況を自分で管理できるように、Amazon SESを利用します。
SESの利用とIdentityの設定
SESを利用する場合、なりすましメールの送信を防止するため、送信元として使うメールアドレスまたはドメインを事前に検証(Identity登録)する必要があります。
検証の方法には、メールアドレス単位とドメイン単位の2種類があります。
特定のメールアドレスだけを使いたい場合は、個別に検証します(例: no-reply@example.com)。
利用できるアドレスが限定されますが、設定が簡単で、すぐに使い始めたい場合に向いています。
ドメイン単位で検証する場合は、DNSの設定などが必要になりますが、そのドメイン配下のメールアドレスを自由に送信元として利用できます(例: example.com)。実運用ではドメイン単位での検証が一般的です。
Sandbox環境の制限
SESは初期状態ではSandbox環境になっており、不正利用やスパム送信を防ぐため、メール送信に制限がかかった状態になります。
主な制限は以下の通りです。
- 検証済みのメールアドレスにしか送信できない
1日200通、1秒1通までの制限がある
開発や動作確認の用途ではそのまま利用できますが、実運用では、このSandboxを解除する必要があります。
Sandboxの解除方法
手順は以下の通りです。
- SESのコンソールを開く
- 「Account dashboard」に移動
- 「Request production access」から申請
申請時には、AWS側に利用用途を説明するメッセージが必要です。
以下の内容が伝わるように記載するのがポイントです。
- メールの用途(認証・通知など)
- 誰に送るのか(ユーザー入力か、リスト配信か)
- スパムやマーケティング用途ではないこと
- 想定される送信量
以下はSandbox解除申請時のメッセージ例となります。
Webサービスのログイン機能として、Amazon Cognito を利用したメールOTP認証を実装しています。
ユーザーが入力したメールアドレス宛に、認証コードを送信する用途で利用します。
1日あたりの送信量は、数百件程度を見込んでいます。
送信はユーザーのログイン操作に応じて行われるものであり、マーケティング用途や一括配信は行いません。
送信内容は、認証コードのみのシンプルなメールです。
実際に申請したところ、我々の環境では約3日ほどで解除されました。
即座に反映されるわけではないため、早めに申請しておくことをおすすめします。
Sandbox解除後の状態
Sandboxを解除すると、以下のように制限が緩和されます。
- 任意のメールアドレスに送信可能
- 送信数の制限が
1日50,000通、1秒14通までに緩和
これにより、想定していた形でOTP認証を利用できるようになりました。
なお、ユーザー数の増加などに応じて、AWSサポートに申請することで送信数の上限を拡張することもできます。
まとめ
CognitoのメールOTPは簡単に導入できますが、実運用するにはいくつかのポイントがありました。
- OTPの仕様(桁数・有効期限の範囲・メール内容)は固定
- 独自ドメインでメールを送信するにはSESが必要
- Sandboxの解除が必須
少しハマりどころはありますが、一度理解してしまえばシンプルに運用できる仕組みです。
これから導入する方の参考になれば幸いです。
参考文献
- 新しい Amazon Cognito の機能でアプリケーションの認証ワークフローに磨きをかけよう
- 認証フロー - Amazon Cognito
- Authentication with Amazon Cognito user pools - Amazon Cognito
- Email settings for Amazon Cognito user pools - Amazon Cognito
- Configuring email or phone verification - Amazon Cognito
- Inconsistent OTP Length Issue in AWS Cognito Authentication Flow (Signin - 8 digits , Signup - 6 digits) | AWS re:Post
- Verified identities in Amazon SES - Amazon Simple Email Service
- Request production access (Moving out of the Amazon SES sandbox) - Amazon Simple Email Service