chenqunfeng / Blog

个人技术记录博客
6 stars 1 forks source link

Cookie、Session、WebStorage #10

Open chenqunfeng opened 6 years ago

chenqunfeng commented 6 years ago

Cookie

cookie存放在客户端,一般存放在硬盘中。 cookie内容主要包含:名字,值,过期时间,域,路径,secure(设置为true的话,表示该cookie只会在https协议下进行传输),httponly,SameSite(chrome51之后的特性,有Strict和Lax模式)。最大大小为4KB。 其中过期时间表示cookie的作用有效时间,若不设置该时间,则该cookie为会话cookie,不存放在硬盘中而是存放在内存中,表示其生命周期为浏览器会话期间,关闭浏览器该cookie也会消失。 其中域和路径表示cookie的作用范围。

cookie隔离

因为cookie的域和路径表示其作用范围,所以当我们的静态资源都是存放在其作用范围内时,在传输过程中都会带上该cookie;为了降低传输成本和服务器压力,我们可以把静态资源存放在作用范围之外,例如使用CDN。

cookie防篡改

因为cookie是可以轻易被篡改的,从而会造成冒名顶替的问题。虽然设置cookie的httponly为true可以在一定程度上保证cookie的安全,但是并不是万能的,黑客只要不通过http来获取cookie而是通过抓包便没有办法了。为了处理这个问题,我们可以通过MD5加密cookie内容+密钥来生成一段签名,例如将要传输的是username=cqf,那么我们可以在其后带上签名内容username=cqf|signature,服务器收到cookie后先根据内容+密钥来生成签名验证签名是否准确,以防止cookie篡改。

Session

session存放在服务器,类似散列表的格式,每个session都通过一个sessionID对应一个cookie。 客户端发起请求时,会带上sessionID,若没有sessionID,则服务端会新建一个sessionID并在响应中返回。

session存放位置

一般session有几个常用的存放位置:内存、MongoDB、redis。 其中,内存不是一种持久化的方案,只要程序重启便会消失,而且当session量变大以后也会消耗内存,所以一般都不会使用这种方案;而MongoDB和redis都是DB方面的持久化的方案,不过在应用方面更多会选择redis。

WebStorage

WebStorage指的是html5提出的localStorage和sessionStorage,都是存放在客户端,大小一般为5M左右。

localStorage

是本地持久化存储,只要不手动清除,则会一直存在。其存储结果虽然为字符串,但是也可以通过JSON的转化为Object或Array来使用。

sessionStorage

是会话存储,顾名思义,当会话结束时,便会清除,具体的清除时机为浏览器关闭的时机,也即会话结束。其存储结果虽然为字符串,但是也可以通过JSON的转化为Object或Array来使用。