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

Mas*_*tid 181 browser authentication cookies

有人可以给我一步一步描述基于cookie的身份验证的工作原理吗?我从未做过涉及身份验证或cookie的任何事情.浏览器需要做什么?服务器需要做什么?按什么顺序?我们如何保证安全?

我一直在阅读有关不同类型的身份验证和关于cookie的信息,但我想要了解如何将两者结合使用的基本描述 - 我只是读到它们经常一起使用但却找不到如何使用的描述.

pll*_*llx 249

我意识到这已经晚了几年,但我想我可以扩展Conor的答案,并在讨论中加一点.

有人可以给我一步一步描述基于cookie的身份验证的工作原理吗?我从未做过涉及身份验证或cookie的任何事情.浏览器需要做什么?服务器需要做什么?按什么顺序?我们如何保证安全?

第1步:客户端>注册

在此之前,用户必须注册.客户端向服务器发布包含其用户名和密码的HTTP请求.

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

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

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

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

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

服务器在数据库中查找用户名,散列提供的登录密码,并将其与数据库中先前散列的密码进行比较.如果它没有签出,我们可以通过发送401状态代码并结束请求来拒绝他们访问.

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

如果一切都结束了,我们将创建一个访问令牌,它唯一地标识用户的会话.仍然在服务器中,我们使用访问令牌做两件事:

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

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

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

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

这应该让你开始.注销时务必清除cookie!

  • 您可能会在到期时使访问令牌无效,可能在数据库中有"到期日期".或者,您可以考虑使用[JSON Web Tokens(JWT)](http://techarena51.com/index.php/json-web-token-authentication-with-flask-and-angularjs/),这类似于访问令牌,但可以处理令牌到期等.[更多关于JWT的信息.](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#rfc.section.4.1.4)攻击者仍然可以访问你的如果他们拥有您的访问令牌/ JWT,则会占用很短的时间段,因此您还应该保护您的终端. (12认同)
  • @ManuChadha,您可以与令牌/会话密钥一起保存用户的IP地址以及其他标识参数,例如用户代理等。如果请求带有有效的cookie,但来自错误的IP、浏览器等,那么您拒绝请求并将用户重定向到登录页面以再次进行身份验证。 (9认同)
  • 谢谢你的描述.我只是想知道访问令牌如何提供安全性?攻击者是否可以窃取cookie,作为经过身份验证的登录用户?或者受SSL保护? (7认同)
  • @Richeek SSL在请求/响应期间保护拦截,但攻击者可能会在端点(例如您的浏览器)访问您的cookie.从理论上讲,他们可以伪装成登录用户,直到cookie过期.我说"理论上"因为上面的实现没有处理.在上面的实施,直到你的数据库的访问令牌被更新(即下次登录时),攻击者将有机会获得. (4认同)
  • @john-raymon 我的意思是你可以将它与令牌一起用作附加信息。这可以防止有人窃取 cookie 并从另一台计算机上使用它们,假装拥有它们。 (4认同)
  • 花了我很久才说谢谢!谢谢你的解释 (3认同)
  • 最佳实践是在客户端对密码进行哈希处理,以进一步降低窥探风险。 (3认同)
  • 非常清楚而且有帮助!谢谢! (2认同)
  • @FalcoGer 检查设备的 IP 不是很安全,因为同一网络上的计算机可以使用相同的 IP 地址,甚至同一台计算机上的用户可以使用相同的 IP 地址吗? (2认同)

Con*_*ick 144

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

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

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

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


Deb*_*ash 14

基于Cookie的身份验证

基于Cookie的身份验证通常可以通过以下4个步

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

  4. 一旦用户退出应用程序,会话就会在客户端和服务器端被销毁.