严格来说,是的,存储在本地/会话存储(我称为HTML5存储)中的任何内容都可能在跨站点脚本(XSS)攻击中被盗。 请参阅本文。
但是,有很多移动部件要考虑。
首先,在JavaScript访问方面,HTML5存储和cookie的范围存在细微的差异。
HTML5存储是:
分为http和https。 运行在secure上的JavaScript无法访问存储在httpOnly HTML5存储中的项目。
在子域之间划分。 运行在secure上的JavaScript无法访问存储在httpOnly HTML5存储中的项目(但是,您可以采取一些技巧来解决此问题)。
Cookie更加松散:
域为httpOnly的cookie会同时访问secure和sub.example.com,除非它具有secure属性,在这种情况下,它将仅发送到https。
未使用显式域发送的Cookie将仅发送回发送它的确切域。 如果该域被明确定义为httpOnly,则它将同时发送到298386887295841111777和sub.example.com。(不幸的是,这是cookie“ spec”中最令人困惑的部分,请参阅本文)。
如果cookie在具有匹配域的页面上运行(并遵守httpOnly cookie标志),则JavaScript可以读取JavaScript,除非该cookie具有secure属性,在这种情况下,JavaScript将无法读取它。
其次,由于cookie标记有域,因此,当向服务器发出请求时,浏览器将发送具有匹配域的所有cookie,而与发出请求的页面的域无关。
最后一部分是CSRF攻击的完成方式(同源策略只能起到很大作用)。 CSRF上的OWASP页面是学习此类攻击如何工作的好资源。
关键字:手动是将身份验证令牌存储在本地存储中并手动将其添加到每个请求中的原因,可以防止CSRF。 由于浏览器不会自动发送该身份验证令牌,因此如果我访问httpOnly并且它设法发送secure,它将无法发送我的身份验证令牌,因此该请求将被忽略。
考虑到以上几点,是使用cookie还是HTML5存储成为一系列的权衡:
将authen令牌存储在HTML5存储中意味着:
httpOnly在XSS攻击中被盗的风险。
httpOnly提供CSRF保护。
httpOnly必须手动修改发送到服务器的每个请求,将您限制为SPA(例如AngularJs)Web应用程序。
另一方面,如果您将身份验证令牌存储在标记为httpOnly和secure的cookie中,则:
httpOnly XSS无法窃取身份验证令牌。
httpOnly您将必须自己提供CSRF保护。 在某些框架中,实施CSRF保护要容易得多。
哪个选项更好取决于您的需求。
您的验证令牌可以保护与金钱无关的任何东西吗? 您可能需要使用Cookie httpOnly secure选项。
实施CSRF保护所需的工作水平是否不值得其保护的资产? 然后,HTML5存储可能是正确的位置。