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


210

有人可以逐步介绍基于Cookie的身份验证的工作方式吗?我从未做过涉及身份验证或Cookie的任何事情。浏览器需要做什么?服务器需要做什么?以什么顺序?我们如何确保事物安全?

我一直在阅读有关身份验证的不同类型和cookie的信息,但是我想对如何将两者一起使用进行基本描述-我只读过它们经常一起使用但找不到描述的方法。


Answers:


162

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

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

您可以为Cookie服务器端配置不同的选项,例如到期时间或加密。加密的cookie通常称为签名的cookie。基本上,服务器会对字典项中的键和值进行加密,因此只有服务器可以使用该信息。因此,cookie将很安全。

浏览器将保存服务器设置的cookie。在浏览器对该服务器发出的每个请求的HTTP标头中,它将添加cookie。它只会为设置它们的域添加cookie。Example.com可以设置cookie,还可以在HTTP标头中添加选项,以供浏览器将cookie发送回子域,例如sub.example.com。浏览器曾经将cookie发送到另一个域是不可接受的。


我了解的是浏览器能够将Cookie发送回相同的域。与此相关,当区分两个域时,浏览器是否考虑子域?
Aakash 2014年

1
您可以在HTTP标头中设置有关浏览器如何处理子域的选项。
科纳·帕特里克

287

我意识到这已经晚了几年,但我认为我可以扩展Conor的答案,并在讨论中增加更多内容。

有人可以逐步介绍基于Cookie的身份验证的工作方式吗?我从未做过涉及身份验证或Cookie的任何事情。浏览器需要做什么?服务器需要做什么?以什么顺序?我们如何确保事物安全?

步骤1:客户>注册

在此之前,用户必须先注册。客户端将包含他/她的用户名和密码的HTTP请求发布到服务器。

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

服务器收到此请求并在将用户名和密码存储在数据库中之前对密码进行哈希处理。这样,如果某人获得了对您数据库的访问权限,他们将看不到您用户的实际密码。

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

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

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

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

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

如果一切都完成了,我们将创建一个访问令牌,该令牌唯一地标识用户的会话。仍然在服务器中,我们使用访问令牌执行两件事:

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

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

第6步:客户端>发出页面请求

回到客户端,我们现在已经登录。每次客户端请求一个需要授权的页面(即他们需要登录)时,服务器都会从cookie中获取访问令牌,并对照其中的一个进行检查。在与该用户关联的数据库中。如果签出,则授予访问权限。

这应该使您入门。确保注销后清除cookie!


10
感谢您的描述。我只是想知道访问令牌如何提供安全性?攻击者能否窃取cookie,冒充经过身份验证的登录用户?还是受SSL保护?
Richeek 2015年

6
@Richeek SSL可确保请求/响应期间的拦截,但攻击者可能会在端点(例如,浏览器)访问您的cookie。从理论上讲,他们可以冒充登录用户,直到Cookie过期。我说“理论上”是因为上面的实现无法解决这个问题。在上述实现中,攻击者将具有访问权限,直到您数据库中的访问令牌更新(即下次登录)。
2015年

14
您可能会在自己到期后使访问令牌无效,也许在数据库中带有一个“到期日期”。或者,您可以考虑使用JSON Web令牌(JWT),类似于访问令牌,但可以处理令牌到期等问题。有关JWT的更多信息,请点击此处。 如果攻击者拥有您的访问令牌/ JWT,则他们仍然会在短时间内访问您的帐户,因此您也应该保护端点。
2015年

3
花了我很长时间说谢谢!感谢您的explanantion
Richeek

4
@ManuChadha您可以与令牌/会话密钥一起保存用户的ip地址以及其他识别参数,例如用户代理等。如果请求随后带有有效的cookie,但来自错误的ip,浏览器等,那么您拒绝请求并将用户重定向到登录页面以再次进行身份验证。
FalcoGer

18

基于Cookie的身份验证

基于Cookie的身份验证在以下4个步骤中正常工作:

  1. 用户在登录表单中提供用户名和密码,然后单击登录。
  2. 发出请求后,服务器通过在数据库中查询来在后端验证用户。如果请求有效,它将使用从数据库中获取的用户信息来创建会话并将其存储,对于每个会话,都会创建一个称为会话ID的唯一ID,默认情况下,会话ID将通过浏览器提供给客户端。
  3. 浏览器将在每个后续请求上提交此会话ID,并根据数据库验证该会话ID,基于该会话ID,网站将识别属于哪个客户端的会话,然后给予访问请求。

  4. 用户注销应用程序后,会话将在客户端和服务器端被销毁。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.