在之前常常用到的cookie
、session
,但在H5中新引入了新的浏览器本地缓存方案。由于你们使用的不太规范用来做为本地储存工具,在下次请求时会默认带上cookie
中的数据致使浪费性能和流量。javascript
下面就从开始介绍为何产生的cookie
,它的出现是为了解决什么问题,它有什么问题;后面localStorage
是为何产生,它又解决了那部分的问题。最后是cookie
、session
、localStorage
、sessionStorage
之间的对比。php
首先了解为何会产生cookie
?cookie
是什么?html
在HTTP
请求创建链接时,有一个客户端、服务端它们两个之间创建的链接。可是HTTP
协议每次创建链接都是独立,也能够说是HTTP
协议是无状态的链接。java
简单总结一下就是,由于HTTP
协议是无状态的因此客户端须要一个cookie
来储存起来。web
HTTP Cookie
(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。面试
Cookie
主要用于如下三个方面:数据库
当服务器收到HTTP
请求时,服务器能够在响应头里面添加一个Set-Cookie
选项。浏览器收到响应后一般会保存下Cookie
,以后对该服务器每一次请求中都经过Cookie
请求头部将Cookie
信息发送给服务器。编程
在建立Cookie
是能够设置不少属性,如Expires
、Max-Age
、Domain
、Path
、Secure
、HttpOnly
,由于它会自动携带到服务器端,同时又支持服务器端设置。因此有不少的方面要注意,好比时效性、做用域、安全性。下面就从这三个方面来解释他属性的做用。跨域
若是在Set-Cookie
时不经过Expries
、Max-Age
两个字段设置Cookie
的时效性,那么这个Cookie
是一个简单的会话期Cookie。它在关闭浏览器是会被自动删除。浏览器
若是设置了Expries
、Max-Age
那么这个Cookie
在指定时间内都是有效的。
提示:当Cookie的过时时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。
Domain
和 Path
标识定义了Cookie
的做用域:即Cookie
应该发送给哪些URL
。
Domain
标识指定了哪些主机能够接受Cookie
。若是不指定,默认为当前文档的主机(不包含子域名)。若是指定了Domain
,则通常包含子域名。
Path
标识指定了主机下的哪些路径能够接受Cookie
(该URL路径必须存在于请求URL中)。以字符 %x2F ("/") 做为路径分隔符,子路径也会被匹配。
标记为 Secure
的Cookie
只应经过被HTTPS
协议加密过的请求发送给服务端。但即使设置了 Secure
标记,敏感信息也不该该经过Cookie
传输,由于Cookie
有其固有的不安全性,Secure
标记也没法提供确实的安全保障。
从 Chrome 52 和 Firefox 52 开始,不安全的站点(http:)没法使用Cookie的 Secure 标记。
为避免跨域脚本 (XSS) 攻击,经过JavaScript的 Document.cookie
API没法访问带有 HttpOnly
标记的Cookie
,它们只应该发送给服务端。
经过Document.cookie
属性可建立新的Cookie
,也可经过该属性访问非HttpOnly
标记的Cookie
。
documnet.cookie
// 这里就很少作赘述,有一篇文章专门讲解了
复制代码
优势
弊端
Cookie
会被附加在每一个HTTP
请求中,因此无形中增长了流量
Cookie
可能被禁用。当用户很是注重我的隐私保护时,他极可能禁用浏览器的Cookie
功能;
因为在HTTP
请求中的Cookie
是明文传递的,潜在的安全风险,Cookie
可能会被篡改
Cookie
数量和长度的限制。每一个域名(Domain)下 IE6或IE6-(IE6如下版本):最多20个cookie IE7或IE7+(IE7以上版本):最多50个cookie FF:最多50个cookie Opera:最多30个cookie Chrome和safari没有硬性限制 当超过单个域名限制以后,再设置cookie,浏览器就会清除之前设置的cookie。IE和Opera会清理近期最少使用的cookie,FF会随机清理cookie;
每一个Cookie
长度不能超过4KB
Cookie
面临什么样的安全问题,常见的xss、csrf等等下面开始。
xss 和 防护xss
若是在服务器端Set-Cookie
时没有设置HttpOnly=true
时,在浏览器端就能够经过document.cookie
来读取和修改Cookie
中的值,这是十分安全的会形成xss
。当Cookie
中有关键性信息是要设置HttpOnly=true
。
防止中间人劫持 和 中间人劫持
大体的分布图是:
DNS
<----->
用户 中间人 外网
<----->
HTTP
复制代码
当使用HTTPS
协议和购买正规的CA证书
时,即便中间人劫持也没法解密。而且在Set-Cookie
设置Secure=true
时Cookie
只应经过被HTTPS
协议加密过的请求发送给服务端。
csrf 和 csrf防护
CSRF: 跨站请求伪造(CSRF)
是一种冒充受信任用户,向服务器发送非预期请求的攻击方式。
例如,这些非预期请求多是经过在跳转连接后的 URL 中加入恶意参数来完成:
<img src="https://www.example.com/index.php?action=delete&id=123">
复制代码
对于在 https://www.example.com
有权限的用户,这个 <img>
标签会在他们根本注意不到的状况下对 https://www.example.com
执行这个操做,即便这个标签根本不在 https://www.example.com
内亦可。
SameSite Cookie
容许服务器要求某个cookie
在跨站请求时不会被发送,从而能够阻止跨站请求伪造攻击(CSRF)
。但目前SameSite Cookie
还处于实验阶段,并非全部浏览器都支持。
strict
:浏览器在任何跨域请求中都不会携带Cookie
,这样能够有效的防护CSRF
攻击,可是对于有多个子域名的网站采用主域名存储用户登陆信息的场景,每一个子域名都须要用户从新登陆,形成用户体验很是的差。lax
:相比较strict
,它容许从三方网站跳转过来的时候使用Cookie
。其余防护
cookie
有效期时间cookie
是明文,服务器端生成密钥验证cookie
发送给服务器端flash编程安全
,审核flash代码
,尽可能不要用flash
用最新的视频vedio
+ https
+ socket
或者动画到此cookie
的产生缘由、做用、特色/缺点、安全问题。
session是什么? Session
是一种记录客户状态的机制,不一样于Cookie
的是Cookie
保存在客户端浏览器中,而Session保存在服务器上。避免了在客户端Cookie
中存储敏感数据。
Session
从字面意思上能够理解为会话,谁与谁的会话呢?实际上是客户端浏览器与服务器之间一系列交互的动做称为一个 Session。
建立Session(java)
Session
在服务器端程序运行的过程当中建立的,不一样语言实现的应用程序有不一样建立Session
的方法, 在Java
中是经过调用HttpServletRequest
的getSession
方法(使用true做为参数)建立的。 建立Session
的同时,服务器会为该Session
生成惟一的session id
, 这个session id
在随后的请求中会被用来从新得到已经建立的Session
。Session
被建立以后,就能够调用Session
相关的方法往Session
中增长内容了, 而这些内容只会保存在服务器中,发到客户端的只有session id
session id
带上, 服务器接受到请求以后就会依据session id
找到相应的Session
,从而再次使用Session
。Session
保存在服务器端。为了得到更高的存取速度,服务器通常把Session
放在内存中。 每一个用户都会有一个独立的Session
。 若是Session
内容过于复杂,当大量客户访问服务器时可能会致使内存溢出。 所以,Session
里的信息应该尽可能精简。
Session
在用户第一次访问服务器的时候自动建立。 须要注意只有访问JSP、Servlet
等程序时才会建立Session
, 只访问HTML、IMAGE
等静态资源并不会建立Session
。 若是还没有生成Session
,也可使用request.getSession(true)
强制生成Session
。
Session
生成后,只要用户继续访问,服务器就会更新Session
的最后访问时间,并维护该Session
。 用户每访问服务器一次,不管是否读写Session
,服务器都认为该用户的Session"活跃(active)"了一次
。
因为会有愈来愈多的用户访问服务器,所以Session
也会愈来愈多。 为防止内存溢出,服务器会把长时间内没有活跃的Session
从内存删除。 这个时间就是Session
的超时时间。若是超过了超时时间没访问过服务器,Session
就自动失效了。
Session
的超时时间为maxInactiveInterval
属性, 能够经过对应的getMaxInactiveInterval()
获取,经过setMaxInactiveInterval(longinterval)
修改。
Session
的超时时间也能够在web.xml
中修改。 另外,经过调用Session
的invalidate()
方法可使Session
失效。
三种方法让Session
失效:
session自杀
: 调用session.invalidate()
方法能够当即杀死session
;web.xml
文件中的 <session-timeout> 30 </session-timeout>
修改这是默认值(默认30分钟),是以分为单位。在几年前看不少网上的资料时有的会说session
会在浏览器关闭时会失效。为何会失效?怎么能让它不失效?
为何会失效?
下面梳理一下session
为何会在浏览器关闭时失效,其实这样说并不许确:
session
,而且把sessionid
经过set-cookie
发送给浏览器cookie
sessionid
,经过sessionid
找到对应的session
信息cookie
会被清空session
为null
,服务端就会认为当前用户是一个新的用户,从新登陆或者直接设置新的sessionid
上面也就是为何会说session
会在浏览器关闭时会失效。
怎么能让它不失效?
在Set-Cookie
时设置Expries
或Max-Age
,其实就是设置Cookie
的失效时间。 或者直接把Sessionid
储存在本地。
Web Storage API提供机制, 使浏览器能以一种比使用Cookie
更直观的方式存储键/值对。
Web Storage 包含以下两种机制:
sessionStorage
为每个给定的源(given origin)维持一个独立的存储区域,该存储区域在页面会话期间可用(即只要浏览器处于打开状态,包括页面从新加载和恢复)。localStorage
一样的功能,可是在浏览器关闭,而后从新打开后数据仍然存在。应注意,不管数据存储在 localStorage 仍是 sessionStorage ,它们都特定于页面的协议。
只读的localStorage
属性容许你访问一个Document
源(origin
)的对象 Storage
;存储的数据将保存在浏览器会话中。存储在 localStorage
的数据能够长期保留。
sessionStorage
属性容许你访问一个 session Storage
对象。存储在 sessionStorage
里面的数据在页面会话结束时会被清除。页面会话在浏览器打开期间一直保持,而且从新加载或恢复页面仍会保持原来的页面会话。在新标签或窗口打开一个页面时会在顶级浏览上下文中初始化一个新的会话,这点和 session cookies 的运行方式不一样。
存储在 localStorage
的数据能够长期保留,而存储在 sessionStorage
里面的数据在页面会话结束时会被清除。
session
和cookie
的区别:
session
储存在服务端,cookie
储存在客户端session
比cookie
更安全,由于session
储存在服务端session
是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据能够保存在集群、数据库、文件中。cookie
是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现session
的一种方式。web storage
和cookie
的区别:
web storages
和cookie
的做用不一样,web storage
是用于本地大容量存储数据(web storage
的存储量大到5MB);而cookie
是用于客户端和服务端间的信息传递;web storage
有setItem
、getItem
、removeItem
、clear
等方法,cookie
须要咱们本身来封装setCookie
、getCookie
、removeCookie