Amazon Cognito User Poolsをjavascriptで扱うための公式パッケージamazon-cognito-identity-jsが2017/5/12に更新され1.17.0になった。
これまでは認証後のセッション情報は自動的にローカルストレージに保存される仕様であったたため、明示的にclearCachedTokensまたはsignOut, globalSignOutを実行しない限りセッション情報が端末に残ることとなっていた。
ローカルストレージはドメイン毎の情報を端末に永続保存するための場所なので、共用パソコンなどでログアウトを忘れると、なりすましのリスクがあった。モバイルアプリの場合は問題にならないがWebアプリケーションの場合は注意しないといけない。
具体的には、id tokenやsession tokenは1時間で期限切れにより使えなくなるが、refresh tokenの有効期限(デフォルト30日、設定により1-3650日)までの間はid token/session tokenを再取得できるため、ブラウザを閉じても簡単にセッションが復活できてしまう。
これまでにとれた回避策は、コード改変をするか、ローカルストレージに保存されるアクションの度にclearCachedTokensを実行するという方法くらいのようである。
今回のバージョンアップでCognitoUserPoolおよびCognitoUserのconstractorにStorageオプションが追加されたので、ここにセッションストレージを指定することでブラウザを閉じた時に情報を削除させることができるようになった。
import { CognitoUserPool, CognitoUser } from 'amazon-cognito-identity-js';
const cognitoUserPool = new CognitoUserPool( {
UserPoolId: <<userPoolId>>,
ClientId: <<clientId>>,
Storage: sessionStorage
});
const cognitoUser = new CognitoUser({
Username: <<userName>>,
Pool: cognitoUserPool,
Storage: sessionStorage
});
現時点ではCognitoUserのコンストラクタはStorageを指定したCognitoUserPoolを引数にしてもローカルストレージが使われるため、
CognitoUserPoolおよびCognitoUserどちらも明示的にStorageを指定しないと期待した動きにならない。(修正を提案中)
よいUXのためには、デフォルトではセッションストレージを使うようにしておき、ユーザがオプトアウトした場合のみローカルストレージで長期保存するように作るのがいいだろう。
Cognitoはログインしたデバイスを認識できるので、設定したデバイスでだけログインし続けるように作ることもできるはず。