以下の答えは this 質問からのものです。
受賞した答えは、実際にはまったく問題に対処していません。データ転送のコンテキストでSSLについてのみ言及しており、実際には認証については触れていません。
安全に認証することを本当に求めていますREST APIクライアント。TLSクライアント認証を使用している場合を除き、SSLだけではREST APIクライアント認証なしのSSLはサーバーのみを認証しますが、これはほとんどのREST APIには関係ありません。
TLSクライアント認証を使用しない場合は、ダイジェストベースの認証スキーム(Amazon Webサービスのカスタムスキームなど)またはOAuthまたはHTTP基本認証(ただし、 SSLのみ)。
クライアント認証なしでHTTPSを使用することを検討しているここでの質問は、クライアントSSL証明書を使用しない場合のポスターによるとサーバーは、誰と通信しているのか実際には知りません。ここで理解しているのは、サーバーに対してクライアントを認証するために認証トークンを使用してアクセスする場合です。次に、そのトークンがサーバーデータベースのユーザーIDとペアになっている場合、サーバーは誰がトークンを送信しているのかevenを知りません。
まず第一に
1-これは本当の問題ですか?特にHttpsを使用する場合(TLSクライアント認証なし)
2-そして最も重要なことですが、それが重要なセキュリティ上の欠陥であると想定しています。投稿者が言及しているように、HTTP基本認証はどのように役立ちますか? HTTP基本認証は、エンコードされたユーザー名のパスワードをヘッダーで送信するだけです。したがって、クライアントがトークンを受信すると(ユーザー名のパスワードを送信した後、代わりに)、残りの要求に対して、代わりにこのヘッダーでこのトークンを使用しますパスワードの、そしてすべてが突然大丈夫ですか?
それでもサーバーはリクエストがどこから来ているのかを知りません、おそらくサーバーはデータベースに一致するユーザーの有効なトークンを持っていますが、本当にsend誰がそれを知らないのですか? 。 (私はまだこれが非常に難しいと思っていますが、トークンがhttpsで盗まれて他の誰かに使用されることになります!)
この件名を持ってくると必ず返信が届きます。「まあ、あなたはトークンを送信しますが、サーバーは誰がトークンを送信したのかわからないので、安全ではありません」。リクエストが適切な場所から送信された場合、そのトークンとペアになっているユーザー(私のDBから確認)が「本当に正しい」ことを確認できます
あるいは、ここで言っていることが正しくないかもしれません
「ユーザーの認証」について話すとき、私たちが本当に意味することは、「ユーザーが他の誰も知らないはずの何かを知っていることを確認する」ことです。その「何か」は、パスワード、証明書、ハードウェアセキュリティトークン、さらにはユーザーの網膜パターンである可能性がありますが、すべての場合において、ユーザーのIDではなく、実際に確認しているのはその情報へのアクセスです手段)そのように。
ポイントは、原則として、allこれらの認証システムが盗まれ、ユーザーを偽装するために使用される可能性があるということです。パスワードがログに記録され、証明書が保存されているディスクから証明書がコピーされ、ハードウェアトークンが盗まれる可能性があり(リバースエンジニアリングと複製も可能)、ユーザーの網膜パターンでさえ、原則としてスキャン、記録、偽造される可能性があります。私たちができる最善のことは、いずれの場合も、これを可能な限り「非常に困難」にすることです。
多分私は質問を誤解している。
あなたが引用した答えは、クライアント証明書、HTTP BASICAUTH、または他のものであるかどうかにかかわらず、認証のsome形式を使用しない場合、サーバーはそれが誰であるかを知らないと私に言っていますコミュニケーション。
(多分それはあなたのアプリケーションにとって大丈夫です、多分それはそうではありません、あなただけがそれに答えることができます。)
言い換えると、何らかの認証を使用する場合、サーバーは誰と通信しているのかを知っています。認証された資格情報が属する「人」と通信しています。
このコンテキストでは、認証はいくつかの資格情報を介してIDを確立するプロセスです。
認証は、資格情報が盗まれたことを保証するものではありません。 SSLは、クライアントとサーバー間の転送中に資格情報が安全であることを保証します(「保証」とは言いませんが)。
GMailを使用している場合、SSLを使用していますが、Googleはどのようにしてあなたと通信していることを認識していますか?