[英]How to prevent Rest web-service Authentication with stolen Token
众所周知,Rest 服务是无状态的,身份验证的一般策略是使用基于令牌的身份验证。
在登录服务中,它需要返回令牌的凭据。
此令牌可能在客户端 cookie 中设置,所有后续请求都使用此令牌进行验证并在令牌有效时处理新请求。
现在我的问题是如何验证令牌? 如果有人窃取了令牌并试图通过仅编辑 cookie 来使用窃取的令牌访问休息服务,那么如何识别和限制它?
我们永远无法知道令牌是否由有效用户获取,并且同一用户正在尝试访问后续请求。 但是有什么可能的方法让它更难,比如验证请求是否来自同一个来源?
一个普遍的建议是为令牌/cookies 设置老化,但直到该令牌/cookies 的年龄它仍然没有帮助。
任何建议,将不胜感激。
我不相信有任何 100% 万无一失的方法可以防止使用被盗用户令牌进行访问。 你怎么知道令牌首先被盗了? 但从我的脑海中,您可能需要考虑以下几点:
我目前对在浏览器中授权请求的“最安全”方法的理解是要求结合验证 HttpOnly SameSite cookie 和 HTTP 标头(例如Authorization
或X-CSRF-Token
)。
例如,在向浏览器发布 JWT 时,将 JWT 签名发送到HttpOnly SameSite
cookie 中,然后将正文(不带签名)发送到客户端存储在localStorage
并在Authorization
标头中提交。 在授权请求时,将两者结合回完整的 JWT 并在此之后正常验证它。
或者,您可以生成两个带有字段的 JWT 来区分它们(例如,客户端有"browser"
,cookie 有"cookie"
),并要求两者都有效并且都标识同一用户。 一个在Authorization
标头中发送并存储在localStorage
,另一个使用SameSite HttpOnly
cookie。
另一种流行的方法是将 CSRF 令牌存储在 JWT 的字段中,并将 JWT 放入 cookie 并要求客户端在标头中发送匹配的令牌(例如X-CSRF-Token
)。
所有的解决方案都有效地防止了 XSS 和 CSRF 攻击:XSS 无法检索 HttpOnly cookie,并且 CSRF 不包含 HTTP 标头,因此可以阻止这两种攻击。
请注意,您可能只想将此规则应用于来自 Web 浏览器的请求。 对于服务器到服务器的通信,请求不受 CSRF 和 XSS 攻击。
您可以使用 jwt 是一种 Internet 标准,用于创建断言一些声明的基于 JSON 的访问令牌。 例如,服务器可以生成具有“以管理员身份登录”声明的令牌,并将其提供给客户端。 然后客户端可以使用该令牌来证明它以 admin 身份登录。
它是如何工作的?
首先它包含由开发人员生成的私钥:
让我们拥有这个密钥: sfcqw@sav%$#fvcxv*s_s515
和这个称为私钥的,我们还有一个公钥,这个公钥生成的公钥取决于用户数据和私钥,如果不知道包含什么是不可能的你不知道私钥。
进一步解释:
公钥:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.plpJkAcgrgCIsoRyV2kjGsvWF6OsXU1mD785OSWTH4o
我们有我们的私钥生成的上述密钥: sfcqw@sav%$#fvcxv*s_s515
为了更清楚地访问这个网站: https ://jwt.io/ 并尝试通过公钥而不像图片那样放置秘密密钥,你会明白一切。
经过各种方法的挣扎,我们找到了如下解释的解决方案:
解决方案:-> 虽然令牌值被加密,但它只代表一个值,所以如果用另一个有效的加密值替换整个加密值,它可能会被黑客入侵。
所以为了解决这个问题,我们添加了另一个 cookie,它是多个值的组合。
例如
Cookie 1 -> 加密令牌
Cookie 2 -> 一个加密对象,包含用户名+一些其他用户上下文详细信息+令牌等信息
因此,在 Cookie 1 的情况下,很容易用另一个加密值替换,因为它虽然是加密的,但只代表一个令牌。
但是在 Cookie 2 的情况下,它包含具有多个值的对象,因此只能在同一个 cookie 中修改、加密和设置令牌值。
在身份验证之前,我们正在对整个 cookie 2 进行解密,从中获取令牌部分并根据 cookie 1 验证它的令牌部分。
这就解决了我们的问题!!
感谢大家的时间和指导。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.