質問
Web アプリケーションを作成するとき、単一のユーザーを表す User オブジェクトがあるとします。そのユーザーがログインしていることを保存する最良の方法は何だと思いますか?
私が考えた方法は次の 2 つです。
- ユーザーデータベースIDをセッション変数に保存しました
- ユーザーオブジェクト全体をセッション変数に保存しました
より良い提案や上記の方法の使用に関する問題はありますか?おそらくセキュリティの問題やメモリの問題などです。
解決
オブジェクトではなく ID を保存することをお勧めします。欠点は、ユーザーの情報を取得するたびにデータベースにアクセスする必要があることです。ただし、ページ内でミリ秒単位が重要でない限り、パフォーマンスは問題になりません。以下に 2 つの利点があります。
ユーザーの情報が何らかの理由で変更された場合でも、セッションに古い情報が保存されることはありません。たとえば、管理者によってユーザーに追加の権限が付与されている場合、ユーザーはログアウトして再度ログインすることなく、それらの権限をすぐに利用できるようになります。
セッション情報がハード ドライブに保存されている場合は、シリアル化可能なデータのみを保存できます。したがって、User オブジェクトにデータベース接続、オープンソケット、ファイル記述子などのものが含まれている場合、これは適切に保存されず、適切にクリーンアップされない可能性があります。
ほとんどの場合、これらの懸念は問題にならず、どちらのアプローチでも問題ありません。
他のヒント
セキュリティ上の理由から、セッション ID を (GUID または暗号的に安全な RNG のいずれかで) 生成し、セッション ID をユーザー ID にマッピングするだけのテーブルを用意します。次に、セッション ID を Cookie に保存し、それをユーザー ID のプロキシとして機能させるだけです。
|Session |UserID |
|--------+-------|
|a1d4e...+ 12345 |
|--------+-------|
|c64b2...+ 23456 |
|--------+-------|
これにより、誰も自分の ID を推測して他のユーザーになりすますことができなくなります。また、ユーザーのセッションを制限して、ユーザーが時々 (通常は 2 週間) ログインする必要があるようにすることもできます。また、セッションに関する他のデータを保存したい場合は、それをこのテーブルに追加するだけです。
ユーザーのすべての属性 (これは権限にまで及ぶ) をセッションに保存すると、ユーザーに対する変更は再度ログインするまで有効にならないことに注意してください。
個人的には、名前と ID をすぐに参照できるように保存し、必要なときに残りを取得します。
ほとんどの場合、ID を保存することがベスト プラクティスです。この重要な理由の 1 つはスケーラビリティです。ユーザー オブジェクト (または ID だけでなくデータベースのエンティティ) を保存すると、サイトにサービスを提供するサーバーの数を増やす際に問題が発生します。詳細については、Google で「シェアードナッシング アーキテクチャ」を検索してください。
使用しているプラットフォームによって異なると思います。ASP.net を使用している場合は、ぜひご覧ください。 フォーム認証 クラスと、ログインしたユーザー設定を保存するために使用できるそこにあるすべての組み込み (および拡張可能な) 機能。
ユーザー ID とセッション ID のハッシュ値を保存し、データベース内のセッション テーブルでそれを照合します。そうすることで、セッション データのなりすましが難しくなります。追加のチェックとして IP もチェックしていただけますか。
セッション変数に保存されているユーザーIDに依存して、それがかなり簡単に変更でき、別のメンバーとしてアクセスできるため、そのユーザーであることを信頼したいかどうかわかりません
通常、ユーザーをセッションに保存します。ログインするまで変更できない問題は、変更を加えた後にセッション内のオブジェクトを新しいコピーに置き換えることで解決できます。
私たちのユーザー オブジェクトはかなり軽量なので、セッション変数に保存することにしました。それが最も効率的かどうかはわかりませんが、これまでのところ非常にうまく機能しています。