0

Webサービスのアクティブなユーザーアカウントなどの情報を含む、あまり頻繁に(月に1回)変更されないMySQLテーブルがある場合。次のようなことをするのはどれほど安全ですか。

public AccountDao
{
   List<Account> accounts;
   /*fields*/
   public AccountDao()
   {
       refreshAccounts();
   }

   public void refreshAccounts()
   {
      this.accounts = /*call to database to get list of accounts*/
   }

   public boolean isActiveAccount(String accountId)
   {
       //logic involving in memory list object above
   }
}

これを行うのは、Webサービスへのアクセスを許可するために、すべての要求に対してユーザーがアクティブなアカウントを持っていることを確認する必要があるためです。これにより、リクエストごとにデータベースレイヤーへの1回のSQL呼び出し(現時点ではストレスがかかっています)を回避できます。私の質問は、このようなデータを本番環境に保存するのはどれほど安全かということです。

ちなみに、API呼び出しで新しいユーザーアカウントが追加されるたびに、アカウントリストを更新します。上記のように、これは月に1〜2回程度発生します。

4

3 に答える 3

1

対応するデータベーステーブルが変更されたときにメモリ内オブジェクトを更新するための何らかのトリガーがある場合は、安全である必要があります。

トリガーがなければ、それは正確さの問題になり、場合によってはポリシーの問題になります。インフラストラクチャのさまざまな部分にデータベースのさまざまなメモリ内バージョンがある場合はどうなりますか?たとえば、ユーザーの追加または削除と、その変更がサービスに反映されるまでの間隔はどれくらい許容できますか?

于 2013-03-13T20:36:10.543 に答える
1

キャッシングをご覧ください。memcachedが適切なオプションでない場合、ライブラリはおそらくすでにそれをサポートしています。

于 2013-03-13T20:36:30.823 に答える
1
  1. DAO(および場合によってはその呼び出し元)の共有状態へのアクセスは、スレッドセーフを実現するために何らかの方法で同期する必要があります。
  2. 古いデータは、誤ったアクセス決定を引き起こす可能性があります。これはセキュリティに関連している可能性が高いため、コードは防弾である必要があります。特に、障害が発生した場合に確実に機能する必要があります。これにより、通知ベースのスキームが不安定になります-通知が失われた場合はどうなりますか?
  3. メモリ内のクレデンシャルの有効期間が延長されます。機密性は、クレデンシャルをハッシュすることで実現できます(率直に言って、誰かがアプリケーションのメモリを読み取れる場合は、他にも多くの問題があります)。攻撃者がメモリ内のパスワードを操作するには、ヒープメモリにアクセスできる必要があります。攻撃者がアカウントの読み取りに使用するデータベース接続を簡単に変更できるため、攻撃者がアクセスできる場合は、とにかく失われます。

とはいえ、トラフィックの多いWebサービスの場合、資格情報をキャッシュすることは賢明なアイデアのように聞こえますが、それは完全に些細なことではありません。

編集:いいえ、Webコンテナはスレッドを同期しません。同時リクエストは同時スレッドによって処理されます。これらが同じデータの読み取りと書き込みを行うと、データの競合が発生する可能性があります。たとえば、あるスレッドが新しい情報で更新されている間にアカウントのリストを読み取る可能性があるため、不完全なリストが表示される可能性があります。

于 2013-03-13T20:57:20.853 に答える