Cookieの代わりにローカルストレージを安全に使用してセッション資格情報を保存できますか?
暗号化されたハッシュを保存する必要がありますか?
編集:これは十分に安全ですか?
ユーザーがログインします。
サーバーは、ユーザーID、パスワード、タイムスタンプ、場合によってはIPアドレスを含むソルトbcryptハッシュを含む成功メッセージを返します。これはローカルストレージに保存されます。
将来の接続では、このハッシュが送信され、IPアドレスが変更されておらず、時間制限が切れていない限り、サーバーは責任を負います。
localstorageは、Cookieと同様にJavaScriptによる読み取りに対して脆弱です。
localstorageはsameドメインからJavaScriptを使用して読み取ることができます。ドメインのすべてのJSを制御している場合、これは問題になりません。しかし、他のコードが実行された場合(たとえば、インジェクションを介して、またはドメインを他のユーザーと共有した場合)、それらはストレージデータにアクセスできます。
これはCookieでも同じですが、通常、CookieはHTTPOnlyに設定されているため、JavaScriptはそれを読み取ることができません。
どちらの場合も、プレーンテキストのログイン情報はCookieやlocalstorageに保存しないでください。誰かが取得した場合でも、継続的に新しいセッションを作成できるためです。
認証された識別子(ユーザーIDなど)とセッションの有効期限の日時を暗号化してから、この値をCookieまたはローカルストレージに保存する必要があります。このトークンは、各サーバー呼び出しで検証されます。
ローカルストレージを使用する場合、なぜユーザーの資格情報やそれらから派生したものを保存するのでしょうか。
私が検討してきたことは次のとおりです。
ログインに成功したら、ユーザーの資格情報に関係のない完全にランダムな文字列を生成し、有効期限とともにデータベースに保存します。次に、その文字列をjsに渡して、ローカルストレージに保存します。
それ以降、ローカルストレージの認証情報がデータベースの認証情報と一致し、タイムアウトの期限が切れていない限り、自動的にログインしたと見なします。
この方法では、ローカルストレージからユーザーの資格情報が公開されるリスクはありません。ただし、この一時的な一意の文字列は基本的にセッションIDとして機能するため、セッションハイジャックに関連するリスクを認識し、予防策を講じる必要があります。
いずれにせよ、私の理解では、ローカルストレージはサイトの背後にあるサーバーと同じくらい安全です。つまり、ローカルストレージにアクセスできるのは、自分のドメインから入ってくるスクリプトを介してのみなので、実行している唯一のフロントコードが自分のものである限り、安全です。
サーバーは、トークンを生成する必要があります-ユーザー名/パスワードの検出に使用できない(サーバーに対して)一意のデータ。そのトークンのみが任意の形式でユーザーのマシンに保存できます。 localStorageもcookieも安全ではありません。したがって、この点で同じルールが適用されました。
そうしたトークンを実際の資格情報の代わりに使用できるようになったら、そうしたトークンを期限切れにする何らかの手段が必要です。
Cookieの代わりにlocalStorageを使用する場合は、more Cookieよりも安全にすることができます。これは、リクエストごとにセッションIDをサーバーに送信する必要がないため、ベアラートークンになります。代わりに、クライアント側のユーザーシークレットをlocalStorageに保存し、それを使用してリクエストに署名し、対応する公開鍵を送信してセッションIDとして使用することができます。このように、サーバー側またはプロキシの誰もあなたのリクエストを偽ることはできません。