ステートレス(セッションレス)およびクッキーレス認証を行うにはどうすればいいですか?質問する

ステートレス(セッションレス)およびクッキーレス認証を行うにはどうすればいいですか?質問する

ボブは何かを達成するために Web アプリケーションを使用します。そして:

  • 彼のブラウザはダイエット中なのでサポートされていませんクッキー
  • ウェブアプリケーションは人気があり、一度に多くのユーザーを相手にするため、規模まあ。セッションを維持する限り、同時接続数の制限、そしてもちろん、無視できないパフォーマンスペナルティセッションレスのシステムを導入したいかもしれません :)

重要な注意事項:

  • 我々が持っています輸送セキュリティ翻訳とその親友たち);
  • 舞台裏では、ウェブアプリケーションは多くの操作を外部サービス、現在ユーザーに代わって(これらのシステムはボブをユーザーの一人として認識します) - これはつまりボブの資格情報を転送する必要がある

さて、ボブを(すべてのリクエストごとに)認証するにはどうすればよいでしょうか?そのようなことを実装するには、どのような方法が合理的でしょうか?

  • 遊ぶテニス認証情報を使用してHTML フォームの隠しフィールド...のボール資格情報(ユーザー名パスワード) そしてそのラケット2本それぞれブラウザとウェブアプリケーションです。言い換えれば、クッキーではなくフォームフィールドを介してデータをやり取りすることができます。ウェブリクエストごとに、ブラウザは認証情報を送信します。ただし、シングルページアプリケーション、これは遊んでいるように見えるかもしれない押しつぶすゴムの壁に向かって遊ぶ代わりにテニス、としてウェブフォーム資格情報を含む情報は、ウェブページ(サーバーは資格情報を返さないように構成されます)。
  • ページのコンテキスト内にユーザー名とパスワードを保存します (JavaScript 変数など)。ここでは単一ページが必要であると私は考えています。
  • 暗号化されたトークンベースの認証。この場合、ログイン アクションによって暗号化されたセキュリティ トークン (ユーザー名 + パスワード + その他のもの) が生成されます。このトークンはクライアントに返され、今後のリクエストにはトークンが添付されます。これは理にかなっていますか? すでに HTTPS があります...
  • その他...
  • 最後の手段: これを行わず、セッションに資格情報を保存します。セッションは良好です。Cookie の有無にかかわらず。

前述のアイデアに関して、Web / セキュリティに関する懸念は思い浮かびますか? たとえば、

  • タイムアウト- 私たちはタイムスタンプ、資格情報(タイムスタンプ = ボブが資格情報を入力した時間)とともに。例:現在 - タイムスタンプ > しきい値、リクエストを拒否する可能性があります。
  • クロスサイトスクリプティング保護 - まったく異なることはないはずですよね?

これを読んでくださってありがとうございます :)

ベストアンサー1

ああ、セッションなしでセッションを維持するというこれらの質問は大好きです。

私は応募書類審査の仕事をしていたときに、これを実行するためのさまざまな方法を見てきました。人気のある方法の1つは、テニスをしているあなたが言及した方法 - ユーザーを認証するためにすべてのリクエストでユーザー名とパスワードを送信する。これは、私の意見では、特にアプリケーションが単一ページでない場合は安全ではありません。また、将来的に認証に加えてアプリに承認を追加したい場合は特に、スケーラブルではありません(ただし、ログインに基づいて何かを構築することもできると思います)

完全にステートレスではないものの、人気のメカニズムの 1 つは (JavaScript 実行があると仮定して)、セッション クッキーを JavaScript に埋め込むことです。私のようX-Authentication-Tokenなセキュリティ担当者はこれに悲鳴を上げますが、実際には機能する可能性があります。すべてのリクエストにはヘッダーなどがあり、それをバックエンドのデータベース、メモリ内のファイル ストアなどにマッピングしてユーザーを検証します。このトークンには、指定した時間のタイムアウトを設定できます。タイムアウトすると、ユーザーは再度ログインする必要があります。これはかなりスケーラブルです。データベースに保存すると、1 つの SQL ステートメントが実行され、正しいインデックスがあれば、複数のユーザーが同時にいても、実行にはほとんど時間がかかりません。ただし、ここで負荷テストを行うと間違いなく役立ちます。質問を正しく理解していれば、これが暗号化トークン メカニズムになります。ただし、ユーザー名 + パスワード + その他の組み合わせではなく、たとえば 32 文字の暗号的にランダムなトークンを使用することを強くお勧めします。この方法では、予測不可能なままですが、ユーザー ID などに関連付けることができます。

どちらを使用する場合でも、安全に送信されるようにしてください。HTTPS はネットワーク経由でユーザーを保護しますが、URL 経由でセッション トークンが漏洩した場合 (または、さらに悪いことに、URL 経由で資格情報が漏洩した場合) は保護されません。ヘッダーを使用するか、それが不可能な場合は、毎回 POST リクエスト経由でトークンを送信することをお勧めします (これは、ユーザーのブラウザーに非表示のフォーム フィールドがあることを意味します)。POST リクエストを使用する後者のアプローチでは、念のため CSRF 防御を使用する必要がありますが、トークン自体を使用することは、ある種の CSRF 防御になるのではないかと思います。

最後に、期限切れのトークンを消去するメカニズムがバックエンドにあることを確認してください。これは、これまで多くのアプリケーションにとって悩みの種でした。認証トークンのデータベースが急速に増え続け、それがなくなることはないのです。複数のユーザー ログインをサポートする必要がある場合は、トークンの数を制限するか、各トークンの制限時間を短くしてください。前に述べたように、負荷テストがこの問題の解決策になるかもしれません。

他にもセキュリティ上の懸念事項はいくつか考えられますが、現段階では対処するには範囲が広すぎます。あらゆる使用(および悪用)ケースを念頭に置いておけば、おそらくこのシステムをかなりうまく実装できるはずです。

おすすめ記事