SessionStorage、LocalStorage详解
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
原文出处:https://blog.bitsrc.io/sessionstorage-and-localstorage-a-ux-security-comparison-a05c486413e0
作为Web开发人员,在 Web浏览器中存储数据以改善用户体验和提升Web应用程序性能是非常常见的。在大多数情况下,可供我们使用就是LocalStorage和SessionStorage。
本文中,我们将会从安全性和用户体验两个方面对SessionStorage和LocalStorage进行评估。然后我们将讨论如何根据您的要求挑选合适使用的对象。
SessionStorage和LocalStorage简介
在HTML5之前,开发人员一般是通过使用Cookie在客户端保存一些简单的信息的。在HTML5发布后,提供了一种新的客户端本地保存数据的方法,那就是Web Storage,它也被分为:LocalStorage和SessionStorage,它允许通过JavaScript在Web浏览器中以键值对的形式保存数据。而相比Cookie有如下优点:
- 拥有更大的存储容量,Cookie是4k,Web Storage为5M。
- 操作数据相比Cookie更简单。
- 不会随着每次请求发送到服务端。
如何使用SessionStorage和LocalStorage
您可以使用浏览器window对象访问SessionStorage和LocalStorage。请看下面的示例:
- sessionStorage = window.sessionStorage
- localStorage = window.localStorage
以下是这两种存储类型可用的功能。
- //存储一个item
- storage.setItem('name', 'Alice')
- storage.setItem('age', '5')
- //读取一个item
- storage.getItem('name') // returns "Alice"
- //get存储对象长度
- storage.length // returns 2
- //通过索引get对应的key名
- storage.key(0) // returns "name"
- //移除一个item
- storage.removeItem('name')
- //清空存储对象
- storage.clear()
LocalStorage与SessionStorage的区别
LocalStorage和SessionStorage之间的主要区别在于浏览器窗口和选项卡之间的数据共享方式不同。
LocalStorage可跨浏览器窗口和选项卡间共享。就是说如果在多个选项卡和窗口中打开了一个应用程序,而一旦在其中一个选项卡或窗口中更新了LocalStorage,则在所有其他选项卡和窗口中都会看到更新后的LocalStorage数据。
但是,SessionStorage数据独立于其他选项卡和窗口。如果同时打开了两个选项卡,其中一个更新了SessionStorage,则在其他选项卡和窗口中不会反映出来。举个例子:假设用户想要通过两个浏览器选项卡预订两个酒店房间。由于这是单独的会话数据,因此使用SessionStorage是酒店预订应用程序的理想选择。
安全性说明
Web Storage的存储对象是独立于域名的,也就是说不同站点下的Web应用有着自己独立的存储对象,互相间是无法访问的,在这一点上SessionStorage和LocalStorage是相同的。
举个例子:部署在abc.com上的Web应用无法访问xyz.com的Web Storage存储对象。
同样,对于子域名也是一样,尽管www.grapecity.com.cn和gcdn.grapecity.com.cn 同属 grapecity.com.cn 主域下,但它们相互不能访问对方的存储对象。
另外,不仅对子域名相互独立,对于针对使用http和https协议间也是不同的,所以这一点也需要注意。
应对跨站点脚本攻击(XSS)
首先,什么是XSS攻击?
XSS是将一段恶意脚本添加到网页上,通过浏览器加载而执行从而达到攻击并获得隐私信息的目的。
LocalStorage和SessionStorage在这一点上都容易受到XSS攻击。攻击者可直接向存储对象添加恶意脚本并执行。因此不太建议把一些敏感的个人信息存储在Web Storage中,例如:
- 用户名密码
- 信用卡资料
- JsonWeb令牌
- API密钥
- SessionID
- 尽量不要减少用同一域名部署多个Web应用程序,如果有这种场景请尽量使用子域名部署应用,因为一旦多应用使用统一的域名,这将会对所有的用户共享Web存储对象。
- 一旦将数据存储在LocalStorage中,开发人员在用户将其清除之前无法对其进行任何控制。如果希望在会话结束后自动删除数据,请使用SessionStorage。
- 从WebStorage读取出的数据都要验证、编码和转义。
- 在保存进WebStorage前将数据加密。
如何避免攻击?
- 尽量不要减少用同一域名部署多个Web应用程序,如果有这种场景请尽量使用子域名部署应用,因为一旦多应用使用统一的域名,这将会对所有的用户共享Web存储对象。
- 一旦将数据存储在LocalStorage中,开发人员在用户将其清除之前无法对其进行任何控制。如果希望在会话结束后自动删除数据,请使用SessionStorage。
- 从WebStorage读取出的数据都要验证、编码和转义。
- 在保存进WebStorage前将数据加密。
对用户体验的提升
虽然一些敏感数据要避免使用,但我们依然可以通过WebStorage改善Web应用程序的用户体验
例如,用户在填写表单,但因为一些原因用户关闭了选项卡/窗口,但表单LocalStorage实现了自动保存用户表单的功能,这样当用户再次打开,用户之前填写的信息会自动被恢复。
- <!DOCTYPE html>
- <html>
- <body>
- <h2>表单示例</h2>
- <form>
- <label for="lname">姓氏:</label><br>
- <input type="text" id="lname" name="lname" value="" onchange="save(this)">
- <label for="fname">名字:</label><br>
- <input type="text" id="fname" name="fname" value="getValue(this)" onchange="save(this)"><br>
- </form>
- <script>
- localStorage= window.localStorage
- function save(input) {
- localStorage.setItem(input.id, input.value)
- }
- document.getElementById("fname").value=localStorage.getItem("fname")
- document.getElementById("lname").value=localStorage.getItem("lname")
- </script>
- </body>
- </html>
因为我们的场景是待用户再次打开时,自动恢复之前填写的内容,所以这里不能使用SessionStorage作为存储对象,因为它会在窗口关闭时自动清除。
使用存储对象进行浏览器缓存
一般情况下,我们可以缓存一些应用数据,以便后面供Web应用使用。例如,你的Web应用需要加载所有国家的货币数据,在不使用WebStorage情况下,每次加载获取列表时都需要发出HTTP请求来获取,而将数据保存在LocalStorage后,可直接获取数据。
由于LocalStorage不会过期的特性,用户在任何使用打开页面时都可以使用存储对象中的内容,而如果用户想删除LocalStorage数据也很简单,清除浏览器缓存内容即可。
监听LocalStorage变化
LocalStorage是一个可以用作本地持久化存储的对象,我们可以向其中添加数据存储,同样它在用户操作的情况下发生变化时,我们也需要能监听到,当它发生变化时,会触发storage事件,我们可以在window上监听到这个事件,从而完成一些逻辑操作。
- window.addEventListener('storage', () => {
- ...
- });
- window.onstorage = () => {
- ...
- };
总结与结论
您可以根据您的使用情况选择LocalStorage与SessionStorage。如果您的应用程序需要在多个浏览器窗口和标签页中共享数据,请使用LocalStorage,否则请使用SessionStorage。
SessionStorage和LocalStorage都容易受到XSS攻击。因此,请避免将敏感数据存储在浏览器存储中。
最后,虽然WebStorage很好用,还是建议你在如下的情况下使用:
- 没有敏感数据
- 数据尺寸小于 5MB
- 高性能并不重要
如果有什么问题或补充,欢迎通过评论区留言告诉我。
SessionStorage、LocalStorage详解的更多相关文章
- cookie、sessionStorage、localStorage 详解
转自--http://www.cnblogs.com/fly_dragon/p/3946012.html cookie Cookie的大小.格式.存储数据格式等限制,网站应用如果想在浏览器端存储用户的 ...
- HTMl5的存储方式sessionStorage和localStorage详解
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage.sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有 ...
- LocalStorage、SessionStorage使用详解
https://blog.csdn.net/zhongzh86/article/details/55504381
- 前端数据存储方案集合(cookie localStorage等)以及详解 (二)
前端数据存储方案集合(cookie localStorage等)以及详解 (二) 在之前的文章中已经介绍到了 前端存储方案中的 cookie . 但是 cookie 的存储上限是 4KB. 如果超过了 ...
- JS 详解 Cookie、 LocalStorage 与 SessionStorage-转载
记录一下这些知识,有时候用到会忘记,对原文作者表达感谢. 附上原文链接:JS 详解 Cookie. LocalStorage 与 SessionStorage 基本概念 Cookie Cookie 是 ...
- cookie ,session 和localStorage的区别详解
2019独角兽企业重金招聘Python工程师标准>>> cookie ,session 和localStorage的区别详解 博客分类: js 当你在浏览网站的时候,WEB 服务器会 ...
- 详解vuex结合localstorage动态监听storage的变化
这篇文章主要介绍了详解vuex结合localstorage动态监听storage的变化,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 需求:不同组件间共用同一数据,当一个 ...
- android WebView详解,常见漏洞详解和安全源码
这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 转载请注明出处:http://blog.csdn.net/se ...
- html5的web存储详解
以前我们在本地存储数据都是用document.cookie来存储的,但是由于其的存储大小只有4K左右,解析也很复杂,给开发带来了诸多的不便.不过现在html5出了web的存储,弥补了cookie的不足 ...
随机推荐
- ubuntu 18.04下修改python3指向
起因 ubuntu18.04下默认带的是python3.6,但是因为需求需要升级为python3.7 步骤 安装 sudo apt install python3.7 修改环境变量 修改默认的pyth ...
- H5游戏定制,4大优势助力企业曝光10W+
H5游戏定制,4大优势助力企业曝光10W+ 移动互联网已成为了人们生活的一部分,普通广告形式已很难吸引用户的眼球,企业要怎样才能将广告更广泛的传播给更多用户呢?根据TOM游戏多年从业经验,为大家分享以 ...
- Roadblocks(POJ 3255)
原题如下: Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19314 Accepted: 6777 ...
- css常用属性之绝对定位、相对定位、滚动条属性、背景图属性、字体、鼠标、超链接跳转页面
1.绝对定位position: fixed(比如广告页面向下滑动的时候,页面最上方有个标题不能随之滑动,就需要用到position: fixed,同时还需要用到一个标签(标签高度很高才会出现滚动的情况 ...
- oracle之通过group by产生统计报告
通过group by产生统计报告 Oracle数据库中的ROLLUP配合group by命令使用,可以提供信息汇总功能(与"小计"相似)CUBE,也是GROUP BY子句的一种扩展 ...
- python之map
python之Map函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # map()函数使用举例 # 功能: ...
- VS调试出现解决 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题
- ctfhub sql注入 整数型注入
整数型注入 手工注入 1.查看是否存在sql注入,及sql注入类型 2.确定列数 3.确定注入点,以及数据库版本,数据库名称 4.查表名 5.查字段名以及flag值 获得flag值 sqlmap做法 ...
- 整理的网上的MySQL优化文章总结
MySQL优化 Linux优化 IO优化 调整Linux默认的IO调度算法. IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调 ...
- [Java核心技术]第九章-集合(Java集合框架、具体的集合、映射)
9.1Java集合框架 一些有的没的 可以使用接口类型存放集合的引用.一旦改变了想法,只需要在调用构造函数的地方做一处修改. add方法用于向集合添加元素,如果添加元素确实改变了集合就返回true. ...