主にスマートフォンアプリケーションからアクセスされる重要でないデータ用の小さなREST Webサービスを開発しています。ユーザーの個々のデータへのアクセスを制限するには (承認にはグループやロールは必要ありません)、何らかの基本的な認証を実装する必要があります。
サービスは HTTP 経由でアクセスされるため、HTTP 認証を使用することはお勧めできません。ユーザー名とパスワードはすべての要求でクリアテキストで送信され、クライアント デバイスに保存する必要があるからです。
したがって、私の考えは、次の方法で認証を実装することでした。
- ユーザーは、ユーザー名/パスワードを渡す Web サービスのログイン方法を使用してログオンします
- このメソッドは、ユーザー名とパスワードの組み合わせの有効性をチェックします (ソルト化およびハッシュ化されたパスワードを含むデータベースに基づく)
- ログインが成功すると、ユーザーの ID (データベース テーブルの主キー) が属性としてセッションに保存されます。
- 次のリクエストでは、この属性を使用してユーザーを認証します。
コードでは、ログイン メソッドは次のようになります。
User user = this.authentificate(username, password);
HttpSession session = request.getSession(true);
if (user != null)
session.setAttribute("UserId", user.getId());
else
session.invalidate();
その後、セッションに基づいてユーザーを認証できます。
int userId = (int) request.getSession().getAttribute("UserId");
User currentUser = getUserById(userId);
このアプローチは「安全」と見なすことができますか (簡単なセッション ハイジャックは不可能です - 私が理解している限り、属性の値はサーバーを離れません)。
欠点や代替手段はありますか?