在我的应用程序中,我包含了一个来自不同服务器/域的页面。为了简单起见,我将参考我的主要应用程序Web A和另一个Web B。
在用户登录后,我将使用CORS和jwt从B加载一个页面。在A中,我创建了一个编码的令牌,并将其传递给Ajax。Ajax在Header中添加此令牌("Authorization"=承载+编码令牌)。
B然后使用该令牌来解码和获取usersId及其所属的组,并确定用户是否有权访问该资源。此外,Web B内部还有一个访问控制允许来源=Web A设置,仅接受来自A.的请求
我的问题是关于CORS的安全部分和jwt的使用。在开发过程中,当使用Postman直接访问B中的资源时,我可以轻松绕过"访问控制允许来源"。只要我有正确的令牌,资源就可以毫无问题地发送回来!我的意思是,一些潜在的黑客只需要掌握编码的字符串,他们就可以很容易地使用Postman来查看资源。
当涉及到安全部分时,下一步该怎么办,因为我完全迷路了!
希望我把问题解释清楚。
CORS并不意味着在攻击者获取用户的JWT访问令牌并直接从Web B请求资源的情况下保护您。
事实上,CORS根本不是一个安全功能,而是一种安全绕过浏览器同源策略的方法,即安全功能。同源策略(基本上每个浏览器都实现)限制网页访问来自不同来源的网页上的数据。
想象一下浏览器没有实现同源策略的情况。任何网页都可以从任何来源请求数据,这意味着任何恶意网站都可以从银行、电子邮件帐户或其他任何地方请求数据。这个浏览器会很乐意发送与这些来源相关的任何HTTP cookie,并且所有这些请求都会得到授权。对这个浏览器的攻击是微不足道的。
因此,很明显,对于任何浏览器来说,同源策略都是必要的。然而,正如您所发现的,网站跨来源共享数据通常很有用。这就是创建CORS规范的原因。只要双方同意跨来源共享数据,浏览器就会允许发送请求。
为了回答您的真实问题,阻止攻击者直接使用JWT的方法是首先不允许他们访问JWT。你应该像保护HTTP会话cookie或密码一样保护JWT,因为它就是这样
这是完全正确的。CORS的存在是为了保护用户在网络浏览器中的安全。直接浏览或卷曲到站点B不受CORS保护。服务器可以从各种客户端获得任何类型的请求,并且必须确保自身安全。
站点B的安全性来自于正确使用JWT(最好通过HTTPS)。首先,使用一个秘密对令牌进行签名。这让你知道其他人并没有改变它,也没有自己创造一个。第二,有效载荷应包括相对较短的到期时间。令牌的接收者应该在这段时间后忽略它,这样中间的人拿到令牌的时间就很短了。第三,如果你只通过HTTPS传递令牌,那么其他人得到它的几率就很低。