[TOC]javascript
对于一个web开发者来讲,了解基本的http协议是必不可少的,只有基础扎的牢,才能在使用的时候游刃有余。html
对于学习我一直都是抱着刨根问底的态度,有人说学习一个东西很简单,有人说学习一个东西很难,刚好我属于后者,在个人大脑里面,学习与使用是两个不一样的层次,学习应该是包涵使用的。
(文章开头就说这么废话)java
这篇文章的主题是cookies,下面我来谈谈个人对cookies的认识。
cookies是http协议的一部分,它主要用来存储一些不多的数据,这些数据能够往来于客户端与服务器之间。
为何会有cookies这种东西存在,这要从http的特性谈起,起初http是一个无状态的协议(固然如今也是无状态的协议),之因此无状态是由于http是基于tcp的上传应用协议,它的一个主要特色就是用完即放,也就是客户端发起请求、服务器相应后tcp链接就断开了,这种模式决定了是http没法保存状态。 协议自己就是一种约定,为相同的场景约定出来一套规范,为将来可能的场景预测出来一套规范。 那么有了cookies后http就变得有状态了,能够说cookies是对http的扩展或者加强,比较经常使用的好比:保存用户的登录状态。虽然是对http的一种加强,可是也引入了一些安全问题,后面会谈到具体的安全隐患。 cookies是一种古老的技术,算然如今的浏览器提供了其它本地存储技术,但仍是不能彻底替代cookies,由于cookies是一种能够被服务器端控制的客户端存储技术,而无需咱们用javascript写额外的存储代码。
cookies中定义了几个关键属性来保证cookies的正常工做。
Expires、Max-Age:web
Domain、Path:浏览器
Domain用来指定该cookie能够被哪一个主机访问,若设置了该值一般包含其子域名;默认为当前文档的主机,不包含子域名。安全
Path:设置可被主机下的哪些路径访问,例如/docs与/docs/会匹配不一样的路径,前者包含子路劲,后者仅为当前路径服务器
SameSite:cookie
Secure、HttpOnly:asp.net
http中引入cookies虽然解决了状态的问题,但也引入了新的安全问题,如何才能保证cookies不被窃取。在我看来http是无安全可言的,咱们能作的不多,咱们努力尽可能防止客户端被攻破,但也只仅仅是稍微增长了一点破解难度而已。
下面列举两个常常遇到的安全问题:xss
xss攻击
跨站脚本攻击,经过设置HttpOnly来阻止客户端获取cookies
csrf
跨站请求伪造,被攻击的网站对于敏感的操做增长确认步骤。
//若是用户刚好登录example.com,此时若是在同一浏览器的其它站点无心中有如下图片代码,则就会被攻击。 <img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">