Authentication 在cookies中存储FaunaDB客户端机密安全吗?

Authentication 在cookies中存储FaunaDB客户端机密安全吗?,authentication,session,cookies,faunadb,Authentication,Session,Cookies,Faunadb,许多FaunaDB身份验证指南提倡将客户机机密作为cookie存储在中,以便将其附加到后续的db查询中,但它有多安全?实际上,秘密令牌百分之百地暴露在浏览器的cookie存储中 假设这是Next.js应用程序下的/pages/api/login.js处理程序: 从'faunadb'导入{Client,查询为q} 从“cookie”导入cookie const client=new client({secret:'YOUR_SERVER_secret_KEY_DO_NOT_EXPOSE_THIS_

许多FaunaDB身份验证指南提倡将客户机机密作为cookie存储在中,以便将其附加到后续的db查询中,但它有多安全?实际上,秘密令牌百分之百地暴露在浏览器的cookie存储中

假设这是Next.js应用程序下的
/pages/api/login.js
处理程序:

从'faunadb'导入{Client,查询为q}
从“cookie”导入cookie
const client=new client({secret:'YOUR_SERVER_secret_KEY_DO_NOT_EXPOSE_THIS_EVER'})
常量faunacookie=secret=>{
const cookieSerialized=cookie.serialize('fanu\u SECRET\u cookie',SECRET{
sameSite:“松弛”,
安全:process.env.NODE_env==='production',
最大年龄:72576000,
httpOnly:true,
路径:“/”,
})
返回cookieSerialized
}
导出默认异步(req,res)=>{
客户
.query(q.Login(q.Match(q.Index('userByHandle'),req.body.handle),{password:req.body.password}))
.然后({secret})=>{
res.setHeader('Set-Cookie',faunacookie(秘密))
资源状态(200).end()
})
}
这样做的结果非常明显,域将设置一个类似于
FAUNA\u SECRET\u cookie whateverrandomUppercase和LowercaseAlPhanum3r1CalString
——没有加密的cookie。
谢谢

理解起来有点难您的示例本身并不是不安全的,尽管这是一种非常糟糕的做法,不必要,可能会导致安全问题。

在您的示例中,您使用的是
您的服务器\u SECRET\u KEY\u don\u NOT\u EXPOSE\u THIS\u EVER
,我假设它要么是
服务器
要么是
管理员
角色
密钥

有几件事需要了解:

  • 无法从浏览器访问您的
    fanu\u SECRET\u COOKIE
    COOKIE,因为它使用了
    httpOnly:true
    ,这使得它只能从服务器读取。因此,任何人都无法访问该秘密,而只能由您访问
  • 将服务器/管理员角色密钥存储在cookie中是一种非常糟糕的做法,即使它使用的是httpOnly cookie,但如果将其发送到浏览器,则此密钥可用于处理数据库中的任何事情,它授予了过多的权限
尽管在浏览器(存储在
httpOnly
cookie中)中发送动物标识并不一定不安全,但主要取决于该标识授予的角色(以及随附的权限)

大多数在线示例无法完全解释的是,只有当秘密令牌具有有限的权限集时,才应该向浏览器提供这些令牌。这通常需要创建自定义角色,如屏幕截图中提到的
公共
角色

以一个基于(我是作者)的真实示例为例,您可以在上看到该应用程序的演示

在此应用程序上,有一个与
Public
角色相关联的密钥,可在浏览器中为访问该应用程序的所有人提供。这不是不安全的,因为与该角色关联的权限非常有限。(它们基本上允许读/写一个id=1的
id
,而不允许其他内容)

这是一个安全但共享的令牌的示例

另一个例子(来自同一个应用程序)是当用户进行身份验证时,他获得了一个新的令牌,然后存储在httpOnly cookie中(与您的例子相同)此标记与角色无关,而是与文档相关。

文档是经过身份验证的“用户”,通过另一个自定义角色“编辑器”处理。角色配置有一组限制性权限,基本上允许令牌仅读取用户本身,以及将
ownerId
设置为用户id的文档

总而言之:

  • 如果有人“偷”了
    Public
    令牌(它在浏览器中是硬编码的,很容易检索),他们只能执行非常有限的一组操作,这是安全的
  • 如果有人要窃取用户的令牌(这并不简单,因为它没有存储在浏览器上,尽管可能是因为它被发送到浏览器),他们只能模拟该特定用户。此外,令牌作为7h TTL,因此在生成后7h将自动失效

如果它是服务器密钥或管理密钥,您不应该将其提供给前端,它应该是后端专有的,因为:

您提供给前端的任何内容都会公开,也就是说,任何人都可以访问它,无论它是存储在cookie中、本地存储中还是对xhr的响应,恶意用户都会检查所有内容,以搜索您碰巧泄漏到前端的密钥


但是,正如@Vadorequest所解释的,如果用户使用它对自己的数据进行操作(并且不能用于其他任何用途),那么我认为它完全可以。

感谢您的输入!是的,Fanua服务器密钥未暴露于前端,它将存储在未经git.env跟踪的文件中,或者在使用vercel时,它可以存储为vercel环境变量。明白!非常感谢!我现在在想,比起FaunaDB描述的标准auth流,我更愿意使用ABAC方法。因此,为文档定义权限,为分配给用户的角色定义权限是一种方法。在这种情况下,如果一个人登录并收到对他自己的文档有效的令牌,那么我的登录api应该如何更改?但是,如果我需要一个能够管理整个数据库的超级管理员用户角色,该怎么办?这再也不能违背目标了。你两者都需要,我在POC里就是这么做的。我有一个
se