某些网站为了辨别用户身份,进行session跟踪而储存在本地终端上的数据,在现代浏览器中它的类型 cookie 有重要的作用, 可能最重要的就hi是权限 cookie 通过这种最常用的方法web服务器可以知道用户登陆登出,以及正在登陆的账号
cookie 的类型
-
Session Cookie 当关闭浏览器的时候它会被浏览器清除 (不设置 Expire 这个属性即可)
-
Persistent Cookie 持久型 如果 cookie设置 Max—Age 为一个月的话 那么这个月的Http请求都会携带这个 cookie, 所以它可以记录用户初始化或者自定义的信息 比如什么时候第一次登陆以及弱登陆状态
-
Secure Cookie
https cookie 以确保cookie 在客户端传递到sever过程中始终加密
-
HttpOnly Cookie
只在Http Https 显示 cookie 不能在客户端通过脚本获取
-
3rd-party Cookie
第一方cookie是cookie种植在浏览器的域名或者子域名的,第三方则是种植在不同于浏览器地址栏下的域名下, 例如 用户访问a.com时 在ad.google.com 设置一个cookie 在访问b.com 的时候 也在ad.google.com
种植一个cookie 这个场景经常出现在广告商,广告商就可以采集用户的一些习惯和访问记录
-
Super Cookie
通常情况下 a.b.com的cookie可以设在a.b.com 和 b.com 上面 不能设置在 .com上面
-
Zombie Cookie
僵尸cookie 指删不掉的cookie 当用户删除cookie后,会自动从本地其他地方读取备份的cookie并重新种植
session 管理
由于http协议是无状态的协议,所以服务端需要记录用户的状态时,就需要某种机制来识别具体用户,这个机制就是拿Session。典型的案例就比如购物车
另一个用法就是登陆站点。当用户访问站点的登陆页面,服务器通常会给客户端发送一个包含唯一session id的cookie。 当用户成功登陆后,服务端记住那个特殊的session id已经被授权了,然后授权用户访问它的服务。
由于session cookie 只包含一个session id 这样站点为每一个用户保存的个人信息几乎没有限制了,session cookie需要的带宽也小 有利于提升加载速度
个性化
cookie可以用来记录用户信息,然后展示相关内容给用户。例如,web服务器可能会发送一个包含用户上次登录站点使用的用户名的cookie, 这样客户端在用户下次登录的时候,可以利用这个cookie中的信息填充相关页面。
许多站点是利用用户的偏好来做个性化。用户在页面表单选择偏好,然后把表单提交给服务端。服务端把这些偏好编码到cookie中, 然后把cookie发给浏览器。这种方式在用户每次访问站点网页时,服务端可以根据用户偏好个性化页面展示。 例如google搜索引擎利用cookie允许用户选择在搜索结果页面一次可以看到多少个搜索结果。
追踪
追踪cookie被用来追踪用户的页面浏览习惯。这个作用在一定程度上也可以用请求页面的IP地址或者HTTP请求头中的referer字段来实现, 但是使用cookie可以记录的更精确。下面两点可以证明:
1.如果用户请求一个站点的页面,但是请求不包含cookie,服务端假定是用户第一次访问这个页面。 所以服务端创建了一个唯一的标识符(通常是一串随机字母和数字),然后随请求页面把cookie发给浏览器。
2.从现在开始,这个站点每次新页面访问时,浏览器都会把cookie发给服务端。服务端正常返回页面, 但是会在一个日志文件中存储页面的url,请求的日期以及cookie。
通过分析这个日志文件,可以找出用户访问了那个页面,访问频次以及访问多长时间。
公司通过追踪cookie利用用户的网络习惯搜集用户的购买习惯信息。
实现
cookie 是任意的数据快, 通常由服务端先发送(也可以客户端发送给服务端)然后由浏览器存在客户端。浏览器会在每一个请求中的请求头携带cookie。
可以最多支持4096哥字节的长度 每一个域最少可以支持50个cookie 总共可以支持最少3000个cookie
cookie 窃取和 session 劫持
javascript:alert(document.cookie); // 拿到cookie Session对于web应用来说无疑是最重要的,也是最复杂的,对于web应用来说,加强安全性的第一条原则就是——不要信任客户端的数据, 一定要对客户端的数据进行 数据验证以及过滤,才能在程序中引用,进行保存至数据层, 然而,为了维持来自同一个用户的不同请求之间的状态,客户端必须要给服务端发送一个唯一的身份标识符(Session ID) 很显然这是和前面提到的安全原则是矛盾的,但是别无办法,因为http是无状态的, web应用中最脆弱的环节就是session,session是web应用程序中最需要加强安全性的环节。
HTTP 基本原理
Web 内容都是存储在Web服务器上面的,Web服务使用的是一种HTTP协议,因此也被称做HTTP服务器, 这些HTTP服务器存储了因特网中的数据,如果HTTP 客户端发出请求的话,它们会提供数据。 客户端向服务器发送HTTP 请求,服务器会在HTTP 响应中回送所请求的数据,HTTP 客户端(比如浏览器)和HTTP服务器共同构成了万维网的基本组件。
MIME (Multipurpose Internet Mail Extension)多用途因特网邮件扩展
因特网有数千种不同的数据类型,HTTP 仔细的给每种要通过web传输的对象标记MIME类型(MIME type)的数据格式标签, 最先开始MIME是为了解决不同邮件系统之间搬移报文时存在的问题,所以HTTP就采纳了这个方法,用来标记多媒体内容
在HTTP报文中 content-type: image/svg+xml
- HTML 格式的文本文档由 text/html 类型
- 普通的 ASCII 文本文档由 text/plain 类型
- JPEG 格式 格式的图片 image/jpeg 类型
- GIF 格式的图片为 image/gif 类型
developer.mozilla.org/zh-CN/docs/… MIME的类型值, 有数百种
网络地址的基本信息
每个Web 服务器资源都有一个名字,服务器资源名称被称为统一资源标识符(URL)URL就像因特网上的邮政地址一样, 在世界范围内唯一标识并定位信息资源
统一资源定位符(URI)是资源标识符最常见的形式。URL 描述了一台特定服务器上某台资源的特定位置, 它可以明确说明如何从一个精确,固定的位置获取资源
大部分URL都遵循一种标准格式,这包含三个部分
- URL的第一部分被称为方案(scheme)说明了访问资源所使用的协议,这部分通常就是HTTP协议(http://)
- 第二部分给出服务器的因特网地址
- 其余部分指定服务器上的某个位置,现在几乎所有的URI都是URL
HTTP 请求的事务逻辑
一个HTTP事务由一条(从客户端发往服务器的)请求命令和一个(服务器发挥客户端的)响应结构组成。 这种通信时通过名为HTTP报文(HTTP message)的格式化数据进行的
HTTP 报文是由一行行的简单字符串组成,从web客户端发往web服务器的HTTP报文称为请求报文
从服务器发往客户端的报文称为响应报文
请求报文
GET /test/hi-there.txt HTTP/1.0 // 起始行
Accept: text/* // 首部
Accept-Language: en,fr // 主体
响应报文
HTTP/1.0 200 OK // 起始行
Content-type: text/plain // 首部
Content-length: 19
HI! T'm a Meassage // 主体
HTTP 报文包括三个部分
-
起始行
报文的第一行就是起始行,在请求报文中用来说明要做什么,在响应报文中说明出现了什么情况
-
首部字段
起始行后面有个零或多个首部字段。每一个首部字段都包含一个名字和一个值,为了便于解析, 两者之间用冒号 ( : ) 来分割。首部以一个空行结束,添加一个首部字段和添加新艺航一样简单
-
主体
空行之后就是可选的报文主体了, 其中包含了所有类型的数据。
请求主体中包含了要发送给web服务器的数据;
响应主体中装载了要返回给客户端的数据
起始行和首部都是文本形式而且都是结构化的,而主体不同,主体可以包含二进制数据(html,图片,视频,软件等)
HTTP 请求的事务逻辑之连接
HTTP 是一个应用层协议,HTTP 无需操心网络通信的具体细节,它把互联网的细节都交给了通用可靠的因特网传输协议TCP/IP。 只需要建立TCP连接,客户端和服务器之间的报文交换就不会丢失,不会破坏,也不会接受是出现顺序错误
TCP提供了
- 无差错的数据传输
- 按序传输(数据总是会按照发送到顺序到达)
- 未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)
在HTTP 客户端向服务器发送报文之前,需要使用网际协议(IP)地址和端口号在客户端和服务器之间建立一个TCP/IP连接
步骤如下:
- 浏览器从URL中解析出服务器的主机名
- 浏览器将服务器的主机名转换为服务器的IP地址
- 浏览器将端口号(如果有的话)从URl中解析出来
- 浏览器建立一条与web 服务器的TCP连接
- 浏览器向服务器发送一条HTTP 请求报文
- 服务器向客户端回送一条HTTP 响应报文
- 关闭连接,浏览器显示文档
TCP/IP 的三次握手四次挥手
客户端服务端通信前要进行连接,“三次握手”的作用就是双方都能明确自己和对方的收发是正常的
TCP/IP 的四次挥手
当客户端与服务端关闭一个连接通道时,同样需要双方的确认才行,这个确认的过程需要四个步骤, 与建立连接只能是客户端向服务端发送不同,关闭连接可以由任意一方发起
补充知识点:
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.
SYN:表示建立连接
FIN:表示关闭连接
ACK:表示响应
PSH:表示由DATA数据传输
PST:表示连接重置
HTTP 请求的事务逻辑之常见业务结构组件
代理位于客户端和服务器之间,接受所有客户端的HTTP请求,并将这些请求转发给服务器(可以对这些请求进行修改之后才转发)最常见的有VPN
Web缓存(Web cache)或者代理缓存(proxy cache)是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来。 下一个请求同一个文档的客户端就可以享受缓存的私有副本所提供的服务(浏览器缓存)
网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将HTTP流量转换成其他协议。 网关接受时就好像自己时资源的源服务器一样。客户端可能并不知道自己正在与一个网关进行通信
例如:一个HTTP/FTP网关会通过HTTP请求接受到FTP URI请求,但通过FTP协议来获取文档,得到的文档会被封装成一条HTTP报文发送给客户端
隧道(tunnel)是建立起来之后,就会在两条连接之间对原数据进行盲转发(只负责转发数据)的HTTP应用程序。 HTTP隧道通常用来一条或者多条HTTP连接上转发非HTTP数据,转发时不会窥探数据