この質問は、一般的なWebアプリのログインフローに関する質問です。セキュリティを維持しながら、使いやすさとパフォーマンスを最適化する回答に最も興味があります。
ブックマークされたURLへの認証されていないリクエストを処理するための最も適切な方法は何ですか?
問題を示すために、サンプルアプリケーションのいくつかのルートとそれぞれの動作を次に示します。
GET /login -> Display the authentication form
POST /processLogin -> process the username and password,
if unauthentic...re-render the login form;
otherwise...display the default page
GET /secret -> if authenticated...display the secret resource;
otherwise...display a login form
POST /secret -> if authenticated...perform a desirable, but potentially
non-idempotent action on the secret
resource
otherwise...display a login form
オプション1:ログイン画面を表示し、目的のページにリダイレクトします
- ユーザーがブックマークをクリックする
- GET / secret-> 200、隠しフィールドpath ="/secret"を使用してログインフォームを密かに表示する
- POST / processLogin-> 302 to / secret(パスパラメータの値)
- GET / secret-> 200、シークレットリソースが表示されます
分析:うまくいけば、クライアントはHTTPに準拠していない最新のブラウザーであり、302のPOSTの後にGETを実行します。これは全面的に適用されます。心配する必要がありますか?
オプション2:ログイン画面にリダイレクトし、目的のページにリダイレクトします
- ユーザーがブックマークをクリックする
- GET / secret-> 302 to / login
- リダイレクトを介して/loginを取得->200、隠しフィールドpath ="/secret"で表示されたログインフォーム
- POST /processLogin->302から/secret
- GET / secret-> 200、シークレットリソースが表示されます
分析:上記と同じ問題。ログイン中にブラウザに表示されるURLが変更されると、ユーザーが混乱し、ブックマークやリンクの共有などが中断するという問題が追加されました。
オプション3:ログイン画面を表示し、目的のページを表示します
- ユーザーがブックマークをクリックする
- GET / secret-> 200、アクション="/secret"を含むログインフォームを密かに表示する
- POST / secret-> 200、シークレットリソースが表示されます
分析:残念ながら、更新ボタンも壊れています。更新すると、ユーザーエージェントは/ secretを再取得する代わりに、警告付きで再POSTします。ユーザーは警告を受け取りますが、それを無視すると、何か悪いことが起こります。
明るい面では、この手法を使用してラウンドトリップを最小限に抑えます。
オプション4:ログイン画面にリダイレクトし、目的のページを表示します
- ユーザーがブックマークをクリックする
- GET /secret->302から/processLogin
- リダイレクトを介して/processLoginを取得->200、アクション="/secret"で表示されるログインフォーム
- POST /secret->302から/secret
- GET / secret-> 200、シークレットリソースが表示されます
分析:オプション2+4と同じ問題。
オプション5:???
私が見逃している別のテクニックはありますか?
一般的に、これらのテクニックのどれをお勧めしますか?
関連項目
ログインページにリダイレクトするときの正しいHTTPステータスコードは何ですか? ログイン用のHTTPリダイレクトの種類は何ですか? リダイレクトありのHTTP応答ですが、ラウンドトリップはありませんか?