我想使用HTTPS来保护我的客户端和服务器之间的通信.第一个加密通信将用于验证用户 – 即检查他/她的用户名和密码.
在服务器成功检查用户凭据后,我想开始在后续请求中获取一些数据.但是服务器如何确定后续请求是由用户发送的,其用户的凭据已被检查过?
由于TCP连接可能在登录和后续HTTPS请求之间关闭,(我认为)这意味着服务器必须释放SSL上下文,因此使用新的GET请求时,必须建立新的TCP连接并使用新的SSL(必须完成TLS)握手(即加密的新共享密码必须由双方交换,等等)
为此,我认为服务器需要在200 OK响应中向客户端发回一些随机生成的nonce(在一定时间内有效)的初始身份验证请求,我将在每个后续请求中包含这些,因此服务器将能够根据这个随机生成的nonce检测请求后面的用户名,并检查该用户是否已经登录.我的理解是否正确?
非常感谢您的回复
BR
斯登
最佳答案 最简单的方法是要求所有通信都通过HTTPS进行(因此数据是保密的;除客户端和服务器之外的任何人都可以看到它)并在该安全连接内的每个请求上使用简单的用户名和密码.这在实践中很简单(用户名和密码实际上作为HTTP标头通过连接,这在这里是正常的,因为我们使用的是HTTPS),服务器可以在每次允许用户时进行检查.您无需担心SSL握手;这是SSL / HTTPS层的责任(这就是为什么HTTPS / SSL很好).
或者,可以用任何方法完成登录,并生成存储在会话cookie中的某种幻数(例如,UUID或随机数的加密散列和用户名).后续请求可以检查幻数是否是它从会话开始识别的那个(并且自发布以来没有经过太多时间);注销只是忘记了服务器端的幻数(并要求客户忘记).实现这一点需要更多的工作,但仍然不难,并且有服务器端的库来处理驴工作.
第一个选项特别适合于您正在编写其他程序使用的内容,因为它非常容易实现.第二种选择是在客户端是Web浏览器的情况下更好,因为它使用户能够更好地控制他们的浏览器何时被授权(程序API通常不需要那种东西).每当客户端成为浏览器时,您也需要注意防范其他类型的攻击(例如,各种类型的请求伪造),但这几乎与其他所有内容无关.