pki*_*169 68 security cookies restful-authentication local-storage jwt
为了使用JWT保护REST API,根据一些材料(如本指南和此问题),JWT可以存储在localStorage或Cookies中.根据我的理解:
因此,基于上述前提 - 最好将JWT存储在Cookies中.在每次向服务器发出请求时,将从Cookie中读取JWT并使用承载方案添加到授权标头中.然后,服务器可以验证请求标头中的JWT(而不是从cookie中读取它).
我的理解是否正确?如果是这样,上述方法是否有任何安全问题?或者实际上我们可以在第一时间使用localStorage逃脱?
Ima*_*ghi 38
我喜欢@ pkid169所说的文章中提到的XSRF Double Submit Cookies方法,但文章中有一件事没有对你说.您仍然没有受到XSS保护,因为攻击者可以执行的操作是注入读取CSRF cookie(不是HttpOnly)的脚本,然后使用此CSRF令牌向您的某个API端点发出请求,并自动发送JWT cookie.
所以实际上你仍然容易受到XSS的攻击,只是攻击者无法窃取你的JWT令牌供以后使用,但他仍然可以使用XSS代表你的用户提出请求.
无论是将JWT存储在localStorage中还是将XSRF令牌存储在非http-only cookie中,都可以通过XSS轻松获取.甚至你的HttpOnly cookie中的JWT也可以通过高级XSS攻击来获取.
因此,除了Double Submit Cookies方法之外,您还必须始终遵循针对XSS的最佳实践,包括转义内容.这意味着删除任何可能导致浏览器执行您不希望的操作的可执行代码.通常这意味着删除// <![CDATA [标记和HTML属性,导致JavaScript被评估).
pki*_*169 18
来自Stormpath的及时帖子已经详细阐述了我的观点并回答了我的问题.
将JWT存储在cookie中,然后在我提到的每个请求上通过授权头中的JWT,或者如文章所示,依靠后端来防止CSRF(例如xsrfToken在Angular的情况下使用).
dev*_*tor 15
相反,在登录时,您可以提供两个令牌:访问令牌和刷新令牌。访问令牌应存储在 Javascript 内存中,刷新令牌应存储在 HttpOnly Cookie 中。刷新令牌仅用于创建新的访问令牌 - 仅此而已。
当用户打开新标签页或站点刷新时,您需要根据存储在 Cookie 中的刷新令牌执行创建新访问令牌的请求。
我也强烈推荐阅读这篇文章:https : //hasura.io/blog/best-practices-of-using-jwt-with-graphql/
Ian*_*ter 11
为了帮助防止利用现有 cookie 的 CSRF 攻击,您可以使用该SameSite指令设置 cookie。将其设置为lax或strict。
这仍然是一个草案,截至 2019 年,尚未得到所有当前浏览器的完全支持,但根据您的数据的敏感性和/或您对用户使用的浏览器的控制,这可能是一个可行的选择。设置该指令SameSite=lax将允许“使用‘安全’...HTTP 方法的顶级导航”。