私はセッション管理を学んでいて、Webで答えを見つけることができなかった2つの質問があります。
ユーザーが認証されると、サーバーはセッションIDを作成し、Cookieの形式でクライアント(ユーザー)に送信します。その後、このCookieは、クライアントがサーバーに送信して他のユーザーの中で自分自身を識別する要求で使用されます。
これで、HTTPSセッションでは、クライアントからのリクエストはサーバーの公開鍵を使用して暗号化され、サーバーのみが持つ秘密鍵を使用してのみ復号化できるため、クライアントとサーバー間で送信されるリクエストは保護されます。
ただし、最初にサーバーがCookie情報をクライアントに送信するとき、セッションIDを含むこのCookieが秘密鍵を使用して暗号化されている場合でも、誰からでも傍受される可能性があります。公開鍵を持っている人なら誰でも解読できます。だから、私の質問は:
サーバーは、サーバーによって作成されたセッションIDがクライアントに安全に送信されることをどのように確認しますか。
私は、クライアントがサーバーに対して行う各要求に対してCookieを送信することを学びました。 GETリクエストでは、GETに本文が含まれていないため、クライアントはどのようにCookie情報を送信しますか?
クライアントとサーバー間の接続は、公開鍵暗号化を使用しません(これは、最初の鍵交換にのみ使用されます)。 TLS 1.2接続のAES-256-CBCなど、異なるアルゴリズムが暗号化(通常は対称暗号化)に使用されます。したがって、傍受しない限り、目的のブラウザと元のサーバー以外はメッセージを復号化できません。したがって、傍受はサーバーからの公開鍵情報を入手するほど簡単ではありません。
CookieはGETリクエストとして送信されません。ヘッダーにCookie:[Token]; [Other cookies];
として追加されます。基になるリクエストタイプはこれには無関係です。 (ただし、デフォルトの要求タイプはGETです。)
ブラウザからログインしているWebサイトへのネットワークトラフィックを確認し、どこで何が使用されているかを確認することをお勧めします。 (これはChromeで簡単に実行できます。)
Answer 1:サーバーがSSL/HTTPS(自己署名証明書ではなくサードパーティによって検証される)を使用する場合、CookieとセッションIDはネットワークを介して暗号テキストとして送信され、攻撃者(Man in Middle)はパケットスニファを使用しているため、情報を取得できません。クライアントとサーバー間の接続は検証済みのサードパーティによって保護されているため、データを復号化できません。検証済みの証明書がないHTTPSは、サーバーとユーザーがセッションIDを盗聴されていないことを確認できないことを意味します。
つまり、ユーザーとサーバー間で安全なHTTPSを確立した後、すべてのデータ(Cookie)を送受信する必要があり、セッションIDがユーザーに安全に送信されることを確認できます。
また、非対称暗号は、対称暗号の鍵を交換するためにのみ使用されます(クライアントとサーバーの間でデータを暗号化するために使用されます)。
より良い画像の右クリック:新しいウィンドウで画像を開く
Answer 2: CookieはHTTPヘッダーフィールドのリクエストヘッダーによって完全に処理され、クライアント側のCookieは「Cookie」および「Set-Cookie」応答ヘッダーにエンコードされ、サーバー側はエンコードされます'Cookie'リクエストヘッダー内-$ Path変数。
クライアント要求の例:
GET /index.html HTTP/1.1
Host: www.example.com
サーバーからの回答例:
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: foo=10
Set-Cookie: bar=20; Expires=Fri, 30 Sep 2011 11:48:00 GMT
... rest of the response
ここでは、2つのCookie(foo=10
およびbar=20
)はブラウザに保存されます。 2つ目は9月30日に期限切れになります。後続の各リクエストで、ブラウザはCookieをサーバーに送り返します。
GET /spec.html HTTP/1.1
Host: www.example.com
Cookie: foo=10; bar=20
Accept: */*