似乎JWT的最佳用例是临时的服务器对服务器共享身份验证。读this article时,它强调了我最难以理解的两点,因为它们似乎是矛盾的:
JWT需要存储在用户浏览器内部的安全位置... XSS攻击可以使外部攻击者访问令牌... 请勿将其存储在本地存储中。
...
JWT是一种用于API身份验证和服务器到服务器授权的出色技术...假设您有一个登录的服务器SERVER1,它将您重定向到另一台服务器SERVER2以执行某种操作。 SERVER1可以向您发出授权您使用SERVER2的JWT。
在我看来,如果JWT无法用于JS,则它们将更安全地免受XSS攻击。我看到一些建议,说:“由开发人员来减轻XSS,如果不是随每个请求发送JWT,JWT就会更有用,等等”,但这并不是一个普遍的看法,在我看来,这有点一个警察。
将它们存储在安全的cookie中(假设已设置CSRF保护)不会听起来像是一个不好的建议。但是,如果JWT存储在cookie中,并且如果服务器位于不同的域上,您如何将它从服务器传递到服务器以进行身份验证?
我通过<img>
和<iframe>
标签看到了一些examples of cross-domain cookies;但是,这似乎有点骇人听闻,而且据称并非总是与浏览器无关。其他人则使用了特定的标头配置,这似乎更合理,但是一些用户指出,如果未正确设置,则某些方面可能会引入其他漏洞。如果禁用了第三方Cookie(在某些浏览器中默认情况下),它也将不起作用。
因此,是的,如果JWT位于受保护的HTTPOnly cookie中,您如何将其用于服务器到服务器的身份验证(以与浏览器无关的方式)?
编辑:他们看着this suggestion by Stormpath, an auth solution develolper,建议使用httpOnly cookie,然后说以下话。是否有一个标准的实现方式,还是只是个案解决?
即使存储您的JWT更安全,Cookie也会引起开发人员的头痛,具体取决于您的应用程序是否需要跨域访问才能工作。请注意,cookie具有其他属性(域/路径),可以对其进行修改以允许您指定允许将cookie发送到的位置。使用AJAX,您的服务器端还可以通知浏览器是否应随CORS请求一起发送凭据(包括Cookies)。