基于cookie的身份验证如何工作?

304

如何逐步描述基于cookie的身份验证工作过程?

我从未涉及过身份验证或cookie方面的任何操作。浏览器需要做什么?服务器需要做什么?以什么顺序进行?如何保持安全性?

我一直在阅读不同类型的身份验证和cookies,但我想要一个基本的描述如何将两者结合使用。我只是读到它们经常一起使用,但我找不到描述它们如何配合的信息。


4
http://www.howstuffworks.com/cookie.htm - Cyclonecode
3个回答

416

为了深入Conor的回答并且在讨论中加入一些内容...

能否有人给出一个cookie认证的步骤描述?我从没做过任何涉及认证或cookies的东西。浏览器需要做什么?服务器需要做什么?按什么顺序?如何保持安全性?

步骤1:客户端> 注册

首先,用户必须注册。客户端向服务器发送一个包含用户名和密码的HTTP请求。

步骤2:服务器> 处理注册

服务器接收此请求并对密码进行哈希处理,然后将用户名和密码存储在数据库中。这样,如果有人获得您的数据库访问权限,则无法看到您用户的实际密码。

步骤3:客户端> 用户登录

现在用户登录。他/她提供其用户名/密码,并再次将其作为HTTP请求发布到服务器。

步骤4:服务器> 验证登录

服务器查找数据库中的用户名,对所提供的登录密码进行哈希处理,并将其与先前在数据库中进行哈希处理的密码进行比较。如果不符合要求,我们可以通过发送401状态代码并结束请求拒绝他们的访问。

步骤5:服务器> 生成访问令牌

如果一切都符合要求,我们将创建一个访问令牌,该令牌唯一标识用户的会话。在服务器上,我们对访问令牌执行两个操作:

  1. 将其与该用户关联的数据库中存储
  2. 将其附加到响应cookie中以返回给客户端。请务必设置过期日期/时间以限制用户的会话

此后,cookies将附加到客户端和服务器之间进行的每个请求(和响应)中。

步骤6:客户端> 发送页面请求

回到客户端,我们现在已经登录。每当客户端请求需要授权的页面时(即他们需要登录),服务器从cookie获取访问令牌并将其与与该用户关联的数据库中的令牌进行比较。如果符合要求,则允许访问。

这将为您提供一个起点。请确保在注销时清除cookies!


14
谢谢您的描述。我想知道访问令牌如何提供安全性?如果攻击者窃取了 cookie,是否可以冒充已经通过身份验证并登录的用户?或者这是由 SSL 保护的? - Richeek
10
SSL 可以保护请求/响应过程中的拦截,但攻击者可以在端点(例如您的浏览器)访问您的 cookie。从理论上讲,他们可以冒充已登录的用户直到 cookie 过期。我说“从理论上讲”,因为上述实现没有处理该问题。在上述实现中,攻击者将一直有访问权限,直到数据库中的访问令牌更新(即下次登录)。 - pllx
19
在访问令牌过期时,您可以在数据库中使用“到期日期”来使访问令牌无效。或者,您可以考虑使用类似于访问令牌的JSON Web Tokens(JWT),它们可以处理令牌的到期时间等其他事项。有关JWT的更多信息,请参见此处。如果攻击者拥有您的访问令牌/JWT,则他们仍将在短时间内访问您的帐户,因此您还应保护您的端点。 - pllx
12
除了保存令牌/会话密钥,您还可以保存用户的IP地址以及其他识别参数,例如用户代理等。如果请求带有有效的cookie但来自错误的IP、浏览器等,则拒绝该请求并将用户重定向到登录页面以再次进行身份验证。 - FalcoGer
5
为了进一步减少窥探风险,最佳实践是在客户端进行密码哈希处理。 - user10997580
显示剩余4条评论

215

Cookie基本上就是字典中的一项。每一项都有一个键和一个值。对于身份验证,键可以是类似于“用户名”的东西,而值则是用户名。每次您向网站发出请求时,您的浏览器都会在请求中包含cookie,并且主机服务器将检查cookie,因此身份验证可以自动完成。

要设置cookie,只需将其添加到响应中,该响应是服务器在请求后发送回来的。浏览器在接收响应后将添加cookie。

您可以为cookie服务器端配置不同的选项,例如过期时间或加密。加密cookie通常称为签名cookie。基本上,服务器会加密字典项中的键和值,因此只有服务器才能利用这些信息。这样cookie就是安全的。

浏览器将保存服务器设置的cookie。在浏览器向该服务器发出的每个请求的HTTP标头中,它都将添加cookie。它只会为设置了cookie的域添加cookie。例如,example.com可以设置一个cookie,并在HTTP标头中添加选项,以便浏览器将cookie发送回子域,比如sub.example.com。浏览器向不同的域发送cookie是不可接受的。


我理解的是浏览器能够将cookie发送回同一域名。在此基础上,当区分两个域名时,浏览器是否考虑子域名? - Aakash
1
您可以在HTTP头中设置选项,以控制浏览器如何处理子域。 - Conor Patrick

41

基于 Cookie 的身份认证

基于 Cookie 的 身份认证 通常分为以下四个步骤:

  1. 用户在登录表单中提供用户名和密码,并且客户端/浏览器发送登录请求。

  2. 请求发送后,服务器会通过查询数据库来验证用户。如果请求有效,则会使用从数据库中获取的用户信息创建一个会话并将其存储。对于每个会话,都会创建一个称为会话 ID 的唯一标识符。默认情况下,会话 ID 将通过浏览器提供给客户端。

  3. 浏览器将在每个后续请求中提交此会话 ID。会话 ID 将与数据库进行验证。根据此会话 ID,服务器将识别属于哪个客户端的会话,然后授予请求访问权限。

  4. 一旦用户从应用程序中注销,会话就会在客户端和服务器端同时销毁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接