我正在开发具有以下身份验证风格的 RESTful(ish) API:
-
客户端调用"身份验证"API 方法,并通过 HTTPS POST 传递用户名和密码。 此方法返回基本帐户信息和"客户端令牌",该令牌存储在数据库中的用户帐户上。
-
所有进一步的 API 调用(全部通过 HTTPS POST)都需要客户端令牌。 如果系统无法通过客户端令牌找到请求者,则调用将被拒绝。
我的开放问题是:1)有人认为这有重大的安全问题吗?2) 我有什么充分的理由让客户端令牌随着时间的推移而过期或更改? 现在我为每个用户分配一个随机的。 如果用户注销或忘记密码,我会生成一个新密码。
我很想知道大家对这种方法的看法。 我不追求创新,我只是让我意识到这种方法的风险。
你所描述的内容在功能上等同于会话cookie,只是在你的应用程序中重新实现,因此受到许多陷阱的影响,这些陷阱可能已经被大多数Web框架处理过。
- 确保您的代币有足够的熵位。 如果令牌是简单的 32 位整数,那么疯狂的猜测可能足以击中其他人正在使用的标记。
- 如果要随机生成这些令牌,请确保使用加密强度高的随机数源,否则下一个令牌可能会根据以前的令牌进行猜测。
- 如果这些
POST
请求来自脚本,并且这些请求嵌入在网页中,则将令牌作为显式参数传递,而不是作为声明secure
和httponly
的cookie传递,使跨站点脚本的令牌窃取变得更加容易。