我正在编写一个应用服务器,并且可以选择仅使用安全 cookie 进行身份验证。以下是它的工作方式:
- 您在服务器上定义了一个 32 字节的密钥
- 当用户登录时,您检查数据库以查看 bcrypt 哈希是否匹配,如果匹配,则调用
request.remember(user_id) - 在需要身份验证(和 user_id)的路由处理程序上,您通过解密 cookie 来解开 user_id,如果它有效,则继续。否则,返回
Unauthorized错误。 - 如果用户点击我刚刚调用的注销处理程序
request.forget(),并且客户端上的 cookie 将被删除。
这一切似乎都奏效了。所以我很好奇为什么不是每个人都这样做?我环顾四周,似乎有很多关于 JWT 的讨论,生成身份验证令牌 UUID 并将它们存储在 Redis/数据库等中。所以显然这种方法不安全?你需要在服务器上存储状态吗?
如果我猜的话,我会说这种方法的一个问题可能是,如果 cookie 以某种方式被盗(不知道如何,因为它是通过 TLS 并且 cookie 是 HTTP-Only 并且如果重要的话是安全的),那么用户将能够被攻击者冒充。但我认为这也适用于其他方案?
我可以看到的另一个问题是,用户可以随机生成身份验证令牌,直到他们找到与用户匹配的身份验证令牌?但我不确定这是否是一个问题,因为我只是对身份验证处理程序进行速率限制,我想这种事情需要一段时间?哦,也许他们可以创建 100 个帐户,看看加密的 cookie 身份验证令牌是什么样子,然后在客户端暴力破解它以找出服务器上的密钥是什么?然后他们就能够通过生成身份验证令牌来冒充用户?虽然我认为找到密钥需要很长时间,因为它是 32 字节?
我猜这种方法不会自动使 cookie 过期(这就是为什么不经常使用它的原因?但我认为有一种方法可以向 cookie 添加过期标头?这行得通吗?)我什至不确定我是否需要过期对于这个应用程序.. 似乎它会惹恼用户。Google/Facebook 等地方的会话持续多长时间?我觉得我总是永远登录这些服务。
我不知道。我觉得我在这里错过了很多信息。有没有什么地方可以找到所有这些不同方法的优缺点列表?