Authentication 在cookies中存储FaunaDB客户端机密安全吗?
许多FaunaDB身份验证指南提倡将客户机机密作为cookie存储在中,以便将其附加到后续的db查询中,但它有多安全?实际上,秘密令牌百分之百地暴露在浏览器的cookie存储中 假设这是Next.js应用程序下的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_
/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
,我假设它要么是服务器
要么是管理员
角色密钥
有几件事需要了解:
- 无法从浏览器访问您的
COOKIE,因为它使用了fanu\u SECRET\u COOKIE
,这使得它只能从服务器读取。因此,任何人都无法访问该秘密,而只能由您访问httpOnly:true
- 将服务器/管理员角色密钥存储在cookie中是一种非常糟糕的做法,即使它使用的是httpOnly cookie,但如果将其发送到浏览器,则此密钥可用于处理数据库中的任何事情,它授予了过多的权限
httpOnly
cookie中)中发送动物标识并不一定不安全,但主要取决于该标识授予的角色(以及随附的权限)
大多数在线示例无法完全解释的是,只有当秘密令牌具有有限的权限集时,才应该向浏览器提供这些令牌。这通常需要创建自定义角色,如屏幕截图中提到的公共
角色
以一个基于(我是作者)的真实示例为例,您可以在上看到该应用程序的演示
在此应用程序上,有一个与Public
角色相关联的密钥,可在浏览器中为访问该应用程序的所有人提供。这不是不安全的,因为与该角色关联的权限非常有限。(它们基本上允许读/写一个id=1的id
,而不允许其他内容)
这是一个安全但共享的令牌的示例
另一个例子(来自同一个应用程序)是当用户进行身份验证时,他获得了一个新的令牌,然后存储在httpOnly cookie中(与您的例子相同)此标记与角色无关,而是与文档相关。
文档是经过身份验证的“用户”,通过另一个自定义角色“编辑器”处理。角色配置有一组限制性权限,基本上允许令牌仅读取用户本身,以及将ownerId
设置为用户id的文档
总而言之:
- 如果有人“偷”了
令牌(它在浏览器中是硬编码的,很容易检索),他们只能执行非常有限的一组操作,这是安全的Public
- 如果有人要窃取用户的令牌(这并不简单,因为它没有存储在浏览器上,尽管可能是因为它被发送到浏览器),他们只能模拟该特定用户。此外,令牌作为7h TTL,因此在生成后7h将自动失效
但是,正如@Vadorequest所解释的,如果用户使用它对自己的数据进行操作(并且不能用于其他任何用途),那么我认为它完全可以。感谢您的输入!是的,Fanua服务器密钥未暴露于前端,它将存储在未经git.env跟踪的文件中,或者在使用vercel时,它可以存储为vercel环境变量。明白!非常感谢!我现在在想,比起FaunaDB描述的标准auth流,我更愿意使用ABAC方法。因此,为文档定义权限,为分配给用户的角色定义权限是一种方法。在这种情况下,如果一个人登录并收到对他自己的文档有效的令牌,那么我的登录api应该如何更改?但是,如果我需要一个能够管理整个数据库的超级管理员用户角色,该怎么办?这再也不能违背目标了。你两者都需要,我在POC里就是这么做的。我有一个
se