会话 ID 如何安全发送?

信息安全 饼干 会话管理
2021-08-31 07:53:40

我正在学习会话管理,我有两个问题在网上找不到答案。

一旦用户通过身份验证,服务器就会创建会话 ID 并以 cookie 的形式将其发送给客户端(用户)。随后,此 cookie 将用于客户端向服务器发送的请求中,以在其他用户中识别自己。

现在在 HTTPS 会话中,客户端和服务器之间发送的请求是安全的,因为来自客户端的请求使用服务器的公钥加密,并且只能使用服务器仅有的私钥解密。

但最初,当服务器向客户端发送 cookie 信息时,任何人都可能截获它,即使包含会话 ID 的 cookie 是使用私钥加密的。任何拥有公钥的人都可以解密它。所以,我的问题是:

  1. 服务器如何确保服务器创建的会话 ID 安全地发送到客户端。

  2. 我了解到客户端会为它向服务器发出的每个请求发送 cookie。在 GET 请求中,客户端如何发送 cookie 信息,因为 GET 不包含正文?

2个回答

客户端和服务器之间的连接不使用公钥加密(仅用于初始密钥交换)。不同的算法用于加密(通常是对称加密),例如 TLS 1.2 连接上的 AES-256-CBC。因此,除非您截获它,否则除了预期的浏览器和原始服务器之外,没有人可以解密该消息。所以拦截并不像从服务器获取公钥信息那么容易。

cookie 不作为 GET 请求发送。它作为Cookie:[Token]; [Other cookies];. 底层请求类型与此无关。(但是,默认请求类型是 GET。)

我建议您查看从浏览器到您登录的网站的网络流量,看看在哪里使用了什么。(这在 Chrome 中很容易做到。)

答案 1: 如果服务器使用 SSL/HTTPS(由第三方验证 - 非自签名证书),cookie 和会话 ID 在网络上以密文形式传播,并且如果攻击者(中间人)使用数据包嗅探器,他们无法获得任何信息。他们无法解密数据,因为客户端和服务器之间的连接由经过验证的第三方保护。因此,没有经过验证的证书的 HTTPS 意味着服务器和用户无法确保会话 ID 未被嗅探。

这意味着在用户和服务器之间建立安全的 HTTPS 之后,必须发送和接收每个数据(即 cookie),并且可以确保会话 ID 安全地发送给用户。

非对称密码也仅用于交换对称密码的密钥(用于在客户端和服务器之间加密数据)。

在此处输入图像描述

为了更好的图像右键单击:在新窗口中打开图像

回答 2: cookie 完全由 HTTP 头字段中的请求头处理,客户端的 cookie 编码在 'Cookie' 和 'Set-Cookie' 响应头中,而服务器端的 cookie 编码在 'Cookie' 请求头中- $路径变量。

客户端请求示例:

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

在这里,浏览器上存储了两个 cookie (foo=10bar=20)。第二个将于 9 月 30 日到期。在每个后续请求中,浏览器会将 cookie 发送回服务器:

GET /spec.html HTTP/1.1
Host: www.example.com
Cookie: foo=10; bar=20
Accept: */*